- 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 "vm.h"
#include "actor.h"
#include "types.h"
// MACROS ------------------------------------------------------------------
@ -356,11 +357,21 @@ void SetCompatibilityParams(FName checksum)
if (cls->IsDescendantOf(RUNTIME_CLASS(DLevelCompatibility)))
{
PFunction *const func = dyn_cast<PFunction>(cls->FindSymbol("Apply", false));
if (func != nullptr)
if (func == nullptr)
{
VMValue param[] = { lc, checksum.GetIndex(), &level.MapName };
VMCall(func->Variants[0].Implementation, param, 3, nullptr, 0);
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 };
VMCall(func->Variants[0].Implementation, param, 3, nullptr, 0);
}
}
}