diff options
author | Xavier Delacour <xavier.delacour@gmail.com> | 2009-07-12 20:23:19 +0000 |
---|---|---|
committer | Xavier Delacour <xavier.delacour@gmail.com> | 2009-07-12 20:23:19 +0000 |
commit | cdc9de82104dcb3df4450ace3a843359476718cf (patch) | |
tree | ef1a092b17ad863764dbcf739dd4efda436b81b4 | |
parent | 0576ffcde7ecc664848e77219f6709bde86dff6b (diff) | |
download | swig-cdc9de82104dcb3df4450ace3a843359476718cf.tar.gz |
small fixes to make octave module compatible with octave 3.2
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@11388 626c5289-ae23-0410-ae9c-e8d60b6d4f22
-rw-r--r-- | Examples/test-suite/octave/empty_runme.m | 14 | ||||
-rw-r--r-- | Lib/octave/octrun.swg | 10 | ||||
-rw-r--r-- | Lib/octave/octruntime.swg | 21 | ||||
-rw-r--r-- | Source/Modules/octave.cxx | 16 |
4 files changed, 60 insertions, 1 deletions
diff --git a/Examples/test-suite/octave/empty_runme.m b/Examples/test-suite/octave/empty_runme.m index c6cac6926..e5b2593d4 100644 --- a/Examples/test-suite/octave/empty_runme.m +++ b/Examples/test-suite/octave/empty_runme.m @@ -1 +1,15 @@ +printf("begin\n"); +who global empty +printf("after load\n"); +who global + +#clear -g +printf("after clear\n"); +who global + +#clear empty +printf("after clear specific\n"); +who global + +printf("before shutdown\n"); diff --git a/Lib/octave/octrun.swg b/Lib/octave/octrun.swg index c48310e27..16ba85878 100644 --- a/Lib/octave/octrun.swg +++ b/Lib/octave/octrun.swg @@ -439,9 +439,14 @@ namespace Swig { install_builtin_function(it->second.first->method, it->first, it->second.first->doc?it->second.first->doc:std::string()); else if (it->second.second.is_defined()) { +#if USE_OCTAVE_API_VERSION<37 link_to_global_variable(curr_sym_tab->lookup(it->first, true)); +#else + symbol_table::mark_global(it->first); +#endif set_global_value(it->first, it->second.second); +#if USE_OCTAVE_API_VERSION<37 octave_swig_type *ost = Swig::swig_value_deref(it->second.second); if (ost) { const char* h = ost->help_text(); @@ -450,6 +455,7 @@ namespace Swig { sr->document(h); } } +#endif } } } @@ -1352,6 +1358,10 @@ SWIGRUNTIME swig_module_info *SWIG_Octave_GetModule(void *clientdata) { SWIGRUNTIME void SWIG_Octave_SetModule(void *clientdata, swig_module_info *pointer) { octave_value ov = new octave_swig_packed(0, &pointer, sizeof(swig_module_info *)); const char *module_var = "__SWIG_MODULE__" SWIG_TYPE_TABLE_NAME SWIG_RUNTIME_VERSION; +#if USE_OCTAVE_API_VERSION<37 link_to_global_variable(curr_sym_tab->lookup(module_var, true)); +#else + symbol_table::mark_global(module_var); +#endif set_global_value(module_var, ov); } diff --git a/Lib/octave/octruntime.swg b/Lib/octave/octruntime.swg index 82a17285a..75b4f1194 100644 --- a/Lib/octave/octruntime.swg +++ b/Lib/octave/octruntime.swg @@ -72,11 +72,32 @@ DEFUN_DLD (SWIG_name,args,nargout,SWIG_name_d) { module_ns->install_global(); module_ns->decref(); +#if USE_OCTAVE_API_VERSION<37 link_to_global_variable(curr_sym_tab->lookup(SWIG_name_d,true)); +#else + symbol_table::mark_global(SWIG_name_d); +#endif set_global_value(SWIG_name_d,Swig::swig_value_ref(module_ns)); +#if USE_OCTAVE_API_VERSION>=37 + mlock(); +#endif + return octave_value_list(); } +// workaround bug in octave where installing global variable of custom type and then +// exiting without explicitly clearing the variable causes octave to segfault. +#if USE_OCTAVE_API_VERSION>=37 +struct oct_file_unload { + ~oct_file_unload() { + string_vector vars = symbol_table::global_variable_names(); + for (int i = 0; i < vars.length(); i++) + symbol_table::clear_global(vars[i]); + } +}; +static oct_file_unload __unload; +#endif + %} diff --git a/Source/Modules/octave.cxx b/Source/Modules/octave.cxx index 55ffe8cbb..e65cc1cfa 100644 --- a/Source/Modules/octave.cxx +++ b/Source/Modules/octave.cxx @@ -13,7 +13,8 @@ char cvsroot_octave_cxx[] = "$Id$"; static const char *usage = (char *) "\ Octave Options (available with -octave)\n\ - (none yet)\n\n"; + -api <N> - Generate code that assume octave API N [default: 37]\n\ + \n"; class OCTAVE:public Language { @@ -35,6 +36,8 @@ private: int have_destructor; String *constructor_name; + int api_version; + Hash *docs; public: @@ -53,6 +56,7 @@ public: director_multiple_inheritance = 1; director_language = 1; docs = NewHash(); + api_version = 37; } virtual void main(int argc, char *argv[]) { @@ -60,6 +64,15 @@ public: if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { fputs(usage, stderr); + } else if (strcmp(argv[i], "-api") == 0) { + if (argv[i + 1]) { + api_version = atoi(argv[i + 1]); + Swig_mark_arg(i); + Swig_mark_arg(i + 1); + i++; + } else { + Swig_arg_error(); + } } } } @@ -125,6 +138,7 @@ public: Printf(f_runtime, "#define SWIGOCTAVE\n"); Printf(f_runtime, "#define SWIG_name_d \"%s\"\n", module); Printf(f_runtime, "#define SWIG_name %s\n", module); + Printf(f_runtime, "#define USE_OCTAVE_API_VERSION %i\n", api_version); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); |