Browse Source

Fixed the case of native closures that have _name = null.

mingodad 13 years ago
parent
commit
f068523101
1 changed files with 51 additions and 19 deletions
  1. 51 19
      squirrel/sqobject.cpp

+ 51 - 19
squirrel/sqobject.cpp

@@ -313,19 +313,28 @@ bool WriteObjectAsCode(HSQUIRRELVM v,SQUserPointer up,SQWRITEFUNC write,SQObject
 	SQInteger sz;
 	switch(type(o)){
 	case OT_STRING:{
-            const SQChar *str = _stringval(o);
-            const SQChar *needQuote = scstrchr(str, _SC('"'));
-            if(!needQuote) withQuotes = true;
+            SQInteger str_size = _string(o)->_len;
+            if(str_size){
+                const SQChar *str = _stringval(o);
+                bool needQuote = false;
+                for(int i=0; i < str_size; ++i){
+                    if(str[i] == '"' || str[i] == '\n'){
+                        needQuote = true;
+                        break;
+                    }
+                }
+                if(!needQuote) withQuotes = true;
+                const SQChar *d1 = withQuotes ? _SC("\"") : _SC("[==[");
+                const SQChar *d2 = withQuotes ? _SC("\"") : _SC("]==]");
+                _CHECK_IO(SafeWrite(v,write,up, (void*)d1, scstrlen(d1)));
+                _CHECK_IO(SafeWrite(v,write,up, (void*)str,rsl(_string(o)->_len)));
+                _CHECK_IO(SafeWrite(v,write,up, (void*)d2, scstrlen(d2)));
+            }
             else
             {
-                needQuote = scstrchr(str, _SC('\n'));
-                if(!needQuote) withQuotes = true;
+                const SQChar *str = _SC("null");
+                _CHECK_IO(SafeWrite(v,write,up, (void*)str, scstrlen(str)));
             }
-            const SQChar *d1 = withQuotes ? _SC("\"") : _SC("[==[");
-            const SQChar *d2 = withQuotes ? _SC("\"") : _SC("]==]");
-            _CHECK_IO(SafeWrite(v,write,up, (void*)d1, scstrlen(d1)));
-            _CHECK_IO(SafeWrite(v,write,up, (void*)str,rsl(_string(o)->_len)));
-            _CHECK_IO(SafeWrite(v,write,up, (void*)d2, scstrlen(d2)));
         }
 		break;
 	case OT_INTEGER:
@@ -548,8 +557,11 @@ bool SQFunctionProto::SaveAsSource(SQVM *v,SQUserPointer up,SQWRITEFUNC write)
 	SQInteger nlineinfos=_nlineinfos,ninstructions = _ninstructions,nfunctions=_nfunctions;
 	SQInteger ndefaultparams = _ndefaultparams;
 	SafeWriteFmt(v,write,up,"{\n");
-	SafeWriteFmt(v,write,up,"\tsource_name = \"%s\",\n", _stringval(_sourcename));
-	SafeWriteFmt(v,write,up,"\tfunction_name = \"%s\",\n", _stringval(_name));
+	SafeWriteFmt(v,write,up,"\tsource_name = ");
+	_CHECK_IO(WriteObjectAsCode(v,up,write,_sourcename));
+	SafeWriteFmt(v,write,up,",\n\tfunction_name = ");
+	_CHECK_IO(WriteObjectAsCode(v,up,write,_name));
+	SafeWriteFmt(v,write,up,"\n");
 
 	SafeWriteFmt(v,write,up,"\tliterals = [\n");
 	for(i=0;i<nliterals;i++){
@@ -636,6 +648,10 @@ 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);
+            break;
             case _OP_PREPCALLK:
             case _OP_PREPCALL:
                     SafeWriteFmt(v,write,up,"\t/* closure_at_stk[%d], stk[%d].get(%s[%d]) -> stk[%d] */",
@@ -645,10 +661,11 @@ bool SQFunctionProto::SaveAsSource(SQVM *v,SQUserPointer up,SQWRITEFUNC write)
                     SafeWriteFmt(v,write,up,"\t/* %f */", *((SQFloat*)&inst._arg1));
             break;
             case _OP_GETOUTER:
-                        SafeWriteFmt(v,write,up,"\t/* stk[%d] <- outervalues[%d] */", inst._arg0, inst._arg1);
+                        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[%d], stackbase[%d], nargs[%d] */",
+                        SafeWriteFmt(v,write,up,"\t\t/* target[%d], closure_at_stk[%d], stackbase(%d), nargs(%d) */",
                                      inst._arg0, inst._arg1, inst._arg2, inst._arg3);
             break;
             case _OP_MOVE:
@@ -662,16 +679,20 @@ bool SQFunctionProto::SaveAsSource(SQVM *v,SQUserPointer up,SQWRITEFUNC write)
                         SafeWriteFmt(v,write,up,"\t/* stk[%d] <- arg1(%d) */", inst._arg0, inst._arg1);
             break;
             case _OP_EQ:
-                        SafeWriteFmt(v,write,up,"\t\t/* ?arg0[%d], stk_at_arg2[%d] == (arg3(%d) !=0 ? literals_at_arg1[%d] : STK_at_arg1[%d]) */",
+                        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);
+            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_RETURN:
-                        SafeWriteFmt(v,write,up,"\t/* _arg0 != 0xFF ? stk[%d] : null */",
-                                     inst._arg1);
+                        SafeWriteFmt(v,write,up,"\t/* _arg0(0x%X) != 0xFF ? stk[%d] : null */",
+                                     inst._arg0, inst._arg1);
             break;
             case _OP_NEWOBJ:
                         SafeWriteFmt(v,write,up,"\t/* stk[%d], len(%d), %s(%d) */",
@@ -682,6 +703,7 @@ bool SQFunctionProto::SaveAsSource(SQVM *v,SQUserPointer up,SQWRITEFUNC write)
                                      inst._arg0, get_array_append_type(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);
             break;
@@ -689,9 +711,19 @@ bool SQFunctionProto::SaveAsSource(SQVM *v,SQUserPointer up,SQWRITEFUNC write)
                         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);
+            break;
+            case _OP_LOADROOT:
+                        SafeWriteFmt(v,write,up,"\t/* stk_at_arg0[%d] <- roottable */",
+                                     inst._arg0);
+            break;
             case _OP_CLOSURE:
-                        SafeWriteFmt(v,write,up,"\t/* stk[%d], size(%d), isLanbda(%d) */",
-                                     inst._arg0, inst._arg1, 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: