Quellcode durchsuchen

Added a bit more reverse bytecode generation info

mingodad vor 9 Jahren
Ursprung
Commit
818106c780
1 geänderte Dateien mit 49 neuen und 0 gelöschten Zeilen
  1. 49 0
      SquiLu/squirrel/sqobject.cpp

+ 49 - 0
SquiLu/squirrel/sqobject.cpp

@@ -533,6 +533,33 @@ bool SQFunctionProto::Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write)
 	return true;
 }
 
+static const SQChar *get_bitwise_op(int it){
+#define SCASE(x) case x: return _SC(#x); break;
+    switch(it){
+        SCASE(BW_AND)
+        SCASE(BW_OR)
+        SCASE(BW_XOR)
+        SCASE(BW_SHIFTL)
+        SCASE(BW_SHIFTR)
+        SCASE(BW_USHIFTR)
+        default: return _SC("?");
+    }
+#undef SCASE
+}
+
+static const SQChar *get_cmp_op(int it){
+#define SCASE(x) case x: return _SC(#x); break;
+    switch(it){
+        SCASE(CMP_G)
+        SCASE(CMP_GE)
+        SCASE(CMP_L)
+        SCASE(CMP_LE)
+        SCASE(CMP_3W)
+        default: return _SC("?");
+    }
+#undef SCASE
+}
+
 static const SQChar *get_array_append_type(int it){
 #define SCASE(x) case x: return _SC(#x); break;
     switch(it){
@@ -683,6 +710,10 @@ bool SQFunctionProto::SaveAsSource(SQVM *v,SQUserPointer up,SQWRITEFUNC write)
                     SafeWriteFmt(v,write,up,"\t/* stk_at_arg0[%d] = stk_at_arg1[%d].get(stk_at_arg2(%d)) */",
                                  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);
+            break;
             case _OP_PREPCALLK:
             case _OP_PREPCALL:
                     SafeWriteFmt(v,write,up,"\t/* closure_at_stk[%d], stk[%d].get(%s[%d]) -> stk[%d] */",
@@ -717,10 +748,24 @@ bool SQFunctionProto::SaveAsSource(SQVM *v,SQUserPointer up,SQWRITEFUNC write)
                         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]} */",
+                                     _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);
             break;
+            case _OP_JCMP:
+                        SafeWriteFmt(v,write,up,"\t\t/* IsFalse(STK(%d) %s STK(%d)) (ci->_ip+=(%d) -> goto[%d]) */",
+                                     inst._arg2, get_cmp_op(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);
+            break;
             case _OP_RETURN:
                         SafeWriteFmt(v,write,up,"\t/* _arg0(%d) != 255 ? stk[%d] : null */",
                                      inst._arg0, inst._arg1);
@@ -764,6 +809,10 @@ bool SQFunctionProto::SaveAsSource(SQVM *v,SQUserPointer up,SQWRITEFUNC write)
                         SafeWriteFmt(v,write,up,"\t\t/* stk[%d] = stk[%d] %s stk[%d] */",
                                      inst._arg0, inst._arg1, get_arith_op(inst.op), inst._arg2);
             break;
+            case _OP_BITW:
+                        SafeWriteFmt(v,write,up,"\t\t/* stk[%d] = stk[%d] %s stk[%d] */",
+                                     inst._arg0, inst._arg1, get_bitwise_op(inst._arg3), inst._arg2);
+            break;
             //default:
         }
         SafeWriteFmt(v,write,up,"\n");