From: Hans Oesterholt-D. <hoe...@us...> - 2006-07-09 17:10:14
|
Update of /cvsroot/swig/SWIG/Source/Modules In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv3397/Source/Modules Modified Files: mzscheme.cxx Log Message: * mzscheme code can now dynamically load libraries, that are needed at runtime. This allows for code to be generated at some site, and distributed without the need for SWIG. The distribution needs only the header filesfor which the code has been generated. Linking is done at runtime, by loading the dynamic libraries. Functions are resolved when needed. Though somewhat inefficient, it provides for a way to distribute code or binaries that are independent of the version of the installed libraries, which comes in especially handy for e.g. binding against Gtk. Index: mzscheme.cxx =================================================================== RCS file: /cvsroot/swig/SWIG/Source/Modules/mzscheme.cxx,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** mzscheme.cxx 5 Jul 2006 21:26:09 -0000 1.21 --- mzscheme.cxx 9 Jul 2006 17:10:05 -0000 1.22 *************** *** 16,23 **** static const char *usage = (char*)"\ Mzscheme Options (available with -mzscheme)\n\ ! -prefix <name> - Set a prefix <name> to be prepended to all names\n\ ! -declaremodule - Create extension that declares a module\n\ ! -noinit - Do not emit scheme_initialize, scheme_reload,\n\ ! scheme_module_name functions\n"; static String *fieldnames_tab = 0; --- 16,26 ---- static const char *usage = (char*)"\ Mzscheme Options (available with -mzscheme)\n\ ! -prefix <name> - Set a prefix <name> to be prepended to all names\n\ ! -declaremodule - Create extension that declares a module\n\ ! -noinit - Do not emit scheme_initialize, scheme_reload,\n\ ! scheme_module_name functions\n\ ! -dynamic-load <library>,[library,...] - Do not link with these libraries, dynamic load\n\ ! them\n\ ! "; static String *fieldnames_tab = 0; *************** *** 30,33 **** --- 33,39 ---- static bool declaremodule = false; static bool noinit = false; + //DLOPEN PATCH + static char *load_libraries = NULL; + //DLOPEN PATCH static String *module=0; static char *mzscheme_path=(char*)"mzscheme"; *************** *** 80,83 **** --- 86,97 ---- Swig_mark_arg (i); } + // DLOPEN PATCH + else if (strcmp(argv[i],"-dynamic-load") == 0) { + load_libraries=new char[strlen(argv[i+1])+2]; + strcpy(load_libraries,argv[i+1]); + Swig_mark_arg(i++); + Swig_mark_arg(i); + } + // DLOPEN PATCH } } *************** *** 154,157 **** --- 168,178 ---- Printf (f_init, "\treturn scheme_void;\n}\n"); Printf(f_init, "Scheme_Object *scheme_initialize(Scheme_Env *env) {\n"); + + // DLOPEN PATCH + if (load_libraries) { + Printf(f_init,"mz_set_dlopen_libraries(\"%s\");\n",load_libraries); + } + // DLOPEN PATCH + Printf(f_init, "\treturn scheme_reload(env);\n"); Printf (f_init, "}\n"); *************** *** 218,221 **** --- 239,251 ---- String *overname = 0; + // PATCH DLOPEN + if (load_libraries) { + ParmList *parms=Getattr(n,"parms"); + SwigType *type=Getattr(n,"type"); + String *name=NewString("caller"); + Setattr(n,"wrap:action", Swig_cresult(type,"result", Swig_cfunction_call(name,parms))); + } + // PATCH DLOPEN + // Make a wrapper name for this String *wname = Swig_name_wrapper(iname); *************** *** 256,259 **** --- 286,302 ---- numargs = emit_num_arguments(l); numreq = emit_num_required(l); + + // DLOPEN PATCH + /* Add the holder for the pointer to the function to be opened */ + if (load_libraries) { + Wrapper_add_local(f, "_function_loaded","static int _function_loaded=(1==0)"); + Wrapper_add_local(f, "_the_function", "static void *_the_function=NULL"); + { + String *parms=ParmList_protostr(l); + String *func=NewStringf("(*caller)(%s)",parms); + Wrapper_add_local(f,"caller",SwigType_lstr(d,func)); /*"(*caller)()"));*/ + } + } + // DLOPEN PATCH // adds local variables *************** *** 261,264 **** --- 304,315 ---- Wrapper_add_local(f, "values", "Scheme_Object *values[MAXVALUES]"); + // DLOPEN PATCH + if (load_libraries) { + Printf(f->code,"if (!_function_loaded) { _the_function=mz_load_function(\"%s\");_function_loaded=(1==1); }\n",iname); + Printf(f->code,"if (!_the_function) { scheme_signal_error(\"Cannot load C function '%s'\"); }\n",iname); + Printf(f->code,"caller=_the_function;\n"); + } + // DLOPEN PATCH + // Now write code to extract the parameters (this is super ugly) |