From 4dc97a6ed02f2c24fe073186a0f14b2544f1c5ac Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 29 Oct 2016 13:42:37 +0200 Subject: [PATCH] - fixed register allocation for vector arguments to script functions. - handle 2D and 3D vectors in SetReturn. --- src/scripting/vm/vm.h | 6 ++++++ src/scripting/vm/vmbuilder.cpp | 2 +- src/scripting/vm/vmexec.h | 6 +++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/scripting/vm/vm.h b/src/scripting/vm/vm.h index 4eb055e6e..5e8a4c2a4 100644 --- a/src/scripting/vm/vm.h +++ b/src/scripting/vm/vm.h @@ -296,6 +296,12 @@ struct VMReturn ((double *)Location)[1] = val[1]; ((double *)Location)[2] = val[2]; } + void SetVector2(const double val[2]) + { + //assert(RegType == REGT_FLOAT); + ((double *)Location)[0] = val[0]; + ((double *)Location)[1] = val[1]; + } void SetString(const FString &val) { assert(RegType == REGT_STRING); diff --git a/src/scripting/vm/vmbuilder.cpp b/src/scripting/vm/vmbuilder.cpp index 912b95861..3f6d1cbd3 100644 --- a/src/scripting/vm/vmbuilder.cpp +++ b/src/scripting/vm/vmbuilder.cpp @@ -702,7 +702,7 @@ void FFunctionBuildList::Build() auto flags = item.Func->Variants[0].ArgFlags[i]; // this won't get resolved and won't get emitted. It is only needed so that the code generator can retrieve the necessary info about this argument to do its work. auto local = new FxLocalVariableDeclaration(type, name, nullptr, flags, FScriptPosition()); - local->RegNum = buildit.Registers[type->GetRegType()].Get(1); + local->RegNum = buildit.Registers[type->GetRegType()].Get(type->GetRegCount()); ctx.FunctionArgs.Push(local); } diff --git a/src/scripting/vm/vmexec.h b/src/scripting/vm/vmexec.h index 9162ca996..4b43ed815 100644 --- a/src/scripting/vm/vmexec.h +++ b/src/scripting/vm/vmexec.h @@ -1808,10 +1808,14 @@ static void SetReturn(const VMRegisters ®, VMFrame *frame, VMReturn *ret, VM_ assert(regnum + ((regtype & REGT_KONST) ? 2u : 0u) < frame->NumRegF); src = ®.f[regnum]; } - if (regtype & REGT_MULTIREG) + if (regtype & REGT_MULTIREG3) { ret->SetVector((double *)src); } + else if (regtype & REGT_MULTIREG2) + { + ret->SetVector2((double *)src); + } else { ret->SetFloat(*(double *)src);