Fixed regression from commit #49465 - there are in fact two restAdjust variables, the current and global one
svn-id: r49486
This commit is contained in:
parent
356728dab7
commit
2c950b321c
4 changed files with 34 additions and 33 deletions
|
@ -718,7 +718,7 @@ void run_vm(EngineState *s, bool restoring) {
|
|||
StackPtr s_temp; // Temporary stack pointer
|
||||
int16 opparams[4]; // opcode parameters
|
||||
|
||||
s->restAdjust = s->restAdjust;
|
||||
s->restAdjustCur = s->restAdjust;
|
||||
// &rest adjusts the parameter count by this value
|
||||
// Current execution data:
|
||||
s->xs = &(s->_executionStack.back());
|
||||
|
@ -1116,17 +1116,17 @@ void run_vm(EngineState *s, bool restoring) {
|
|||
|
||||
case op_call: { // 0x20 (32)
|
||||
int argc = (opparams[1] >> 1) // Given as offset, but we need count
|
||||
+ 1 + s->restAdjust;
|
||||
+ 1 + s->restAdjustCur;
|
||||
StackPtr call_base = s->xs->sp - argc;
|
||||
s->xs->sp[1].offset += s->restAdjust;
|
||||
s->xs->sp[1].offset += s->restAdjustCur;
|
||||
|
||||
xs_new = add_exec_stack_entry(s->_executionStack, make_reg(s->xs->addr.pc.segment,
|
||||
s->xs->addr.pc.offset + opparams[0]),
|
||||
s->xs->sp, s->xs->objp,
|
||||
(validate_arithmetic(*call_base)) + s->restAdjust,
|
||||
(validate_arithmetic(*call_base)) + s->restAdjustCur,
|
||||
call_base, NULL_SELECTOR, s->xs->objp,
|
||||
s->_executionStack.size()-1, s->xs->local_segment);
|
||||
s->restAdjust = 0; // Used up the &rest adjustment
|
||||
s->restAdjustCur = 0; // Used up the &rest adjustment
|
||||
s->xs->sp = call_base;
|
||||
|
||||
s->_executionStackPosChanged = true;
|
||||
|
@ -1140,19 +1140,19 @@ void run_vm(EngineState *s, bool restoring) {
|
|||
|
||||
bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY);
|
||||
if (!oldScriptHeader) {
|
||||
s->xs->sp -= s->restAdjust;
|
||||
s->restAdjust = 0; // We just used up the s->restAdjust, remember?
|
||||
s->xs->sp -= s->restAdjustCur;
|
||||
s->restAdjust = 0; // We just used up the s->restAdjustCur, remember?
|
||||
}
|
||||
|
||||
int argc = validate_arithmetic(s->xs->sp[0]);
|
||||
|
||||
if (!oldScriptHeader)
|
||||
argc += s->restAdjust;
|
||||
argc += s->restAdjustCur;
|
||||
|
||||
callKernelFunc(s, opparams[0], argc);
|
||||
|
||||
if (!oldScriptHeader)
|
||||
s->restAdjust = s->restAdjust;
|
||||
s->restAdjustCur = s->restAdjust;
|
||||
|
||||
// Calculate xs again: The kernel function might
|
||||
// have spawned a new VM
|
||||
|
@ -1163,27 +1163,27 @@ void run_vm(EngineState *s, bool restoring) {
|
|||
}
|
||||
|
||||
case op_callb: // 0x22 (34)
|
||||
temp = ((opparams[1] >> 1) + s->restAdjust + 1);
|
||||
temp = ((opparams[1] >> 1) + s->restAdjustCur + 1);
|
||||
s_temp = s->xs->sp;
|
||||
s->xs->sp -= temp;
|
||||
|
||||
s->xs->sp[0].offset += s->restAdjust;
|
||||
s->xs->sp[0].offset += s->restAdjustCur;
|
||||
xs_new = execute_method(s, 0, opparams[0], s_temp, s->xs->objp,
|
||||
s->xs->sp[0].offset, s->xs->sp);
|
||||
s->restAdjust = 0; // Used up the &rest adjustment
|
||||
s->restAdjustCur = 0; // Used up the &rest adjustment
|
||||
if (xs_new) // in case of error, keep old stack
|
||||
s->_executionStackPosChanged = true;
|
||||
break;
|
||||
|
||||
case op_calle: // 0x23 (35)
|
||||
temp = ((opparams[2] >> 1) + s->restAdjust + 1);
|
||||
temp = ((opparams[2] >> 1) + s->restAdjustCur + 1);
|
||||
s_temp = s->xs->sp;
|
||||
s->xs->sp -= temp;
|
||||
|
||||
s->xs->sp[0].offset += s->restAdjust;
|
||||
s->xs->sp[0].offset += s->restAdjustCur;
|
||||
xs_new = execute_method(s, opparams[0], opparams[1], s_temp, s->xs->objp,
|
||||
s->xs->sp[0].offset, s->xs->sp);
|
||||
s->restAdjust = 0; // Used up the &rest adjustment
|
||||
s->restAdjustCur = 0; // Used up the &rest adjustment
|
||||
|
||||
if (xs_new) // in case of error, keep old stack
|
||||
s->_executionStackPosChanged = true;
|
||||
|
@ -1201,7 +1201,7 @@ void run_vm(EngineState *s, bool restoring) {
|
|||
s->_executionStack.pop_back();
|
||||
|
||||
s->_executionStackPosChanged = true;
|
||||
s->restAdjust = s->restAdjust; // Update &rest
|
||||
s->restAdjust = s->restAdjustCur; // Update &rest
|
||||
return; // "Hard" return
|
||||
}
|
||||
|
||||
|
@ -1234,16 +1234,16 @@ void run_vm(EngineState *s, bool restoring) {
|
|||
|
||||
case op_send: // 0x25 (37)
|
||||
s_temp = s->xs->sp;
|
||||
s->xs->sp -= ((opparams[0] >> 1) + s->restAdjust); // Adjust stack
|
||||
s->xs->sp -= ((opparams[0] >> 1) + s->restAdjustCur); // Adjust stack
|
||||
|
||||
s->xs->sp[1].offset += s->restAdjust;
|
||||
s->xs->sp[1].offset += s->restAdjustCur;
|
||||
xs_new = send_selector(s, s->r_acc, s->r_acc, s_temp,
|
||||
(int)(opparams[0] >> 1) + (uint16)s->restAdjust, s->xs->sp);
|
||||
(int)(opparams[0] >> 1) + (uint16)s->restAdjustCur, s->xs->sp);
|
||||
|
||||
if (xs_new && xs_new != s->xs)
|
||||
s->_executionStackPosChanged = true;
|
||||
|
||||
s->restAdjust = 0;
|
||||
s->restAdjustCur = 0;
|
||||
|
||||
break;
|
||||
|
||||
|
@ -1263,17 +1263,17 @@ void run_vm(EngineState *s, bool restoring) {
|
|||
|
||||
case op_self: // 0x2a (42)
|
||||
s_temp = s->xs->sp;
|
||||
s->xs->sp -= ((opparams[0] >> 1) + s->restAdjust); // Adjust stack
|
||||
s->xs->sp -= ((opparams[0] >> 1) + s->restAdjustCur); // Adjust stack
|
||||
|
||||
s->xs->sp[1].offset += s->restAdjust;
|
||||
s->xs->sp[1].offset += s->restAdjustCur;
|
||||
xs_new = send_selector(s, s->xs->objp, s->xs->objp,
|
||||
s_temp, (int)(opparams[0] >> 1) + (uint16)s->restAdjust,
|
||||
s_temp, (int)(opparams[0] >> 1) + (uint16)s->restAdjustCur,
|
||||
s->xs->sp);
|
||||
|
||||
if (xs_new && xs_new != s->xs)
|
||||
s->_executionStackPosChanged = true;
|
||||
|
||||
s->restAdjust = 0;
|
||||
s->restAdjustCur = 0;
|
||||
break;
|
||||
|
||||
case op_super: // 0x2b (43)
|
||||
|
@ -1283,24 +1283,24 @@ void run_vm(EngineState *s, bool restoring) {
|
|||
error("[VM]: Invalid superclass in object");
|
||||
else {
|
||||
s_temp = s->xs->sp;
|
||||
s->xs->sp -= ((opparams[1] >> 1) + s->restAdjust); // Adjust stack
|
||||
s->xs->sp -= ((opparams[1] >> 1) + s->restAdjustCur); // Adjust stack
|
||||
|
||||
s->xs->sp[1].offset += s->restAdjust;
|
||||
s->xs->sp[1].offset += s->restAdjustCur;
|
||||
xs_new = send_selector(s, r_temp, s->xs->objp, s_temp,
|
||||
(int)(opparams[1] >> 1) + (uint16)s->restAdjust,
|
||||
(int)(opparams[1] >> 1) + (uint16)s->restAdjustCur,
|
||||
s->xs->sp);
|
||||
|
||||
if (xs_new && xs_new != s->xs)
|
||||
s->_executionStackPosChanged = true;
|
||||
|
||||
s->restAdjust = 0;
|
||||
s->restAdjustCur = 0;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case op_rest: // 0x2c (44)
|
||||
temp = (uint16) opparams[0]; // First argument
|
||||
s->restAdjust = MAX<int16>(s->xs->argc - temp + 1, 0); // +1 because temp counts the paramcount while argc doesn't
|
||||
s->restAdjustCur = MAX<int16>(s->xs->argc - temp + 1, 0); // +1 because temp counts the paramcount while argc doesn't
|
||||
|
||||
for (; temp <= s->xs->argc; temp++)
|
||||
PUSH32(s->xs->variables_argp[temp]);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue