|
|
@@ -702,9 +702,9 @@ bool SQFunctionProto::SaveAsSource(SQVM *v,SQUserPointer up,SQWRITEFUNC write)
|
|
|
}
|
|
|
SafeWriteFmt(v,write,up,"\t],\n");
|
|
|
|
|
|
- SafeWriteFmt(v,write,up,"\tlocalvarinfos = [\n\t\t//[pos, name, start_op, end_op, scope, type],\n");
|
|
|
+ SafeWriteFmt(v,write,up,"\tlocalvarinfos = [\n\t\t//[pos, name, start_op, end_op, scope, type, type_name, dtype_name],\n");
|
|
|
for(i=0;i<nlocalvarinfos;i++){
|
|
|
- SQLocalVarInfo &lvi=_localvarinfos[i];
|
|
|
+ SQLocalVarInfo &lvi=_localvarinfos[nlocalvarinfos-1-i];
|
|
|
SafeWriteFmt(v,write,up,"\t\t/*%d*/ [", i);
|
|
|
SafeWriteFmt(v,write,up,"%d, ", lvi._pos);
|
|
|
_CHECK_IO(WriteObjectAsCode(v,up,write,lvi._name));
|
|
|
@@ -712,14 +712,15 @@ bool SQFunctionProto::SaveAsSource(SQVM *v,SQUserPointer up,SQWRITEFUNC write)
|
|
|
SafeWriteFmt(v,write,up,", %d", lvi._end_op);
|
|
|
SafeWriteFmt(v,write,up,", %d", lvi._scope);
|
|
|
const char* type_name = (sq_type(lvi._type_name) == OT_STRING) ? _stringval(lvi._type_name) : "";
|
|
|
- SafeWriteFmt(v,write,up,", %d], //%s : %s\n", lvi._type, SQGetVarTypeName(lvi._type), type_name);
|
|
|
+ SafeWriteFmt(v,write,up,", %d, \"%s\", \"%s\"],\n", lvi._type, SQGetVarTypeName(lvi._type), type_name);
|
|
|
}
|
|
|
SafeWriteFmt(v,write,up,"\t],\n");
|
|
|
|
|
|
SafeWriteFmt(v,write,up,"\tlineinfos = [\n\t\t//[op, line],\n");
|
|
|
for(i=0;i<nlineinfos;i++){
|
|
|
SQLineInfo &li=_lineinfos[i];
|
|
|
- SafeWriteFmt(v,write,up,"\t\t/*%d*/ [%d, %d], /*%s*/\n", i, li._op, li._line, SQGetOpName(li._op));
|
|
|
+ SafeWriteFmt(v,write,up,"\t\t/*%d*/ [%d, %d], /*%s*/\n", i, li._op, li._line,
|
|
|
+ SQGetOpName(_instructions[li._op].op));
|
|
|
}
|
|
|
SafeWriteFmt(v,write,up,"\t],\n");
|
|
|
|
|
|
@@ -745,7 +746,8 @@ bool SQFunctionProto::SaveAsSource(SQVM *v,SQUserPointer up,SQWRITEFUNC write)
|
|
|
if(lidx >= 0xFFFFFFFF) SafeWriteFmt(v,write,up,"\t\t/* stk[%d] <- null */", inst._arg0);
|
|
|
else
|
|
|
{
|
|
|
- SafeWriteFmt(v,write,up,"\t\t/* stk[%d] <- literals[%d] */", inst._arg0, lidx);
|
|
|
+ const SQChar *str_name = sq_isstring(_literals[lidx]) ? _stringval(_literals[lidx]) : "?";
|
|
|
+ SafeWriteFmt(v,write,up,"\t\t/* stk[%d] <- literals[%d](\"%s\") */", inst._arg0, lidx, str_name);
|
|
|
//_CHECK_IO(WriteObjectAsCode(v,up,write,_literals[lidx], false));
|
|
|
//SafeWriteFmt(v,write,up," */");
|
|
|
}
|
|
|
@@ -762,118 +764,138 @@ bool SQFunctionProto::SaveAsSource(SQVM *v,SQUserPointer up,SQWRITEFUNC write)
|
|
|
break;
|
|
|
case _OP_GET:
|
|
|
SafeWriteFmt(v,write,up,"\t/* stk_at_arg0[%d] = stk_at_arg1[%d].get(stk_at_arg2(%d)) */",
|
|
|
- inst._arg0, inst._arg1, inst._arg2);
|
|
|
+ inst._arg0, inst._arg1, inst._arg2);
|
|
|
break;
|
|
|
case _OP_SET:
|
|
|
SafeWriteFmt(v,write,up,"\t/* stk_at_arg1[%d].set(stk_at_arg2(%d), stk_at_arg3(%d)) */",
|
|
|
- inst._arg1, inst._arg2, inst._arg3);
|
|
|
+ inst._arg1, inst._arg2, inst._arg3);
|
|
|
break;
|
|
|
case _OP_PREPCALLK:
|
|
|
case _OP_PREPCALL:
|
|
|
SafeWriteFmt(v,write,up,"\t/* closure_at_stk[%d], stk[%d].get(%s[%d]) -> stk[%d] */",
|
|
|
- inst._arg0, inst._arg2, inst.op == _OP_PREPCALLK ? "literals" : "stk", inst._arg1, inst._arg3);
|
|
|
+ inst._arg0, inst._arg2, inst.op == _OP_PREPCALLK ? "literals" : "stk", inst._arg1, inst._arg3);
|
|
|
break;
|
|
|
case _OP_LOADFLOAT:
|
|
|
SafeWriteFmt(v,write,up,"\t/* %f */", *((SQFloat32*)&inst._arg1));
|
|
|
break;
|
|
|
case _OP_GETOUTER:
|
|
|
- SafeWriteFmt(v,write,up,"\t/* stk[%d] <- outervalues[%d] == (%s) */",
|
|
|
- inst._arg0, inst._arg1, _stringval(_outervalues[inst._arg1]._name));
|
|
|
+ SafeWriteFmt(v,write,up,"\t/* stk[%d] <- outervalues[%d] == (%s) */",
|
|
|
+ inst._arg0, inst._arg1, _stringval(_outervalues[inst._arg1]._name));
|
|
|
break;
|
|
|
case _OP_CALL:
|
|
|
- SafeWriteFmt(v,write,up,"\t\t/* target[%d], closure_at_stk[%d], stackbase(%d), nargs(%d) */",
|
|
|
- inst._arg0, inst._arg1, inst._arg2, inst._arg3);
|
|
|
+ {
|
|
|
+ SQLocalVarInfo &lvi=_localvarinfos[nlocalvarinfos-1-inst._arg1];
|
|
|
+ const SQChar *str_name = sq_isstring(lvi._name) ? _stringval(lvi._name) : "?";
|
|
|
+ SafeWriteFmt(v,write,up,"\t\t/* target[%d], lvi[%d](\"%s\"), stackbase(%d), nargs(%d) */",
|
|
|
+ inst._arg0, inst._arg1, str_name, inst._arg2, inst._arg3);
|
|
|
+ }
|
|
|
break;
|
|
|
case _OP_MOVE:
|
|
|
- SafeWriteFmt(v,write,up,"\t\t/* stk[%d] <- stk[%d] */", inst._arg0, inst._arg1);
|
|
|
+ {
|
|
|
+ SQLocalVarInfo &lvi=_localvarinfos[nlocalvarinfos-1-inst._arg1];
|
|
|
+ const SQChar *str_name = sq_isstring(lvi._name) ? _stringval(lvi._name) : "?";
|
|
|
+ SafeWriteFmt(v,write,up,"\t\t/* stk[%d] <- lvi[%d](\"%s\") */", inst._arg0, inst._arg1, str_name);
|
|
|
+ }
|
|
|
break;
|
|
|
case _OP_DMOVE:
|
|
|
- SafeWriteFmt(v,write,up,"\t/* stk[%d] <- stk[%d], stk[%d] <- stk[%d] */",
|
|
|
- inst._arg0, inst._arg1, inst._arg2, inst._arg3);
|
|
|
+ {
|
|
|
+ SQLocalVarInfo &lvi1=_localvarinfos[nlocalvarinfos-1-inst._arg1];
|
|
|
+ const SQChar *str_name1 = sq_isstring(lvi1._name) ? _stringval(lvi1._name) : "?";
|
|
|
+ SQLocalVarInfo &lvi2=_localvarinfos[nlocalvarinfos-1-inst._arg3];
|
|
|
+ const SQChar *str_name2 = sq_isstring(lvi2._name) ? _stringval(lvi2._name) : "?";
|
|
|
+ SafeWriteFmt(v,write,up,"\t/* stk[%d] <- lvi[%d](\"%s\"), stk[%d] <- lvi[%d](\"%s\") */",
|
|
|
+ inst._arg0, inst._arg1, str_name1, inst._arg2, inst._arg3, str_name2);
|
|
|
+ }
|
|
|
break;
|
|
|
case _OP_LOADINT:
|
|
|
- SafeWriteFmt(v,write,up,"\t/* stk[%d] <- arg1(%d) */", inst._arg0, inst._arg1);
|
|
|
+ SafeWriteFmt(v,write,up,"\t/* stk[%d] <- arg1(%d) */", inst._arg0, inst._arg1);
|
|
|
break;
|
|
|
case _OP_EQ:
|
|
|
- SafeWriteFmt(v,write,up,"\t\t/* stk_at_arg0[%d] = stk_at_arg2[%d] == (arg3(%d) !=0 ? literals_at_arg1[%d] : stk_at_arg1[%d]) */",
|
|
|
- inst._arg0, inst._arg2, inst._arg3, inst._arg1, inst._arg1);
|
|
|
+ SafeWriteFmt(v,write,up,"\t\t/* stk_at_arg0[%d] = stk_at_arg2[%d] == (arg3(%d) !=0 ? literals_at_arg1[%d] : stk_at_arg1[%d]) */",
|
|
|
+ inst._arg0, inst._arg2, inst._arg3, inst._arg1, inst._arg1);
|
|
|
break;
|
|
|
case _OP_NOT:
|
|
|
- SafeWriteFmt(v,write,up,"\t\t/* stk_at_arg0[%d] = IsFalse(stk_at_arg1[%d]) */",
|
|
|
- inst._arg0, inst._arg1);
|
|
|
+ SafeWriteFmt(v,write,up,"\t\t/* stk_at_arg0[%d] = IsFalse(stk_at_arg1[%d]) */",
|
|
|
+ inst._arg0, inst._arg1);
|
|
|
break;
|
|
|
case _OP_AND:
|
|
|
case _OP_OR:
|
|
|
- SafeWriteFmt(v,write,up,"\t\t/* %s(stk_at_arg2[%d]) {stk_at_arg0[%d] = stk[%d]; goto[%d]} */",
|
|
|
- ((inst.op == _OP_OR) ? "IsTrue" : "IsFalse"),
|
|
|
- inst._arg2, inst._arg0, inst._arg2, i + inst._arg1 + 1);
|
|
|
+ SafeWriteFmt(v,write,up,"\t\t/* %s(stk_at_arg2[%d]) {stk_at_arg0[%d] = stk[%d]; goto[%d]} */",
|
|
|
+ ((inst.op == _OP_OR) ? "IsTrue" : "IsFalse"),
|
|
|
+ inst._arg2, inst._arg0, inst._arg2, i + inst._arg1 + 1);
|
|
|
break;
|
|
|
case _OP_JZ:
|
|
|
- SafeWriteFmt(v,write,up,"\t\t/* IsFalse(STK(%d) (ci->_ip+=(%d) -> goto[%d]) */",
|
|
|
- inst._arg0, inst._arg1, i + inst._arg1 + 1);
|
|
|
+ SafeWriteFmt(v,write,up,"\t\t/* IsFalse(STK(%d) (ci->_ip+=(%d) -> goto[%d]) */",
|
|
|
+ inst._arg0, inst._arg1, i + inst._arg1 + 1);
|
|
|
break;
|
|
|
case _OP_JCMP:
|
|
|
- SafeWriteFmt(v,write,up,"\t\t/* IsFalse(STK(%d) %s STK(%d)) (ci->_ip+=(%d) -> goto[%d]) */",
|
|
|
- inst._arg2, SQGetCmpOpName(inst._arg3), inst._arg0, inst._arg1, i + inst._arg1 + 1);
|
|
|
+ SafeWriteFmt(v,write,up,"\t\t/* IsFalse(STK(%d) %s STK(%d)) (ci->_ip+=(%d) -> goto[%d]) */",
|
|
|
+ inst._arg2, SQGetCmpOpName(inst._arg3), inst._arg0, inst._arg1, i + inst._arg1 + 1);
|
|
|
break;
|
|
|
case _OP_JMP:
|
|
|
- SafeWriteFmt(v,write,up,"\t\t/* (ci->_ip+=(%d)) -> goto[%d] */",
|
|
|
- inst._arg1, i + inst._arg1 + 1);
|
|
|
+ SafeWriteFmt(v,write,up,"\t\t/* (ci->_ip+=(%d)) -> goto[%d] */",
|
|
|
+ inst._arg1, i + inst._arg1 + 1);
|
|
|
break;
|
|
|
case _OP_RETURN:
|
|
|
- SafeWriteFmt(v,write,up,"\t/* _arg0(%d) != 255 ? stk[%d] : null */",
|
|
|
- inst._arg0, inst._arg1);
|
|
|
+ SafeWriteFmt(v,write,up,"\t/* _arg0(%d) != 255 ? stk[%d] : null */",
|
|
|
+ inst._arg0, inst._arg1);
|
|
|
break;
|
|
|
case _OP_NEWOBJ:
|
|
|
- SafeWriteFmt(v,write,up,"\t/* stk[%d], len(%d), %s(%d) */",
|
|
|
- inst._arg0, inst._arg1, SQGetNewObjTypeName(inst._arg3), inst._arg3);
|
|
|
+ SafeWriteFmt(v,write,up,"\t/* stk[%d], len(%d), %s(%d) */",
|
|
|
+ inst._arg0, inst._arg1, SQGetNewObjTypeName(inst._arg3), inst._arg3);
|
|
|
break;
|
|
|
case _OP_APPENDARRAY:
|
|
|
- SafeWriteFmt(v,write,up,"\t/* array_at_stk(%d), %s(%d), sq_type(%d) */",
|
|
|
- inst._arg0, SQGetArrayAppendTypeName(inst._arg2), inst._arg1, inst._arg2);
|
|
|
+ SafeWriteFmt(v,write,up,"\t/* array_at_stk(%d), %s(%d), sq_type(%d) */",
|
|
|
+ inst._arg0, SQGetArrayAppendTypeName(inst._arg2), inst._arg1, inst._arg2);
|
|
|
break;
|
|
|
case _OP_NEWSLOT:
|
|
|
case _OP_NEWSLOTA:
|
|
|
- SafeWriteFmt(v,write,up,"\t/* flags(%d), table_at_stk(%d), key_at_stk(%d), val_at_stk(%d) */",
|
|
|
- inst._arg0, inst._arg1, inst._arg2, inst._arg3);
|
|
|
+ SafeWriteFmt(v,write,up,"\t/* flags(%d), table_at_stk(%d), key_at_stk(%d), val_at_stk(%d) */",
|
|
|
+ inst._arg0, inst._arg1, inst._arg2, inst._arg3);
|
|
|
break;
|
|
|
case _OP_LOADBOOL:
|
|
|
- SafeWriteFmt(v,write,up,"\t/* stk[%d] <- bool(%d) */",
|
|
|
- inst._arg0, inst._arg2);
|
|
|
+ SafeWriteFmt(v,write,up,"\t/* stk[%d] <- bool(%d) */",
|
|
|
+ inst._arg0, inst._arg2);
|
|
|
break;
|
|
|
case _OP_LOADNULLS:
|
|
|
- SafeWriteFmt(v,write,up,"\t/* stk_at_arg0[%d .. (arg0 + arg1(%d))] = null */",
|
|
|
- inst._arg0, inst._arg1);
|
|
|
+ SafeWriteFmt(v,write,up,"\t/* stk_at_arg0[%d .. (arg0 + arg1(%d))] = null */",
|
|
|
+ inst._arg0, inst._arg1);
|
|
|
break;
|
|
|
case _OP_LOADROOT:
|
|
|
- SafeWriteFmt(v,write,up,"\t/* stk_at_arg0[%d] <- roottable */",
|
|
|
- inst._arg0);
|
|
|
+ SafeWriteFmt(v,write,up,"\t/* stk_at_arg0[%d] <- roottable */",
|
|
|
+ inst._arg0);
|
|
|
break;
|
|
|
case _OP_CLOSURE:
|
|
|
- SafeWriteFmt(v,write,up,"\t/* stk_at_arg0[%d] <- functions[%d] == (",
|
|
|
- inst._arg0, inst._arg1);
|
|
|
- _CHECK_IO(WriteObjectAsCode(v,up,write,_funcproto(_functions[inst._arg1])->_name));
|
|
|
- SafeWriteFmt(v,write,up,"), isLanbda(%d) */", inst._arg2);
|
|
|
+ SafeWriteFmt(v,write,up,"\t/* stk_at_arg0[%d] <- functions[%d](",
|
|
|
+ inst._arg0, inst._arg1);
|
|
|
+ _CHECK_IO(WriteObjectAsCode(v,up,write,_funcproto(_functions[inst._arg1])->_name));
|
|
|
+ SafeWriteFmt(v,write,up,"), isLanbda(%d) */", inst._arg2);
|
|
|
break;
|
|
|
case _OP_ADD:
|
|
|
case _OP_SUB:
|
|
|
case _OP_DIV:
|
|
|
case _OP_MUL:
|
|
|
case _OP_MOD:
|
|
|
- SafeWriteFmt(v,write,up,"\t\t/* stk[%d] = stk[%d] %s stk[%d] */",
|
|
|
- inst._arg0, inst._arg1, SQGetArithOpName(inst.op), inst._arg2);
|
|
|
+ {
|
|
|
+ SQLocalVarInfo &lvi1=_localvarinfos[nlocalvarinfos-1-inst._arg1];
|
|
|
+ const SQChar *str_name1 = sq_isstring(lvi1._name) ? _stringval(lvi1._name) : "?";
|
|
|
+ SQLocalVarInfo &lvi2=_localvarinfos[nlocalvarinfos-1-inst._arg2];
|
|
|
+ const SQChar *str_name2 = sq_isstring(lvi2._name) ? _stringval(lvi2._name) : "?";
|
|
|
+ SafeWriteFmt(v,write,up,"\t\t/* stk[%d] = stk[%d](\"%s\") %s stk[%d](\"%s\") */",
|
|
|
+ inst._arg0, inst._arg1, str_name1, SQGetArithOpName(inst.op), inst._arg2, str_name2);
|
|
|
+ }
|
|
|
break;
|
|
|
case _OP_INCL:
|
|
|
- SafeWriteFmt(v,write,up,"\t\t/* stk[%d] = stk[%d] + sarg3(%d) */",
|
|
|
- inst._arg1, inst._arg1, ((char)inst._arg3));
|
|
|
+ SafeWriteFmt(v,write,up,"\t\t/* stk[%d] = stk[%d] + sarg3(%d) */",
|
|
|
+ inst._arg1, inst._arg1, ((char)inst._arg3));
|
|
|
break;
|
|
|
case _OP_PINCL:
|
|
|
- SafeWriteFmt(v,write,up,"\t\t/* target = stk(%d); stk[%d] = stk[%d] + sarg3(%d) */",
|
|
|
- inst._arg1, inst._arg1, inst._arg1, ((char)inst._arg3));
|
|
|
+ SafeWriteFmt(v,write,up,"\t\t/* target = stk(%d); stk[%d] = stk[%d] + sarg3(%d) */",
|
|
|
+ inst._arg1, inst._arg1, inst._arg1, ((char)inst._arg3));
|
|
|
break;
|
|
|
case _OP_BITW:
|
|
|
- SafeWriteFmt(v,write,up,"\t\t/* stk[%d] = stk[%d] %s stk[%d] */",
|
|
|
- inst._arg0, inst._arg1, SQGetBitwiseOpName(inst._arg3), inst._arg2);
|
|
|
+ SafeWriteFmt(v,write,up,"\t\t/* stk[%d] = stk[%d] %s stk[%d] */",
|
|
|
+ inst._arg0, inst._arg1, SQGetBitwiseOpName(inst._arg3), inst._arg2);
|
|
|
break;
|
|
|
//default:
|
|
|
}
|