Browse Source

Expose the max_includes compiler parameter to scripts and api

mingodad 9 years ago
parent
commit
7953e0bbf2

+ 24 - 24
SquiLu-ext/sq_mix.cpp

@@ -4,7 +4,7 @@
 #define MixInteger SQInteger
 #define MixInteger SQInteger
 #include "code_mix_prep.c"
 #include "code_mix_prep.c"
 
 
-/* Generic loader function. Load the data found in the state in the lua engine
+/* Generic loader function. Load the data found in the state in the squilu engine
  */
  */
 static SQRESULT mix_loadbuffer(HSQUIRRELVM sqvm, mix_state_t *S, const SQChar *name, int isParseOnly) {
 static SQRESULT mix_loadbuffer(HSQUIRRELVM sqvm, mix_state_t *S, const SQChar *name, int isParseOnly) {
 	SQRESULT res;
 	SQRESULT res;
@@ -31,7 +31,7 @@ static SQRESULT mix_loadbuffer(HSQUIRRELVM sqvm, mix_state_t *S, const SQChar *n
 	}
 	}
 	else
 	else
 	{
 	{
-        res = sq_compile(sqvm, sq_mix_reader_char, S, name, SQTrue, SQTrue);
+        res = sq_compile(sqvm, sq_mix_reader_char, S, name, SQTrue, SQTrue, SQ_MAX_INCLUDE_FILES);
         if (S->error != NULL) {
         if (S->error != NULL) {
             return sq_throwerror(sqvm, S->error);
             return sq_throwerror(sqvm, S->error);
         } else if (res != 0) {
         } else if (res != 0) {
@@ -66,14 +66,14 @@ static SQRESULT mix_stateopt(HSQUIRRELVM sqvm, mix_state_t *S) {
 	S->exprsize = expr_code_size;
 	S->exprsize = expr_code_size;
     if (S->exprsize == 0)
     if (S->exprsize == 0)
             return sq_throwerror(sqvm, _SC("expr separator cannot be empty"));
             return sq_throwerror(sqvm, _SC("expr separator cannot be empty"));
-
+
 	SQ_OPT_STRING(sqvm, 6, print_code, "mix_write");
 	SQ_OPT_STRING(sqvm, 6, print_code, "mix_write");
     if (print_code_size == 0)
     if (print_code_size == 0)
             return sq_throwerror(sqvm, _SC("mix_write function name cannot be empty"));
             return sq_throwerror(sqvm, _SC("mix_write function name cannot be empty"));
-
+
 
 
     snprintf(S->print_out, sizeof(S->print_out), "%s(\"", print_code);
     snprintf(S->print_out, sizeof(S->print_out), "%s(\"", print_code);
-	S->print_outsize = strlen(S->print_out);
+	S->print_outsize = strlen(S->print_out);
 	S->result_size = 0;
 	S->result_size = 0;
 	return 0;
 	return 0;
 }
 }
@@ -90,7 +90,7 @@ static SQRESULT mix_load_parse_file(HSQUIRRELVM sqvm, int isParse) {
 
 
 	file = fopen(filename, _SC("r"));
 	file = fopen(filename, _SC("r"));
 	if (file == NULL) {
 	if (file == NULL) {
-		return sq_throwerror(sqvm, _SC("cannot open file <%s>"), filename);
+		return sq_throwerror(sqvm, _SC("cannot open file <%s>"), filename);
 	}
 	}
 
 
 	fseek(file, 0, SEEK_END);
 	fseek(file, 0, SEEK_END);
@@ -100,9 +100,9 @@ static SQRESULT mix_load_parse_file(HSQUIRRELVM sqvm, int isParse) {
 	SQBlob buffer(0, S.size);
 	SQBlob buffer(0, S.size);
 	if (fread(buffer.GetBuf(), S.size, 1, file) != 1) {
 	if (fread(buffer.GetBuf(), S.size, 1, file) != 1) {
 		fclose(file);
 		fclose(file);
-		return sq_throwerror(sqvm, _SC("cannot read file <%s>"), filename);
+		return sq_throwerror(sqvm, _SC("cannot read file <%s>"), filename);
 	}
 	}
-	S.buffer = (const char*)buffer.GetBuf();
+	S.buffer = (const char*)buffer.GetBuf();
 	fclose(file);
 	fclose(file);
 
 
 	return mix_loadbuffer(sqvm, &S, filename, isParse);
 	return mix_loadbuffer(sqvm, &S, filename, isParse);
@@ -120,7 +120,7 @@ static SQRESULT mix_load_parse_string(HSQUIRRELVM sqvm, int isParse) {
 	mix_state_t S;
 	mix_state_t S;
 	sq_mix_init(&S, 0, 0, 0,0,0,0);
 	sq_mix_init(&S, 0, 0, 0,0,0,0);
 
 
-	sq_getstring(sqvm, 2, &S.buffer);
+	sq_getstring(sqvm, 2, &S.buffer);
 	S.size = sq_getsize(sqvm, 2);
 	S.size = sq_getsize(sqvm, 2);
 	mix_stateopt(sqvm, &S);
 	mix_stateopt(sqvm, &S);
 
 
@@ -136,27 +136,27 @@ static SQRESULT mix_parsestring(HSQUIRRELVM sqvm) {
 }
 }
 
 
 const SQChar validate_format_mask[] = _SC(".s s|o s|o s|o s");
 const SQChar validate_format_mask[] = _SC(".s s|o s|o s|o s");
-#define _DECL_MIX_FUNC(name,nparams,pmask) {_SC(#name), mix_##name,nparams,pmask}
-static SQRegFunction mix_obj_funcs[]={
-	_DECL_MIX_FUNC(parsefile,-2,validate_format_mask),
-	_DECL_MIX_FUNC(parsestring,-2,validate_format_mask),
-	_DECL_MIX_FUNC(loadfile,-2,validate_format_mask),
-	_DECL_MIX_FUNC(loadstring,-2,validate_format_mask),
-	{0,0}
-};
-#undef _DECL_MIX_FUNC
+#define _DECL_MIX_FUNC(name,nparams,pmask) {_SC(#name), mix_##name,nparams,pmask}
+static SQRegFunction mix_obj_funcs[]={
+	_DECL_MIX_FUNC(parsefile,-2,validate_format_mask),
+	_DECL_MIX_FUNC(parsestring,-2,validate_format_mask),
+	_DECL_MIX_FUNC(loadfile,-2,validate_format_mask),
+	_DECL_MIX_FUNC(loadstring,-2,validate_format_mask),
+	{0,0}
+};
+#undef _DECL_MIX_FUNC
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 extern "C" {
 extern "C" {
 #endif
 #endif
 /* This defines a function that opens up your library. */
 /* This defines a function that opens up your library. */
 SQRESULT sqext_register_mix (HSQUIRRELVM sqvm) {
 SQRESULT sqext_register_mix (HSQUIRRELVM sqvm) {
-    //add a namespace sqmix
-	sq_pushstring(sqvm,_SC("sqmix"),-1);
-	sq_newclass(sqvm,SQFalse);
-    sq_insert_reg_funcs(sqvm, mix_obj_funcs);
-	sq_newslot(sqvm,-3,SQTrue); //add sqmix table to the root table
-
+    //add a namespace sqmix
+	sq_pushstring(sqvm,_SC("sqmix"),-1);
+	sq_newclass(sqvm,SQFalse);
+    sq_insert_reg_funcs(sqvm, mix_obj_funcs);
+	sq_newslot(sqvm,-3,SQTrue); //add sqmix table to the root table
+
 	return SQ_OK;
 	return SQ_OK;
 }
 }
 
 

+ 3 - 2
SquiLu-ext/sq_slave_vm.cpp

@@ -305,11 +305,12 @@ static SQRESULT sq_slave_vm_compilestring(HSQUIRRELVM v)
     SQ_GET_STRING(v, 3, str_script);
     SQ_GET_STRING(v, 3, str_script);
     SQ_OPT_BOOL(v, 4, printerror, false);
     SQ_OPT_BOOL(v, 4, printerror, false);
     SQ_OPT_BOOL(v, 5, show_warnings, false);
     SQ_OPT_BOOL(v, 5, show_warnings, false);
+    SQ_OPT_INTEGER(v, 6, max_nested_includes, 0);
     SQInteger top = sq_gettop(self);
     SQInteger top = sq_gettop(self);
     SQRESULT result = SQ_ERROR;
     SQRESULT result = SQ_ERROR;
     sq_pushroottable(self);
     sq_pushroottable(self);
     sq_pushstring(self, func_name, func_name_size);
     sq_pushstring(self, func_name, func_name_size);
-    if(sq_compilebuffer(self, str_script, str_script_size, func_name, printerror, show_warnings) >= 0)
+    if(sq_compilebuffer(self, str_script, str_script_size, func_name, printerror, show_warnings, max_nested_includes) >= 0)
     {
     {
         result = sq_newslot(self, -3, SQFalse);
         result = sq_newslot(self, -3, SQFalse);
     }
     }
@@ -345,7 +346,7 @@ extern "C" {
         sq_insertfunc(v, _SC("_get"), sq_slave_vm_get, -2, get_set_validation_mask, SQFalse);
         sq_insertfunc(v, _SC("_get"), sq_slave_vm_get, -2, get_set_validation_mask, SQFalse);
         sq_insertfunc(v, _SC("dofile"), sq_slave_vm_dofile, -2, _SC("xsbbb"), SQFalse);
         sq_insertfunc(v, _SC("dofile"), sq_slave_vm_dofile, -2, _SC("xsbbb"), SQFalse);
         sq_insertfunc(v, _SC("loadfile"), sq_slave_vm_loadfile, -3, _SC("xssbb"), SQFalse);
         sq_insertfunc(v, _SC("loadfile"), sq_slave_vm_loadfile, -3, _SC("xssbb"), SQFalse);
-        sq_insertfunc(v, _SC("compilestring"), sq_slave_vm_compilestring, -3, _SC("xssbb"), SQFalse);
+        sq_insertfunc(v, _SC("compilestring"), sq_slave_vm_compilestring, -3, _SC("xssbbi"), SQFalse);
         sq_insertfunc(v, _SC("call"), sq_slave_vm_call, -3, _SC("xbs"), SQFalse);
         sq_insertfunc(v, _SC("call"), sq_slave_vm_call, -3, _SC("xbs"), SQFalse);
 
 
         sq_newslot(v,-3,SQTrue); //push sq_slave_vm class
         sq_newslot(v,-3,SQTrue); //push sq_slave_vm class

+ 5 - 2
SquiLu/include/sqapi.h

@@ -25,10 +25,13 @@ SQUIRREL_API_FUNC(SQInteger, getvmstate, (HSQUIRRELVM v))
 SQUIRREL_API_FUNC(SQInteger, getversion, ())
 SQUIRREL_API_FUNC(SQInteger, getversion, ())
 
 
 /*compiler*/
 /*compiler*/
+#ifndef SQ_MAX_INCLUDE_FILES
+#define SQ_MAX_INCLUDE_FILES 10
+#endif
 SQUIRREL_API_FUNC(SQRESULT, compile, (HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQChar *sourcename,
 SQUIRREL_API_FUNC(SQRESULT, compile, (HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQChar *sourcename,
-                                 SQBool raiseerror, SQBool show_warnings))
+                                 SQBool raiseerror, SQBool show_warnings, SQInteger max_nested_includes))
 SQUIRREL_API_FUNC(SQRESULT, compilebuffer, (HSQUIRRELVM v,const SQChar *s,SQInteger size,const SQChar *sourcename,
 SQUIRREL_API_FUNC(SQRESULT, compilebuffer, (HSQUIRRELVM v,const SQChar *s,SQInteger size,const SQChar *sourcename,
-                                       SQBool raiseerror, SQBool show_warnings))
+                                       SQBool raiseerror, SQBool show_warnings, SQInteger max_nested_includes))
 SQUIRREL_API_FUNC(void, enabledebuginfo, (HSQUIRRELVM v, SQBool enable))
 SQUIRREL_API_FUNC(void, enabledebuginfo, (HSQUIRRELVM v, SQBool enable))
 SQUIRREL_API_FUNC(void, notifyallexceptions, (HSQUIRRELVM v, SQBool enable))
 SQUIRREL_API_FUNC(void, notifyallexceptions, (HSQUIRRELVM v, SQBool enable))
 SQUIRREL_API_FUNC(void, setcompilererrorhandler, (HSQUIRRELVM v,SQCOMPILERERROR f))
 SQUIRREL_API_FUNC(void, setcompilererrorhandler, (HSQUIRRELVM v,SQCOMPILERERROR f))

+ 3 - 3
SquiLu/sq/sq.c

@@ -113,7 +113,7 @@ void loadDefaultScript(HSQUIRRELVM v, const char *script)
     SQChar srcBoot[256];
     SQChar srcBoot[256];
     scsprintf(srcBoot, sizeof(srcBoot), _SC("dofile(\"%s\", false);"), script);
     scsprintf(srcBoot, sizeof(srcBoot), _SC("dofile(\"%s\", false);"), script);
 
 
-    if(SQ_SUCCEEDED(sq_compilebuffer(v,srcBoot, strlen(srcBoot), _SC("defaultScript"), SQTrue, SQTrue))) {
+    if(SQ_SUCCEEDED(sq_compilebuffer(v,srcBoot, strlen(srcBoot), _SC("defaultScript"), SQTrue, SQTrue, SQ_MAX_INCLUDE_FILES))) {
         int callargs = 1;
         int callargs = 1;
         sq_pushroottable(v);
         sq_pushroottable(v);
         callargs += push_program_args(v, 0, sq_main_argc, sq_main_argv, 0);
         callargs += push_program_args(v, 0, sq_main_argc, sq_main_argv, 0);
@@ -357,7 +357,7 @@ void Interactive(HSQUIRRELVM v)
 		i=scstrlen(buffer);
 		i=scstrlen(buffer);
 		if(i>0){
 		if(i>0){
 			SQInteger oldtop=sq_gettop(v);
 			SQInteger oldtop=sq_gettop(v);
-			if(SQ_SUCCEEDED(sq_compilebuffer(v,buffer,i,_SC("interactive console"),SQTrue, SQTrue))){
+			if(SQ_SUCCEEDED(sq_compilebuffer(v,buffer,i,_SC("interactive console"),SQTrue, SQTrue, SQ_MAX_INCLUDE_FILES))){
 				sq_pushroottable(v);
 				sq_pushroottable(v);
 				if(SQ_SUCCEEDED(sq_call(v,1,retval,SQTrue)) &&	retval){
 				if(SQ_SUCCEEDED(sq_call(v,1,retval,SQTrue)) &&	retval){
 					scprintf(_SC("\n"));
 					scprintf(_SC("\n"));
@@ -536,7 +536,7 @@ static SQInteger LoadFrozenScript(HSQUIRRELVM v, const SQChar* filename, int onl
 
 
     chngChar(srcBoot, '\\', '/');
     chngChar(srcBoot, '\\', '/');
 
 
-    if(SQ_SUCCEEDED(sq_compilebuffer(v,srcBoot, scr_len, _SC("bootScript"), SQTrue, SQTrue))) {
+    if(SQ_SUCCEEDED(sq_compilebuffer(v,srcBoot, scr_len, _SC("bootScript"), SQTrue, SQTrue, SQ_MAX_INCLUDE_FILES))) {
         int callargs = 1;
         int callargs = 1;
         sq_pushroottable(v);
         sq_pushroottable(v);
         callargs += push_program_args(v, 0, sq_main_argc, sq_main_argv, 0);
         callargs += push_program_args(v, 0, sq_main_argc, sq_main_argv, 0);

+ 2 - 2
SquiLu/sqstdlib/sqstdio.cpp

@@ -393,7 +393,7 @@ SQRESULT sqstd_loadfile(HSQUIRRELVM v,const SQChar *filename,SQBool printerror,S
 			buffer.size = 0;
 			buffer.size = 0;
 			buffer.file = file;
 			buffer.file = file;
 
 
-			if(SQ_SUCCEEDED(sq_compile(v,func,&buffer,filename,printerror,show_warnings))){
+			if(SQ_SUCCEEDED(sq_compile(v,func,&buffer,filename,printerror,show_warnings, SQ_MAX_INCLUDE_FILES))){
 				sqstd_fclose(file);
 				sqstd_fclose(file);
 				return SQ_OK;
 				return SQ_OK;
 			}
 			}
@@ -489,7 +489,7 @@ SQInteger _g_io_loadstring(HSQUIRRELVM v)
     }
     }
     else
     else
     {
     {
-        rc = sq_compilebuffer(v, dump, size, _SC("loadstring"), SQFalse, SQFalse);
+        rc = sq_compilebuffer(v, dump, size, _SC("loadstring"), SQFalse, SQFalse, SQ_MAX_INCLUDE_FILES);
     }
     }
 	return rc < 0 ? rc : 1;
 	return rc < 0 ? rc : 1;
 }
 }

+ 4 - 4
SquiLu/squirrel/sqapi.cpp

@@ -152,11 +152,11 @@ SQInteger sq_getversion()
 }
 }
 
 
 SQRESULT sq_compile(HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQChar *sourcename
 SQRESULT sq_compile(HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQChar *sourcename
-                    ,SQBool raiseerror, SQBool show_warnings)
+                    ,SQBool raiseerror, SQBool show_warnings, SQInteger max_nested_includes)
 {
 {
 	SQObjectPtr o;
 	SQObjectPtr o;
 #ifndef SQ_NO_COMPILER
 #ifndef SQ_NO_COMPILER
-	if(Compile(v, read, p, sourcename, o, raiseerror?true:false, _ss(v)->_debuginfo, show_warnings)) {
+	if(Compile(v, read, p, sourcename, o, raiseerror?true:false, _ss(v)->_debuginfo, show_warnings, max_nested_includes)) {
 		v->Push(SQClosure::Create(_ss(v), _funcproto(o), _table(v->_roottable)->GetWeakRef(OT_TABLE)));
 		v->Push(SQClosure::Create(_ss(v), _funcproto(o), _table(v->_roottable)->GetWeakRef(OT_TABLE)));
 		return SQ_OK;
 		return SQ_OK;
 	}
 	}
@@ -1931,12 +1931,12 @@ SQInteger sq_strbuf_lexfeed(SQUserPointer file)
 }
 }
 
 
 SQRESULT sq_compilebuffer(HSQUIRRELVM v,const SQChar *s,SQInteger size,const SQChar *sourcename,
 SQRESULT sq_compilebuffer(HSQUIRRELVM v,const SQChar *s,SQInteger size,const SQChar *sourcename,
-                          SQBool raiseerror, SQBool show_warnings) {
+                          SQBool raiseerror, SQBool show_warnings, SQInteger max_nested_includes) {
 	SQStrBufState buf;
 	SQStrBufState buf;
 	buf.buf = s;
 	buf.buf = s;
 	buf.size = size;
 	buf.size = size;
 	buf.ptr = 0;
 	buf.ptr = 0;
-	return sq_compile(v, sq_strbuf_lexfeed, &buf, sourcename, raiseerror, show_warnings);
+	return sq_compile(v, sq_strbuf_lexfeed, &buf, sourcename, raiseerror, show_warnings, max_nested_includes);
 }
 }
 
 
 void sq_move(HSQUIRRELVM dest,HSQUIRRELVM src,SQInteger idx)
 void sq_move(HSQUIRRELVM dest,HSQUIRRELVM src,SQInteger idx)

+ 3 - 2
SquiLu/squirrel/sqbaselib.cpp

@@ -323,7 +323,8 @@ static SQRESULT base_compilestring(HSQUIRRELVM v)
     SQ_GET_STRING(v, 2, src);
     SQ_GET_STRING(v, 2, src);
     SQ_OPT_STRING(v, 3, name, _SC("unnamedbuffer"));
     SQ_OPT_STRING(v, 3, name, _SC("unnamedbuffer"));
     SQ_OPT_BOOL(v, 4, show_wanings, SQTrue);
     SQ_OPT_BOOL(v, 4, show_wanings, SQTrue);
-    if(SQ_SUCCEEDED(sq_compilebuffer(v,src,src_size,name,SQFalse, show_wanings)))
+    SQ_OPT_INTEGER(v, 5, max_includes, 0);
+    if(SQ_SUCCEEDED(sq_compilebuffer(v,src,src_size,name,SQFalse, show_wanings, max_includes)))
         return 1;
         return 1;
     else
     else
         return SQ_ERROR;
         return SQ_ERROR;
@@ -538,7 +539,7 @@ static SQRegFunction base_funcs[]={
 	{_SC("error"),base_error,2, NULL},
 	{_SC("error"),base_error,2, NULL},
 	{_SC("get_last_error"),base_get_last_error,1, NULL},
 	{_SC("get_last_error"),base_get_last_error,1, NULL},
 	{_SC("get_last_stackinfo"),base_get_last_stackinfo,1, NULL},
 	{_SC("get_last_stackinfo"),base_get_last_stackinfo,1, NULL},
-	{_SC("compilestring"),base_compilestring,-2, _SC(".ssb")},
+	{_SC("compilestring"),base_compilestring,-2, _SC(".ssbi")},
 	{_SC("newthread"),base_newthread,2, _SC(".c")},
 	{_SC("newthread"),base_newthread,2, _SC(".c")},
 	{_SC("suspend"),base_suspend,-1, NULL},
 	{_SC("suspend"),base_suspend,-1, NULL},
 	{_SC("array"),base_array,-2, _SC(".n")},
 	{_SC("array"),base_array,-2, _SC(".n")},