From 022228d8a94e295a16a39051a4ed1b342c6c18ef Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 17 Nov 2016 19:30:30 +0100 Subject: [PATCH] - fixed code generation of class type cast for local variables. --- src/scripting/codegeneration/codegen.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/scripting/codegeneration/codegen.cpp b/src/scripting/codegeneration/codegen.cpp index f7eadbe90..0c559e850 100644 --- a/src/scripting/codegeneration/codegen.cpp +++ b/src/scripting/codegeneration/codegen.cpp @@ -3884,7 +3884,6 @@ int BuiltinTypeCheck(VMFrameStack *stack, VMValue *param, TArray &defau ExpEmit FxTypeCheck::Emit(VMFunctionBuilder *build) { - ExpEmit out(build, REGT_INT); EmitParameter(build, left, ScriptPosition); EmitParameter(build, right, ScriptPosition); @@ -3905,6 +3904,7 @@ ExpEmit FxTypeCheck::Emit(VMFunctionBuilder *build) return call; } + ExpEmit out(build, REGT_INT); build->Emit(OP_RESULT, 0, REGT_INT, out.RegNum); return out; } @@ -3963,11 +3963,13 @@ FxExpression *FxDynamicCast::Resolve(FCompileContext& ctx) ExpEmit FxDynamicCast::Emit(VMFunctionBuilder *build) { - ExpEmit out = expr->Emit(build); + ExpEmit in = expr->Emit(build); + ExpEmit out = in.Fixed ? ExpEmit(build, in.RegType) : in; ExpEmit check(build, REGT_INT); assert(out.RegType == REGT_POINTER); - build->Emit(OP_PARAM, 0, REGT_POINTER, out.RegNum); + if (in.Fixed) build->Emit(OP_MOVEA, out.RegNum, in.RegNum); + build->Emit(OP_PARAM, 0, REGT_POINTER, in.RegNum); build->Emit(OP_PARAM, 0, REGT_POINTER | REGT_KONST, build->GetConstantAddress(CastType, ATAG_OBJECT)); PSymbol *sym = FindBuiltinFunction(NAME_BuiltinTypeCheck, BuiltinTypeCheck);