- 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:
parent
9bffe4ee50
commit
4417afd548
9 changed files with 55 additions and 93 deletions
|
|
@ -583,7 +583,7 @@ begin:
|
|||
break;
|
||||
case REGT_STRING:
|
||||
assert(C < f->NumRegS);
|
||||
::new(param) VMValue(reg.s[C]);
|
||||
::new(param) VMValue(®.s[C]);
|
||||
break;
|
||||
case REGT_STRING | REGT_ADDROF:
|
||||
assert(C < f->NumRegS);
|
||||
|
|
@ -591,7 +591,7 @@ begin:
|
|||
break;
|
||||
case REGT_STRING | REGT_KONST:
|
||||
assert(C < sfunc->NumKonstS);
|
||||
::new(param) VMValue(konsts[C]);
|
||||
::new(param) VMValue(&konsts[C]);
|
||||
break;
|
||||
case REGT_POINTER:
|
||||
assert(C < f->NumRegA);
|
||||
|
|
@ -707,10 +707,7 @@ begin:
|
|||
stack->PopFrame();
|
||||
}
|
||||
assert(numret == C && "Number of parameters returned differs from what was expected by the caller");
|
||||
for (b = B; b != 0; --b)
|
||||
{
|
||||
reg.param[--f->NumParam].~VMValue();
|
||||
}
|
||||
f->NumParam -= B;
|
||||
pc += C; // Skip RESULTs
|
||||
}
|
||||
NEXTOP;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue