示例#1
0
AValue InstanceOf::gen(AstContext &astContext) {
	AValue v = expr->codeGen(astContext);
	ClassInfo *destClass = typeDecl->getClassInfo();
	if (v.clazz == nilClass
			&& (destClass->isObjectType() || destClass->isArrayType())) {
		return AValue(bool_true, boolClass);
	} else if (v.clazz->isSubClassOf(destClass)) {
		return AValue(bool_true, boolClass);
	} else if (destClass->isObjectType() && v.isObject()) {
		Value *res = builder.CreateCall2(sysInstanceOf, v.llvmValue,
				destClass->info);
		res = builder.CreateTrunc(res, boolType);
		return AValue(res, boolClass);
	} else {
		return AValue(bool_false, boolClass);
	}
}
示例#2
0
AValue DynamicCast::gen(AstContext &astContext) {
	ClassInfo *destClass = typeDecl->getClassInfo();
	AValue v = expr->codeGen(astContext);
	if (v.castTo(destClass)) {
		return v;
	} else if (v.isObject() && destClass->isObjectType()) {
		v.llvmValue = builder.CreateCall2(sysDynamicCast, v.llvmValue,
				destClass->info);
		v.clazz = destClass;
		return v;
	} else {
		errorMsg = "no viable conversion from '" + v.clazz->name + "' to '"
				+ destClass->name + "'";
		throwError(expr);
	}
	return v;
}