Explorar el Código

Start implementing infrastructure to create a loadable module system instead of load everything global.

mingodad hace 9 años
padre
commit
5bcecc3d36
Se han modificado 5 ficheros con 178 adiciones y 101 borrados
  1. 42 32
      SquiLu-ext/sq_mongoose.cpp
  2. 20 0
      SquiLu-ext/sq_slave_vm.cpp
  3. 2 1
      SquiLu/include/sqapi.h
  4. 97 67
      SquiLu/sq/sq.c
  5. 17 1
      SquiLu/squirrel/sqapi.cpp

+ 42 - 32
SquiLu-ext/sq_mongoose.cpp

@@ -1077,6 +1077,41 @@ SQRESULT sqext_register_pcre2(HSQUIRRELVM v);
 } /*extern "C"*/
 #endif
 
+static sq_modules_preload_st modules_preload[] = {
+    {"blob", sqstd_register_bloblib},
+    {"io", sqstd_register_iolib},
+    {"math", sqstd_register_mathlib},
+    {"sys", sqstd_register_systemlib},
+    {"string", sqstd_register_stringlib},
+    {"base64", sqext_register_base64},
+    {"fpdf", sqext_register_Sq_Fpdf},
+    {"sqlite3", sqext_register_SQLite3},
+    {"zlib", sqext_register_sq_zlib},
+#if defined(SQ_USE_PCRE2) || defined(SQ_USE_PCRE2_STATIC)
+    {"pcre2", sqext_register_pcre2},
+#endif
+#ifdef SQ_USE_CBLOSC
+    {"blosc", sqext_register_sq_blosc},
+#endif // SQ_USE_CBLOSC
+#ifdef WITH_MYSQL
+    {"mysql", sqext_register_MySQL},
+#endif
+#ifdef WITH_POSTGRESQL
+    {"postgresql", sqext_register_PostgreSQL},
+#endif
+    {"sqfs", sqext_register_sqfs},
+    {"mix", sqext_register_mix},
+    {"socket", sqext_register_sq_socket},
+    {"slave_vm", sqext_register_sq_slave_vm},
+#ifdef USE_AXTLS
+    {"axtls", sqext_register_axtls},
+#endif
+#ifdef USE_OPENSSL
+    {"openssl", sqext_register_openssl},
+#endif
+    {NULL, NULL}
+};
+
 void sq_printfunc(HSQUIRRELVM v,const SQChar *s,...)
 {
 	va_list vl;
@@ -1116,38 +1151,13 @@ static HSQUIRRELVM my_new_squirrel(struct mg_context *ctx) {
 
     sq_pushroottable(v);
 
-	sqstd_register_bloblib(v);
-	sqstd_register_iolib(v);
-	sqstd_register_systemlib(v);
-	sqstd_register_mathlib(v);
-	sqstd_register_stringlib(v);
-	sqstd_register_stringlib(v);
-	sqext_register_base64(v);
-	sqext_register_Sq_Fpdf(v);
-	sqext_register_SQLite3(v);
-	sqext_register_sq_zlib(v);
-#if defined(SQ_USE_PCRE2) || defined(SQ_USE_PCRE2_STATIC)
-    sqext_register_pcre2(v);
-#endif
-#ifdef SQ_USE_CBLOSC
-	sqext_register_sq_blosc(v);
-#endif // SQ_USE_CBLOSC
-#ifdef WITH_MYSQL
-	sqext_register_MySQL(v);
-#endif
-#ifdef WITH_POSTGRESQL
-	sqext_register_PostgreSQL(v);
-#endif
-	sqext_register_sqfs(v);
-	sqext_register_mix(v);
-	sqext_register_sq_socket(v);
-	sqext_register_sq_slave_vm(v);
-#ifdef USE_AXTLS
-	sqext_register_axtls(v);
-#endif
-#ifdef USE_OPENSSL
-	sqext_register_openssl(v);
-#endif
+    sq_modules_preload_st *mp = modules_preload;
+    sq_preload_modules(v, mp);
+
+    while(mp->module_load_func){
+      mp->module_load_func(v);
+      ++mp;
+    }
 
     sq_pushstring(v,sq_http_request_TAG, -1);
     sq_newclass(v,SQFalse);

+ 20 - 0
SquiLu-ext/sq_slave_vm.cpp

@@ -267,6 +267,25 @@ static SQRESULT sq_slave_vm_constructor (HSQUIRRELVM v)
     return 1;
 }
 
+static SQRESULT sq_slave_vm_preload_lib (HSQUIRRELVM v)
+{
+    SQ_FUNC_VARS_NO_TOP(v);
+    GET_sq_slave_vm_INSTANCE(v, 1);
+    SQ_GET_STRING(v, 2, module_name);
+
+    SQFUNCTION sq_func = sq_get_preload_module_func(v, module_name);
+    SQBool rc =  sq_func != NULL;
+    if(rc)
+    {
+        sq_pushroottable(svm);
+        sq_func(svm);
+        sq_poptop(svm); //remove root table
+    }
+
+    sq_pushbool(v, rc);
+    return 1;
+}
+
 #ifdef SLAVE_VM_WITH_OS_THREADS
 static SQRESULT checkTryLock(HSQUIRRELVM v, SlaveVM_st *self)
 {
@@ -681,6 +700,7 @@ extern "C" {
         sq_insertfunc(v, _SC("thread_master_state"), sq_slave_vm_thread_master_state, -1, _SC("xi"), SQFalse);
         sq_insertfunc(v, _SC("thread_slave_state"), sq_slave_vm_thread_slave_state, 1, _SC("x"), SQFalse);
 #endif // SLAVE_VM_WITH_OS_THREADS
+        sq_insertfunc(v, _SC("preload_lib"), sq_slave_vm_preload_lib, 2, _SC("xs"), SQFalse);
 
         sq_newslot(v,-3,SQTrue); //push sq_slave_vm class
         return 0;

+ 2 - 1
SquiLu/include/sqapi.h

@@ -1,4 +1,5 @@
-SQUIRREL_API_FUNC(SQRESULT, preload_modules, (HSQUIRRELVM v, sq_modules_preload_st *modules))
+SQUIRREL_API_FUNC(SQRESULT, preload_modules, (HSQUIRRELVM v, const sq_modules_preload_st *modules))
+SQUIRREL_API_FUNC(SQFUNCTION, get_preload_module_func, (HSQUIRRELVM v, const SQChar *module_name))
 
 /*vm*/
 SQUIRREL_API_FUNC(HSQUIRRELVM, open, (SQInteger initialstacksize))

+ 97 - 67
SquiLu/sq/sq.c

@@ -585,104 +585,134 @@ SQRESULT sqext_register_xjd1(HSQUIRRELVM v);
 SQRESULT sqext_register_libclang(HSQUIRRELVM v);
 SQRESULT sqext_register_EasyCurl (HSQUIRRELVM v);
 SQRESULT sqext_register_tweetnacl(HSQUIRRELVM v);
+SQRESULT sqext_register_ipc (HSQUIRRELVM v);
+SQRESULT sqext_register_BitVector (HSQUIRRELVM v); //depends on sqlite3
 SQRESULT sqext_register_pack(HSQUIRRELVM v);
-
-int main(int argc, char* argv[])
-{
-    sq_main_argc = argc;
-    sq_main_argv = argv;
-
-	HSQUIRRELVM v;
-	SQInteger retval = 0;
-	//const SQChar *filename=NULL;
-#if defined(_MSC_VER) && defined(_DEBUG)
-	_CrtSetAllocHook(MemAllocHook);
-#endif
-
-	v=sq_open(1024);
-	sq_setprintfunc(v,printfunc,errorfunc);
-
-	sq_pushroottable(v);
-/*
-    sq_pushstring(v, _SC("sq_xinterpreter"), -1);
-    sq_pushstring(v, argv[0], -1);
-    sq_newslot(v,-3,SQFalse);
-*/
-
-	sqstd_register_bloblib(v);
-	sqstd_register_iolib(v);
-	sqstd_register_systemlib(v);
-	sqstd_register_mathlib(v);
-	sqstd_register_stringlib(v);
-
+SQRESULT sqext_register_sq_blosc(HSQUIRRELVM v);
+SQRESULT sqext_register_pcre(HSQUIRRELVM v);
+SQRESULT sqext_register_pcre2(HSQUIRRELVM v);
+SQRESULT sqext_register_freetype(HSQUIRRELVM v);
+
+static sq_modules_preload_st modules_preload[] = {
+    {"blob", sqstd_register_bloblib},
+    {"io", sqstd_register_iolib},
+    {"math", sqstd_register_mathlib},
+    {"sys", sqstd_register_systemlib},
+    {"string", sqstd_register_stringlib},
 #ifdef WITH_DAD_EXTRAS
 #ifndef SQUILU_ALONE
-    sqext_register_SQLexer(v);
-	sqext_register_gumbo(v);
-	sqext_register_base64(v);
-	sqext_register_Sq_Fpdf(v);
-	sqext_register_SQLite3(v);
-	sqext_register_xjd1(v);
-	sqext_register_mix(v);
-	sqext_register_sqfs(v);
-	sqext_register_sq_socket(v);
-	sqext_register_tweetnacl(v);
-	sqext_register_pack(v);
+    {"sqlexer", sqext_register_SQLexer},
+    {"gumbo", sqext_register_gumbo},
+    {"base64", sqext_register_base64},
+    {"fpdf", sqext_register_Sq_Fpdf},
+    {"sqlite3", sqext_register_SQLite3},
+    {"bitvector", sqext_register_BitVector}, //depends on sqlite3
+    //{"xdj1", sqext_register_xjd1},
+    {"mix", sqext_register_mix},
+    {"sqfs", sqext_register_sqfs},
+    //{"ipc", sqext_register_ipc},
+    {"socket", sqext_register_sq_socket},
+    {"tweetnacl", sqext_register_tweetnacl},
+    {"pack", sqext_register_pack},
+#ifndef TARGET_IOS
+#ifdef SQ_USE_PCRE
+    {"pcre", sqext_register_pcre},
+#endif // SQ_USE_PCRE
+#if defined(SQ_USE_PCRE2) || defined(SQ_USE_PCRE2_STATIC)
+    {"pcre2", sqext_register_pcre2},
+#endif // SQ_USE_PCRE2
+#ifdef SQ_USE_FREETYPE
+    {"freetype", sqext_register_freetype},
+#endif // SQ_USE_FREETYPE
+    {"blosc", sqext_register_sq_blosc},
+#endif
 #ifdef USE_AXTLS
-	sqext_register_axtls(v);
+    {"axtls", sqext_register_axtls},
 #endif
 #ifdef WITH_FFI
-	sqext_register_ffi(v);
+    {"ffi", sqext_register_ffi},
 #endif
 #ifdef USE_OPENSSL
-	sqext_register_openssl(v);
+    {"openssl", sqext_register_openssl},
 #endif
-	sqext_register_sq_zlib(v);
-	//sqext_register_sq_miniz(v);
-	sqext_register_mongoose(v);
-	sqrat_register_importlib(v);
-	sqext_register_tinyxml2(v);
+    {"zlib", sqext_register_sq_zlib},
+    //{"miniz", sqext_register_sq_miniz},
+    {"mongoose", sqext_register_mongoose},
+    {"importlib", sqrat_register_importlib},
+    {"tinyxml2", sqext_register_tinyxml2},
 #ifndef _WIN32_WCE
 #ifdef WITH_MPDECIMAL
-	sqext_register_decimal(v);
+    {"decimal", sqext_register_decimal},
 #endif
-	sqext_register_markdown(v);
+    {"markdown", sqext_register_markdown},
 #endif
-
-	sqext_register_sq_slave_vm(v);
-	//sqext_register_ThreadObjects(v);
-	sqext_register_dad_utils(v);
-	//sqext_register_sys(v);
-
+    {"slave_vm", sqext_register_sq_slave_vm},
+    //{"thread", sqext_register_ThreadObjects},
+    {"dad_utils", sqext_register_dad_utils},
+    //{"sys_extra", sqext_register_sys},
 #ifdef SQ_USE_EASYCURL
-    sqext_register_EasyCurl(v);
+    {"easycurl", sqext_register_EasyCurl},
 #endif // SQ_USE_EASYCURL
 
 #ifdef WITH_FULL_DAD_EXTRAS
-	sqext_register_csv_parser(v);
-	//sqext_register_sq_zmq3(v);
-	//sqext_register_Java(v);
+    {"csv_parser", sqext_register_csv_parser},
+    //{"zmq3", sqext_register_sq_zmq3},
+    //{"java", sqext_register_Java},
 #endif
-
 #ifdef WITH_LIBCLANG
-	sqext_register_libclang(v);
+    {"libclang", sqext_register_libclang},
 #endif
 #ifdef WITH_POSTGRESQL
-	sqext_register_PostgreSQL(v);
+    {"postgresql", sqext_register_PostgreSQL},
 #endif
 #ifdef WITH_MYSQL
-	sqext_register_MySQL(v);
+    {"mysql", sqext_register_MySQL},
 #endif
-	sqext_register_rs232(v);
+    {"rs232", sqext_register_rs232},
 #ifdef WITH_FLTK
-	sqext_register_fltklib(v);
+    {"fltk", sqext_register_fltklib},
 #endif
 #ifdef WITH_DNS_SD
-	sqext_register_DNS_SD(v);
+    {"dns_sd", sqext_register_DNS_SD},
 #endif
 
 #endif //SQUILU_ALONE
 #endif
+    {NULL, NULL}
+};
+
+int main(int argc, char* argv[])
+{
+    sq_main_argc = argc;
+    sq_main_argv = argv;
+
+	HSQUIRRELVM v;
+	SQInteger retval = 0;
+	//const SQChar *filename=NULL;
+#if defined(_MSC_VER) && defined(_DEBUG)
+	_CrtSetAllocHook(MemAllocHook);
+#endif
+
+#ifndef SQ_OPEN_VM_SIZE
+#define SQ_OPEN_VM_SIZE 1024
+#endif // SQ_OPEN_VM_SIZE
+	v=sq_open(SQ_OPEN_VM_SIZE);
+	sq_setprintfunc(v,printfunc,errorfunc);
+
+	sq_pushroottable(v);
+/*
+    sq_pushstring(v, _SC("sq_xinterpreter"), -1);
+    sq_pushstring(v, argv[0], -1);
+    sq_newslot(v,-3,SQFalse);
+*/
+    sq_modules_preload_st *mp = modules_preload;
+    sq_preload_modules(v, mp);
+
+    while(mp->module_load_func){
+      mp->module_load_func(v);
+      ++mp;
+    }
+
 	//aux library
 	//sets error handlers
 	sqstd_seterrorhandlers(v);

+ 17 - 1
SquiLu/squirrel/sqapi.cpp

@@ -734,7 +734,7 @@ SQRESULT sq_delete_on_registry_table(HSQUIRRELVM v, SQUserPointer uptr)
     return SQ_ERROR;
 }
 
-SQRESULT sq_preload_modules(HSQUIRRELVM v, sq_modules_preload_st *modules){
+SQRESULT sq_preload_modules(HSQUIRRELVM v, const sq_modules_preload_st *modules){
     int result = 0;
     int saved_top = sq_gettop(v);
     sq_pushliteral(v, SQ_EXTENSIONS_KEY);
@@ -759,6 +759,22 @@ SQRESULT sq_preload_modules(HSQUIRRELVM v, sq_modules_preload_st *modules){
     return result;
 }
 
+SQFUNCTION sq_get_preload_module_func(HSQUIRRELVM v, const SQChar *module_name)
+{
+    SQFUNCTION result = NULL;
+    int saved_top = sq_gettop(v);
+    sq_pushliteral(v, SQ_EXTENSIONS_KEY);
+    if(sq_getonregistrytable(v) == SQ_OK){
+      sq_pushstring(v, module_name, -1);
+      if(sq_rawget(v, -2) == SQ_OK)
+      {
+          sq_getuserpointer(v, -1, (SQUserPointer*)&result);
+      }
+    }
+    sq_settop(v, saved_top);
+    return result;
+}
+
 void sq_pushconsttable(HSQUIRRELVM v)
 {
 	v->Push(_ss(v)->_consts);