From d8651420ccfddf84e3822f027c6f3a81ce02dbbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Tue, 1 Apr 2025 17:07:53 -0300 Subject: [PATCH] fix parameter/return checking --- src/common/scripting/vm/vm.h | 16 ++++++------- src/common/scripting/vm/vmframe.cpp | 36 ++++++++++++++--------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/common/scripting/vm/vm.h b/src/common/scripting/vm/vm.h index 727c8c3623..6f6176f280 100644 --- a/src/common/scripting/vm/vm.h +++ b/src/common/scripting/vm/vm.h @@ -545,7 +545,7 @@ void VMCheckParamCount(VMFunction* func, int argcount) { return VMCheckParamCoun // The type can't be mapped to ZScript automatically: template void VMCheckParam(VMFunction* func, int index) = delete; -template void VMCheckReturn(VMFunction* func) = delete; +template void VMCheckReturn(VMFunction* func, int index) = delete; // Native types we support converting to/from: @@ -554,12 +554,12 @@ template<> void VMCheckParam(VMFunction* func, int index); template<> void VMCheckParam(VMFunction* func, int index); template<> void VMCheckParam(VMFunction* func, int index); -template<> void VMCheckReturn(VMFunction* func); -template<> void VMCheckReturn(VMFunction* func); -template<> void VMCheckReturn(VMFunction* func); -template<> void VMCheckReturn(VMFunction* func); -template<> void VMCheckReturn(VMFunction* func); -template<> void VMCheckReturn(VMFunction* func); +template<> void VMCheckReturn(VMFunction* func, int index); +template<> void VMCheckReturn(VMFunction* func, int index); +template<> void VMCheckReturn(VMFunction* func, int index); +template<> void VMCheckReturn(VMFunction* func, int index); +template<> void VMCheckReturn(VMFunction* func, int index); +template<> void VMCheckReturn(VMFunction* func, int index); template struct vm_decay_pointer_object @@ -591,7 +591,7 @@ template void VMValidateSignatureSingle(VMFunction* func, std::index_sequence) { VMCheckParamCount(func, sizeof...(Args)); - VMCheckReturn>(func); + VMCheckReturn>(func, 0); (VMCheckParam>(func, I), ...); } diff --git a/src/common/scripting/vm/vmframe.cpp b/src/common/scripting/vm/vmframe.cpp index e04c6f0d75..40b3dbef8c 100644 --- a/src/common/scripting/vm/vmframe.cpp +++ b/src/common/scripting/vm/vmframe.cpp @@ -566,53 +566,53 @@ void VMCheckParamCount(VMFunction* func, int retcount, int argcount) template<> void VMCheckParam(VMFunction* func, int index) { if (!func->Proto->ArgumentTypes[index]->isIntCompatible()) - I_FatalError("%s argument %d is not an integer", func->PrintableName); + I_FatalError("%s argument %d is not an integer", func->PrintableName, index); } template<> void VMCheckParam(VMFunction* func, int index) { if (func->Proto->ArgumentTypes[index] != TypeFloat64) - I_FatalError("%s argument %d is not a double", func->PrintableName); + I_FatalError("%s argument %d is not a double", func->PrintableName, index); } template<> void VMCheckParam(VMFunction* func, int index) { if (func->Proto->ArgumentTypes[index] != TypeString) - I_FatalError("%s argument %d is not a string", func->PrintableName); + I_FatalError("%s argument %d is not a string", func->PrintableName, index); } template<> void VMCheckParam(VMFunction* func, int index) { - if (func->Proto->ArgumentTypes[index]->isObjectPointer()) - I_FatalError("%s argument %d is not an object", func->PrintableName); + if (!func->Proto->ArgumentTypes[index]->isObjectPointer()) + I_FatalError("%s argument %d is not an object", func->PrintableName, index); } -template<> void VMCheckReturn(VMFunction* func) +template<> void VMCheckReturn(VMFunction* func, int index) { } -template<> void VMCheckReturn(VMFunction* func) +template<> void VMCheckReturn(VMFunction* func, int index) { - if (!func->Proto->ReturnTypes[0]->isIntCompatible()) - I_FatalError("%s return value %d is not an integer", func->PrintableName); + if (!func->Proto->ReturnTypes[index]->isIntCompatible()) + I_FatalError("%s return value %d is not an integer", func->PrintableName, index); } -template<> void VMCheckReturn(VMFunction* func) +template<> void VMCheckReturn(VMFunction* func, int index) { - if (func->Proto->ReturnTypes[0] != TypeFloat64) - I_FatalError("%s return value %d is not a double", func->PrintableName); + if (func->Proto->ReturnTypes[index] != TypeFloat64) + I_FatalError("%s return value %d is not a double", func->PrintableName, index); } -template<> void VMCheckReturn(VMFunction* func) +template<> void VMCheckReturn(VMFunction* func, int index) { - if (func->Proto->ReturnTypes[0] != TypeString) - I_FatalError("%s return value %d is not a string", func->PrintableName); + if (func->Proto->ReturnTypes[index] != TypeString) + I_FatalError("%s return value %d is not a string", func->PrintableName, index); } -template<> void VMCheckReturn(VMFunction* func) +template<> void VMCheckReturn(VMFunction* func, int index) { - if (func->Proto->ReturnTypes[0]->isObjectPointer()) - I_FatalError("%s return value %d is not an object", func->PrintableName); + if (!func->Proto->ReturnTypes[index]->isObjectPointer()) + I_FatalError("%s return value %d is not an object", func->PrintableName, index); } void VMCallCheckResult(VMFunction* func, VMValue* params, int numparams, VMReturn* results, int numresults)