- added validation of LevelCompatibility.Apply() signature

# Conflicts:
#	src/compatibility.cpp
This commit is contained in:
alexey.lysiuk 2019-07-03 13:11:48 +03:00 committed by drfrag
parent ce0b4b1ead
commit f340d411c3

View file

@ -56,6 +56,7 @@
#include "g_levellocals.h" #include "g_levellocals.h"
#include "vm.h" #include "vm.h"
#include "actor.h" #include "actor.h"
#include "types.h"
// MACROS ------------------------------------------------------------------ // MACROS ------------------------------------------------------------------
@ -356,13 +357,23 @@ void SetCompatibilityParams(FName checksum)
if (cls->IsDescendantOf(RUNTIME_CLASS(DLevelCompatibility))) if (cls->IsDescendantOf(RUNTIME_CLASS(DLevelCompatibility)))
{ {
PFunction *const func = dyn_cast<PFunction>(cls->FindSymbol("Apply", false)); PFunction *const func = dyn_cast<PFunction>(cls->FindSymbol("Apply", false));
if (func != nullptr) if (func == nullptr)
{ {
Printf("Missing 'Apply' method in class '%s', level compatibility object ignored\n", cls->TypeName.GetChars());
continue;
}
auto argTypes = func->Variants[0].Proto->ArgumentTypes;
if (argTypes.Size() != 3 || argTypes[1] != TypeName || argTypes[2] != TypeString)
{
Printf("Wrong signature of 'Apply' method in class '%s', level compatibility object ignored\n", cls->TypeName.GetChars());
continue;
}
VMValue param[] = { lc, checksum.GetIndex(), &level.MapName }; VMValue param[] = { lc, checksum.GetIndex(), &level.MapName };
VMCall(func->Variants[0].Implementation, param, 3, nullptr, 0); VMCall(func->Variants[0].Implementation, param, 3, nullptr, 0);
} }
} }
}
} }
DEFINE_ACTION_FUNCTION(DLevelCompatibility, OffsetSectorPlane) DEFINE_ACTION_FUNCTION(DLevelCompatibility, OffsetSectorPlane)