Kaynağa Gözat

Some fixes to bytecode dump

mingodad 6 yıl önce
ebeveyn
işleme
ad04f19b6e

+ 42 - 8
SquiLu/squirrel/sqfuncstate.cpp

@@ -24,10 +24,42 @@ SQInstructionDesc g_InstrDesc[]={
 };
 };
 #undef ENUM_OP
 #undef ENUM_OP
 #endif
 #endif
-void DumpLiteral(SQObjectPtr &o)
+void SQDumpLiteral(SQObjectPtr &o)
 {
 {
 	switch(sq_type(o)){
 	switch(sq_type(o)){
-		case OT_STRING:	scprintf(_SC("\"%s\""),_stringval(o));break;
+		case OT_STRING: {
+		    int i, len, buf_idx = 0;
+		    #define BUF_SIZE 64
+		    SQChar buf[BUF_SIZE];
+		    SQChar *str = _stringval(o);
+		    scprintf(_SC("\""));
+		    for(i=0, len=_string(o)->_len; i < len; ++i, ++buf_idx) {
+                if(buf_idx == (BUF_SIZE-1)) {
+                    scprintf(_SC("%*.s"), buf_idx, buf);
+                    buf_idx = 0;
+                }
+                switch(str[i])
+                {
+                case _SC('\a'):
+                case _SC('\b'):
+                case _SC('\t'):
+                case _SC('\n'):
+                case _SC('\v'):
+                case _SC('\f'):
+                case _SC('\r'):
+                case _SC('\\'):
+                case _SC('\"'):
+                    buf[buf_idx++] = _SC('\\');
+                    //falthrough
+                default:
+                        buf[buf_idx++] = str[i];
+                }
+		    }
+		    if(buf_idx > 0) scprintf(_SC("%*.s"), buf_idx, buf);
+		    scprintf(_SC("\""));
+		    #undef BUF_SIZE
+        }
+		break;
 		case OT_FLOAT: scprintf(_SC("{%f}"),_float(o));break;
 		case OT_FLOAT: scprintf(_SC("{%f}"),_float(o));break;
 		case OT_INTEGER: scprintf(_SC("{") _PRINT_INT_FMT _SC("}"),_integer(o));break;
 		case OT_INTEGER: scprintf(_SC("{") _PRINT_INT_FMT _SC("}"),_integer(o));break;
 		case OT_BOOL: scprintf(_SC("%s"),_integer(o)?_SC("true"):_SC("false"));break;
 		case OT_BOOL: scprintf(_SC("%s"),_integer(o)?_SC("true"):_SC("false"));break;
@@ -69,7 +101,7 @@ void SQFuncState::Dump(SQFunctionProto *func)
 	}
 	}
 	for(i=0;i<templiterals.size();i++){
 	for(i=0;i<templiterals.size();i++){
 		scprintf(_SC("[%d] "),(SQInt32)n);
 		scprintf(_SC("[%d] "),(SQInt32)n);
-		DumpLiteral(templiterals[i]);
+		SQDumpLiteral(templiterals[i]);
 		scprintf(_SC("\n"));
 		scprintf(_SC("\n"));
 		n++;
 		n++;
 	}
 	}
@@ -79,7 +111,7 @@ void SQFuncState::Dump(SQFunctionProto *func)
 	n=0;
 	n=0;
 	for(i=0;i<_parameters.size();i++){
 	for(i=0;i<_parameters.size();i++){
 		scprintf(_SC("[%d] "),(SQInt32)n);
 		scprintf(_SC("[%d] "),(SQInt32)n);
-		DumpLiteral(_parameters[i]);
+		SQDumpLiteral(_parameters[i]);
 		scprintf(_SC("\n"));
 		scprintf(_SC("\n"));
 		n++;
 		n++;
 	}
 	}
@@ -111,7 +143,7 @@ void SQFuncState::Dump(SQFunctionProto *func)
 				while(((refidx=_table(_literals)->Next(false,refo,key,val))!= -1) && (_integer(val) != lidx)) {
 				while(((refidx=_table(_literals)->Next(false,refo,key,val))!= -1) && (_integer(val) != lidx)) {
 					refo = refidx;
 					refo = refidx;
 				}
 				}
-				DumpLiteral(key);
+				SQDumpLiteral(key);
 			}
 			}
 			if(inst.op != _OP_DLOAD) {
 			if(inst.op != _OP_DLOAD) {
 				scprintf(_SC(" %d %d \n"),inst._arg2,inst._arg3);
 				scprintf(_SC(" %d %d \n"),inst._arg2,inst._arg3);
@@ -127,7 +159,7 @@ void SQFuncState::Dump(SQFunctionProto *func)
 					while(((refidx=_table(_literals)->Next(false,refo,key,val))!= -1) && (_integer(val) != lidx)) {
 					while(((refidx=_table(_literals)->Next(false,refo,key,val))!= -1) && (_integer(val) != lidx)) {
 						refo = refidx;
 						refo = refidx;
 				}
 				}
-				DumpLiteral(key);
+				SQDumpLiteral(key);
 				scprintf(_SC("\n"));
 				scprintf(_SC("\n"));
 			}
 			}
 			}
 			}
