summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Delacour <xavier.delacour@gmail.com>2009-07-12 20:23:19 +0000
committerXavier Delacour <xavier.delacour@gmail.com>2009-07-12 20:23:19 +0000
commitcdc9de82104dcb3df4450ace3a843359476718cf (patch)
treeef1a092b17ad863764dbcf739dd4efda436b81b4
parent0576ffcde7ecc664848e77219f6709bde86dff6b (diff)
downloadswig-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.m14
-rw-r--r--Lib/octave/octrun.swg10
-rw-r--r--Lib/octave/octruntime.swg21
-rw-r--r--Source/Modules/octave.cxx16
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");