From bdeb2338498840918cb581e8d1ab47235af3ca5c Mon Sep 17 00:00:00 2001 From: Leonard2 Date: Mon, 4 Jul 2016 19:54:26 +0200 Subject: [PATCH] Fixed: conditionals didn't properly compile to vm code --- src/thingdef/thingdef_expression.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/thingdef/thingdef_expression.cpp b/src/thingdef/thingdef_expression.cpp index 463156d7f..b4a0b3fda 100644 --- a/src/thingdef/thingdef_expression.cpp +++ b/src/thingdef/thingdef_expression.cpp @@ -1838,6 +1838,7 @@ FxExpression *FxConditional::Resolve(FCompileContext& ctx) ExpEmit FxConditional::Emit(VMFunctionBuilder *build) { + size_t truejump, falsejump; ExpEmit out; // The true and false expressions ought to be assigned to the @@ -1848,7 +1849,7 @@ ExpEmit FxConditional::Emit(VMFunctionBuilder *build) // Test condition. build->Emit(OP_EQ_K, 1, cond.RegNum, build->GetConstantInt(0)); - size_t patchspot = build->Emit(OP_JMP, 0); + falsejump = build->Emit(OP_JMP, 0); // Evaluate true expression. if (truex->isConstant() && truex->ValueType->GetRegType() == REGT_INT) @@ -1872,9 +1873,11 @@ ExpEmit FxConditional::Emit(VMFunctionBuilder *build) out = trueop; } } + // Make sure to skip the false path. + truejump = build->Emit(OP_JMP, 0); // Evaluate false expression. - build->BackpatchToHere(patchspot); + build->BackpatchToHere(falsejump); if (falsex->isConstant() && falsex->ValueType->GetRegType() == REGT_INT) { build->EmitLoadInt(out.RegNum, static_cast(falsex)->GetValue().GetInt()); @@ -1904,6 +1907,7 @@ ExpEmit FxConditional::Emit(VMFunctionBuilder *build) } } } + build->BackpatchToHere(truejump); return out; }