@@ -362,10 +394,12 @@ SQInteger SQFuncState::GetOuterVariable(const SQObject &name)
 	return -1;
 	return -1;
 }
 }
 
 
-void SQFuncState::AddParameter(const SQObject &name, SQInteger scope, SQInteger type)
+SQInteger SQFuncState::AddParameter(const SQObject &name, SQInteger scope, SQInteger type)
 {
 {
-	PushLocalVariable(name, scope, type);
+	SQInteger rc = PushLocalVariable(name, scope, type);
+	if(rc < 0) return rc;
 	_parameters.push_back(name);
 	_parameters.push_back(name);
+	return rc;
 }
 }
 
 
 void SQFuncState::AddParameterTypeName(const SQObject &type_name)
 void SQFuncState::AddParameterTypeName(const SQObject &type_name)

+ 2 - 1
SquiLu/squirrel/sqfuncstate.h

@@ -29,7 +29,7 @@ struct SQFuncState
 	SQInteger GetNumericConstant(const SQInteger cons);
 	SQInteger GetNumericConstant(const SQInteger cons);
 	SQInteger GetNumericConstant(const SQFloat cons);
 	SQInteger GetNumericConstant(const SQFloat cons);
 	SQInteger PushLocalVariable(const SQObject &name, SQInteger scope, SQInteger type=_VAR_ANY);
 	SQInteger PushLocalVariable(const SQObject &name, SQInteger scope, SQInteger type=_VAR_ANY);
-	void AddParameter(const SQObject &name, SQInteger scope, SQInteger type=_VAR_ANY);
+	SQInteger AddParameter(const SQObject &name, SQInteger scope, SQInteger type=_VAR_ANY);
 	void AddParameterTypeName(const SQObject &type_name);
 	void AddParameterTypeName(const SQObject &type_name);
 	void AddParameterTypeName(const SQChar *type_name);
 	void AddParameterTypeName(const SQChar *type_name);
 	void SetReturnTypeName(const SQChar *type_name);
 	void SetReturnTypeName(const SQChar *type_name);
@@ -95,6 +95,7 @@ private:
 	SQSharedState *_ss;
 	SQSharedState *_ss;
 };
 };
 
 
+void SQDumpLiteral(SQObjectPtr &o);
 
 
 #endif //_SQFUNCSTATE_H_
 #endif //_SQFUNCSTATE_H_
 
 

+ 23 - 3
SquiLu/squirrel/sqmem.cpp

@@ -3,11 +3,31 @@
 */
 */
 #include "sqpcheader.h"
 #include "sqpcheader.h"
 #ifndef SQ_EXCLUDE_DEFAULT_MEMFUNCTIONS
 #ifndef SQ_EXCLUDE_DEFAULT_MEMFUNCTIONS
-void *sq_vm_malloc(SQUnsignedInteger size){ return malloc(size); }
+#ifdef SQ_DEBUG_MEMORY
+int _sq_total_malloc = 0;
+int _sq_total_realloc = 0;
+int _sq_total_free = 0;
+#endif
+void *sq_vm_malloc(SQUnsignedInteger size){
+#ifdef SQ_DEBUG_MEMORY
+    ++_sq_total_malloc;
+#endif
+    return malloc(size);
+}
 
 
-void *sq_vm_realloc(void *p, SQUnsignedInteger SQ_UNUSED_ARG(oldsize), SQUnsignedInteger size){ return realloc(p, size); }
+void *sq_vm_realloc(void *p, SQUnsignedInteger SQ_UNUSED_ARG(oldsize), SQUnsignedInteger size){
+#ifdef SQ_DEBUG_MEMORY
+    ++_sq_total_realloc;
+#endif
+    return realloc(p, size);
+}
 
 
-void sq_vm_free(void *p, SQUnsignedInteger SQ_UNUSED_ARG(size)){ free(p); }
+void sq_vm_free(void *p, SQUnsignedInteger SQ_UNUSED_ARG(size)){
+#ifdef SQ_DEBUG_MEMORY
+    ++_sq_total_free;
+#endif
+    free(p);
+}
 #endif
 #endif
 
 
 #ifdef CUSTOM_DELETE_OPERATOR
 #ifdef CUSTOM_DELETE_OPERATOR

+ 11 - 6
SquiLu/squirrel/sqobject.cpp

@@ -892,16 +892,21 @@ bool SQFunctionProto::SaveAsSource(SQVM *v,SQUserPointer up,SQWRITEFUNC write)
                     SQLocalVarInfo &lvi2=_localvarinfos[nlocalvarinfos-1-inst._arg2];
                     SQLocalVarInfo &lvi2=_localvarinfos[nlocalvarinfos-1-inst._arg2];
                     const SQChar *str_name2 =  sq_isstring(lvi2._name) ? _stringval(lvi2._name) : "?";
                     const SQChar *str_name2 =  sq_isstring(lvi2._name) ? _stringval(lvi2._name) : "?";
                     SafeWriteFmt(v,write,up,"\t\t/* stk[" _PRINT_INT_FMT "] = stk[" _PRINT_INT_FMT "](\"%s\") %s stk[" _PRINT_INT_FMT "](\"%s\") */",
                     SafeWriteFmt(v,write,up,"\t\t/* stk[" _PRINT_INT_FMT "] = stk[" _PRINT_INT_FMT "](\"%s\") %s stk[" _PRINT_INT_FMT "](\"%s\") */",
-                                (SQInteger)inst._arg0, (SQInteger)inst._arg1, str_name1, SQGetArithOpName(inst.op), (SQInteger)inst._arg2, str_name2);
+                                (SQInteger)inst._arg0, (SQInteger)inst._arg2, str_name2, SQGetArithOpName(inst.op), (SQInteger)inst._arg1, str_name1);
             }
             }
             break;
             break;
-            case _OP_INCL:
-                    SafeWriteFmt(v,write,up,"\t\t/* stk[" _PRINT_INT_FMT "] = stk[" _PRINT_INT_FMT "] + sarg3(%c) */",
-                                (SQInteger)inst._arg1, (SQInteger)inst._arg1, ((char)inst._arg3));
+            case _OP_PINC:
+            case _OP_INC:
+                    SafeWriteFmt(v,write,up,"\t\t/* target = stk(" _PRINT_INT_FMT "); stk[" _PRINT_INT_FMT "] = stk[" _PRINT_INT_FMT "][stk[" _PRINT_INT_FMT "]] + sarg3(%d) */",
+                                (SQInteger)inst._arg0, (SQInteger)inst._arg0, (SQInteger)inst._arg1, (SQInteger)inst._arg2, ((int)inst._arg3));
             break;
             break;
             case _OP_PINCL:
             case _OP_PINCL:
-                    SafeWriteFmt(v,write,up,"\t\t/* target = stk(" _PRINT_INT_FMT "); stk[" _PRINT_INT_FMT "] = stk[" _PRINT_INT_FMT "] + sarg3(%c) */",
-                                (SQInteger)inst._arg1, (SQInteger)inst._arg1, (SQInteger)inst._arg1, ((char)inst._arg3));
+                    SafeWriteFmt(v,write,up,"\t\t/* stk[" _PRINT_INT_FMT "] = stk[" _PRINT_INT_FMT "]; stk[" _PRINT_INT_FMT "] += arg3(%d) */",
+                                (SQInteger)inst._arg0, (SQInteger)inst._arg1, (SQInteger)inst._arg1, ((int)inst._arg3));
+            break;
+            case _OP_INCL:
+                    SafeWriteFmt(v,write,up,"\t\t/* stk[" _PRINT_INT_FMT "] = stk[" _PRINT_INT_FMT "] + sarg3(%d) */",
+                                (SQInteger)inst._arg0, (SQInteger)inst._arg1, ((int)inst._arg3));
             break;
             break;
             case _OP_BITW:
             case _OP_BITW:
                     SafeWriteFmt(v,write,up,"\t\t/* stk[" _PRINT_INT_FMT "] = stk[" _PRINT_INT_FMT "] %s stk[" _PRINT_INT_FMT "] */",
                     SafeWriteFmt(v,write,up,"\t\t/* stk[" _PRINT_INT_FMT "] = stk[" _PRINT_INT_FMT "] %s stk[" _PRINT_INT_FMT "] */",