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