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); } }
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; }