- changed VMValue to handle strings by reference.

This makes VMValue a real POD type with no hacky overloads and eliminates a lot of destructor code in all places that call a VM function. Due to the way this had to be handled, none of these destructors could be skipped because any value could have been a string.
This required some minor changes in functions that passed a temporary FString into the VM to ensure that the temporary object lives long enough to be handled. The code generator had already been changed to deal with this in a previous commit.
This is easily offset by the code savings and reduced maintenance needs elsewhere.
This commit is contained in:
Christoph Oelckers 2017-03-22 01:44:56 +01:00
commit 4417afd548
9 changed files with 55 additions and 93 deletions

View file

@ -5368,6 +5368,9 @@ static int ScriptCall(unsigned argc, int32_t *args)
{
I_Error("ACS call to non-static script function %s.%s", clsname, funcname);
}
// Note that this array may not be reallocated so its initial size must be the maximum possible elements.
TArray<FString> strings(argc);
TArray<VMValue> params;
for (unsigned i = 2; i < argc; i++)
{
@ -5395,7 +5398,8 @@ static int ScriptCall(unsigned argc, int32_t *args)
}
else if (argtype == TypeString)
{
params.Push(FBehavior::StaticLookupString(args[i]));
strings.Push(FBehavior::StaticLookupString(args[i]));
params.Push(&strings.Last());
}
else if (argtype == TypeSound)
{