Merge remote-tracking branch 'origin/master' into asmjit
This commit is contained in:
commit
70f18f87b9
10 changed files with 454 additions and 146 deletions
|
|
@ -569,77 +569,77 @@ static int ExecScriptFunc(VMFrameStack *stack, VMReturn *ret, int numret)
|
|||
assert(f->NumParam < sfunc->MaxParam);
|
||||
{
|
||||
VMValue *param = ®.param[f->NumParam++];
|
||||
b = B;
|
||||
if (b == REGT_NIL)
|
||||
b = BC;
|
||||
if (a == REGT_NIL)
|
||||
{
|
||||
::new(param) VMValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
switch(b)
|
||||
switch(a)
|
||||
{
|
||||
case REGT_INT:
|
||||
assert(C < f->NumRegD);
|
||||
::new(param) VMValue(reg.d[C]);
|
||||
assert(b < f->NumRegD);
|
||||
::new(param) VMValue(reg.d[b]);
|
||||
break;
|
||||
case REGT_INT | REGT_ADDROF:
|
||||
assert(C < f->NumRegD);
|
||||
::new(param) VMValue(®.d[C]);
|
||||
assert(b < f->NumRegD);
|
||||
::new(param) VMValue(®.d[b]);
|
||||
break;
|
||||
case REGT_INT | REGT_KONST:
|
||||
assert(C < sfunc->NumKonstD);
|
||||
::new(param) VMValue(konstd[C]);
|
||||
assert(b < sfunc->NumKonstD);
|
||||
::new(param) VMValue(konstd[b]);
|
||||
break;
|
||||
case REGT_STRING:
|
||||
assert(C < f->NumRegS);
|
||||
::new(param) VMValue(®.s[C]);
|
||||
assert(b < f->NumRegS);
|
||||
::new(param) VMValue(®.s[b]);
|
||||
break;
|
||||
case REGT_STRING | REGT_ADDROF:
|
||||
assert(C < f->NumRegS);
|
||||
::new(param) VMValue((void*)®.s[C]); // Note that this may not use the FString* version of the constructor!
|
||||
assert(b < f->NumRegS);
|
||||
::new(param) VMValue((void*)®.s[b]); // Note that this may not use the FString* version of the constructor!
|
||||
break;
|
||||
case REGT_STRING | REGT_KONST:
|
||||
assert(C < sfunc->NumKonstS);
|
||||
::new(param) VMValue(&konsts[C]);
|
||||
assert(b < sfunc->NumKonstS);
|
||||
::new(param) VMValue(&konsts[b]);
|
||||
break;
|
||||
case REGT_POINTER:
|
||||
assert(C < f->NumRegA);
|
||||
::new(param) VMValue(reg.a[C]);
|
||||
assert(b < f->NumRegA);
|
||||
::new(param) VMValue(reg.a[b]);
|
||||
break;
|
||||
case REGT_POINTER | REGT_ADDROF:
|
||||
assert(C < f->NumRegA);
|
||||
::new(param) VMValue(®.a[C]);
|
||||
assert(b < f->NumRegA);
|
||||
::new(param) VMValue(®.a[b]);
|
||||
break;
|
||||
case REGT_POINTER | REGT_KONST:
|
||||
assert(C < sfunc->NumKonstA);
|
||||
::new(param) VMValue(konsta[C].v);
|
||||
assert(b < sfunc->NumKonstA);
|
||||
::new(param) VMValue(konsta[b].v);
|
||||
break;
|
||||
case REGT_FLOAT:
|
||||
assert(C < f->NumRegF);
|
||||
::new(param) VMValue(reg.f[C]);
|
||||
assert(b < f->NumRegF);
|
||||
::new(param) VMValue(reg.f[b]);
|
||||
break;
|
||||
case REGT_FLOAT | REGT_MULTIREG2:
|
||||
assert(C < f->NumRegF - 1);
|
||||
assert(b < f->NumRegF - 1);
|
||||
assert(f->NumParam < sfunc->MaxParam);
|
||||
::new(param) VMValue(reg.f[C]);
|
||||
::new(param + 1) VMValue(reg.f[C + 1]);
|
||||
::new(param) VMValue(reg.f[b]);
|
||||
::new(param + 1) VMValue(reg.f[b + 1]);
|
||||
f->NumParam++;
|
||||
break;
|
||||
case REGT_FLOAT | REGT_MULTIREG3:
|
||||
assert(C < f->NumRegF - 2);
|
||||
assert(b < f->NumRegF - 2);
|
||||
assert(f->NumParam < sfunc->MaxParam - 1);
|
||||
::new(param) VMValue(reg.f[C]);
|
||||
::new(param + 1) VMValue(reg.f[C + 1]);
|
||||
::new(param + 2) VMValue(reg.f[C + 2]);
|
||||
::new(param) VMValue(reg.f[b]);
|
||||
::new(param + 1) VMValue(reg.f[b + 1]);
|
||||
::new(param + 2) VMValue(reg.f[b + 2]);
|
||||
f->NumParam += 2;
|
||||
break;
|
||||
case REGT_FLOAT | REGT_ADDROF:
|
||||
assert(C < f->NumRegF);
|
||||
::new(param) VMValue(®.f[C]);
|
||||
assert(b < f->NumRegF);
|
||||
::new(param) VMValue(®.f[b]);
|
||||
break;
|
||||
case REGT_FLOAT | REGT_KONST:
|
||||
assert(C < sfunc->NumKonstF);
|
||||
::new(param) VMValue(konstf[C]);
|
||||
assert(b < sfunc->NumKonstF);
|
||||
::new(param) VMValue(konstf[b]);
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue