Browse Source

Fixes for sq_slave_vm been able to report erros, also the lexer now ignore unicode escape "\u" instead of give an error.
Also when creating a slave vm the sq_stdlib is not included by default, if we want it we need to pass a second parameter boolean true:
local vm = SlaveVM(1024, true);

mingodad 10 years ago
parent
commit
10d0334739

+ 23 - 10
SquiLu-ext/sq_slave_vm.cpp

@@ -133,20 +133,24 @@ static SQRESULT sq_slave_vm_constructor (HSQUIRRELVM v)
 {
     SQ_FUNC_VARS(v);
     SQ_OPT_INTEGER(v, 2, stack_size, 1024);
+    SQ_OPT_BOOL(v, 3, with_libraries, false);
     HSQUIRRELVM self = sq_open(stack_size);
 
     /* Initialize environment */
     sq_setprintfunc(self,sq_getprintfunc(v),sq_geterrorfunc(v));
 
-    /* load base libraries */
-    sq_pushroottable(self);
-
-    sqstd_register_bloblib(self);
-    sqstd_register_iolib(self);
-    sqstd_register_systemlib(self);
-    sqstd_register_mathlib(self);
-    sqstd_register_stringlib(self);
-    sq_poptop(self); //remove root table
+    if(with_libraries)
+    {
+        /* load base libraries */
+        sq_pushroottable(self);
+
+        sqstd_register_bloblib(self);
+        sqstd_register_iolib(self);
+        sqstd_register_systemlib(self);
+        sqstd_register_mathlib(self);
+        sqstd_register_stringlib(self);
+        sq_poptop(self); //remove root table
+    }
 
     sq_setinstanceup(v, 1, self);
     sq_setreleasehook(v, 1, sq_slave_vm_release_hook);
@@ -309,6 +313,15 @@ static SQRESULT sq_slave_vm_compilestring(HSQUIRRELVM v)
     {
         result = sq_newslot(self, -3, SQFalse);
     }
+    else
+    {
+        const SQChar *last_error = sq_getlasterror_str(self);
+        if(last_error) {
+            SQInteger line, column;
+            sq_getlasterror_line_col(self, &line, &column);
+            result = sq_throwerror(v, _SC("compilestring %s %d:%d: %s"), func_name, line, column, last_error);
+        }
+    }
     sq_settop(self, top);
     return result;
 }
@@ -323,7 +336,7 @@ extern "C" {
         sq_pushstring(v,sq_slave_vm_TAG, -1);
         sq_newclass(v, SQFalse);
         sq_settypetag(v,-1,(void*)sq_slave_vm_TAG);
-        sq_insertfunc(v, _SC("constructor"), sq_slave_vm_constructor, -1, _SC("xi"), SQFalse);
+        sq_insertfunc(v, _SC("constructor"), sq_slave_vm_constructor, -1, _SC("xib"), SQFalse);
         sq_insertfunc(v, _SC("_tostring"), sq_slave_vm__tostring, 1, _SC("x"), SQFalse);
         sq_insertfunc(v, _SC("close"), sq_slave_vm_close, 1, _SC("x"), SQFalse);
         sq_insertfunc(v, _SC("set"), sq_slave_vm_set, 3, get_set_validation_mask, SQFalse);

+ 2 - 1
SquiLu/include/squirrel.h

@@ -521,7 +521,8 @@ SQUIRREL_API SQRESULT sq_throwerror(HSQUIRRELVM v,const SQChar *fmt, ...);
 SQUIRREL_API SQRESULT sq_throwobject(HSQUIRRELVM v);
 SQUIRREL_API void sq_reseterror(HSQUIRRELVM v);
 SQUIRREL_API void sq_getlasterror(HSQUIRRELVM v);
-const SQChar *sq_getlasterror_str(HSQUIRRELVM v);
+SQUIRREL_API const SQChar *sq_getlasterror_str(HSQUIRRELVM v);
+SQUIRREL_API void sq_getlasterror_line_col(HSQUIRRELVM v, SQInteger *line, SQInteger *column);
 
 /*raw object handling*/
 SQUIRREL_API SQRESULT sq_getstackobj(HSQUIRRELVM v,SQInteger idx,HSQOBJECT *po);

+ 6 - 6
SquiLu/samples/dump-har.nut

@@ -13,7 +13,7 @@ function json2var(json) {
 	
 	//debug_print(json, "\n");
 	//convert new data from json to squilu table for merge
-	vm.compilestring(slave_func, "return " + json);
+	vm.compilestring(slave_func, "return " + json, true, true);
 	local tbl = vm.call(true, slave_func);
 	return tbl;
 }
@@ -45,10 +45,10 @@ local folders_made = {};
 function getPath(url)
 {
 	local ary = url.split('/');
-	for(local i = 2, len = ary.len()-1; i < len; ++i)
+	for(local i = 1, len = ary.len()-1; i < len; ++i)
 	{
-		print(i,ary[i]);
-		local folder = ary.slice(2, i+1).join("/");
+		//print(i,ary[i]);
+		local folder = ary.slice(1, i+1).join("/");
 		local cmd = format("mkdir %s", dest_folder + folder);
 		if(!folders_made.rawget(folder, false))
 		{
@@ -57,7 +57,7 @@ function getPath(url)
 			folders_made.rawset(folder, true);
 		}
 	}
-	local path = ary.slice(2).join("/");
+	local path = ary.slice(1).join("/");
 	//print(path);
 	return path;
 }
@@ -75,7 +75,7 @@ function dumpContent(vhar)
 		}
 		if( ventry.response.content.mimeType == "text/html")
 		{
-			if(!path.indexOf(".htm"))
+			if(path.indexOf(".htm") < 0)
 			{
 				path = getPath(url + "/index.html");
 			}

+ 2 - 0
SquiLu/squirrel/sqcompiler.cpp

@@ -375,6 +375,8 @@ public:
 					_lex._currentline, _lex._currentcolumn);
 			}
 			_vm->_lasterror = SQString::Create(_ss(_vm), _compilererror, -1);
+			_vm->_lasterror_line = _lex._currentline;
+			_vm->_lasterror_column = _lex._currentcolumn;
 			return false;
 		}
 		return true;

+ 1 - 0
SquiLu/squirrel/sqlexer.cpp

@@ -458,6 +458,7 @@ SQInteger SQLexer::ReadString(SQInteger ndelim,bool verbatim)
 					case _SC('\\'): APPEND_CHAR(_SC('\\')); NEXT(); break;
 					case _SC('"'): APPEND_CHAR(_SC('"')); NEXT(); break;
 					case _SC('\''): APPEND_CHAR(_SC('\'')); NEXT(); break;
+					case _SC('u'): NEXT(); break; //unicode escape leave as is
 					default:
 						Error(_SC("unrecognised escaper char"));
 					break;

+ 2 - 0
SquiLu/squirrel/sqvm.cpp

@@ -130,6 +130,8 @@ SQVM::SQVM(SQSharedState *ss)
 	_nnativecalls = 0;
 	_nmetamethodscall = 0;
 	_lasterror.Null();
+	_lasterror_line = 0;
+	_lasterror_column = 0;
 	memset(&_lasterror_stackinfo, 0, sizeof(SQStackInfos));
 	_errorhandler.Null();
 	_atexithandler.Null();

+ 1 - 0
SquiLu/squirrel/sqvm.h

@@ -164,6 +164,7 @@ public:
 	SQOuter	*_openouters;
 	SQObjectPtr _roottable;
 	SQObjectPtr _lasterror;
+	SQInteger _lasterror_line, _lasterror_column;
 	SQStackInfos _lasterror_stackinfo;
 	SQObjectPtr _errorhandler;
 	SQObjectPtr _atexithandler;