This patch represents the recently added support for Octave version 4.4 found here: https://github.com/swig/swig/commit/12c66f9b7d884020e896ce92b9783bc3bac95d2d diff -urN swig-3.0.12.old/CHANGES.current swig-3.0.12.new/CHANGES.current --- swig-3.0.12.old/CHANGES.current 2017-01-27 18:52:02.000000000 -0500 +++ swig-3.0.12.new/CHANGES.current 2018-05-26 08:40:06.501850058 -0400 @@ -4,6 +4,14 @@ Issue # numbers mentioned below can be found on Github. For more details, add the issue number to the end of the URL: https://github.com/swig/swig/issues/ +Version 4.0.0 (in progress) +=========================== + +2018-05-12: kwwette + [Octave] add support for version 4.4 + - Should not introduce any user-visible incompatibilities + + Version 3.0.12 (27 Jan 2017) ============================ diff -urN swig-3.0.12.old/Examples/Makefile.in swig-3.0.12.new/Examples/Makefile.in --- swig-3.0.12.old/Examples/Makefile.in 2017-01-27 18:52:02.000000000 -0500 +++ swig-3.0.12.new/Examples/Makefile.in 2018-05-26 08:39:16.510124553 -0400 @@ -463,7 +463,7 @@ # ----------------------------------------------------------------- octave_run: - OCTAVE_HISTFILE=/dev/null $(RUNTOOL) $(OCTAVE) $(OCTAVE_SCRIPT) $(RUNPIPE) + env OCTAVE_PATH= OCTAVE_HISTFILE=/dev/null $(RUNTOOL) $(OCTAVE) $(OCTAVE_SCRIPT) $(RUNPIPE) # ----------------------------------------------------------------- # Version display diff -urN swig-3.0.12.old/Examples/octave/module_load/runme.m swig-3.0.12.new/Examples/octave/module_load/runme.m --- swig-3.0.12.old/Examples/octave/module_load/runme.m 2017-01-27 18:52:02.000000000 -0500 +++ swig-3.0.12.new/Examples/octave/module_load/runme.m 2018-05-26 08:39:16.518124669 -0400 @@ -5,63 +5,73 @@ # load module clear all; +assert(exist("swigexample") == 3); swigexample; +assert(isglobal("swigexample")); assert(cvar.ivar == ifunc); -assert(exist("swigexample","var")); clear all +assert(exist("swigexample") == 3); swigexample; +assert(isglobal("swigexample")); assert(cvar.ivar == ifunc); -assert(exist("swigexample","var")); clear all # load module in a function globally before base context clear all; -function testme +function testme_1 + assert(exist("swigexample") == 3); swigexample; + assert(isglobal("swigexample")); assert(cvar.ivar == ifunc); - assert(exist("swigexample","var")); endfunction -testme -testme +testme_1 +testme_1 +assert(exist("swigexample") == 3); swigexample; +assert(isglobal("swigexample")); assert(cvar.ivar == ifunc); -assert(exist("swigexample","var")); clear all -function testme +function testme_2 + assert(exist("swigexample") == 3); swigexample; + assert(isglobal("swigexample")); assert(cvar.ivar == ifunc); - assert(exist("swigexample","var")); endfunction -testme -testme +testme_2 +testme_2 +assert(exist("swigexample") == 3); swigexample; +assert(isglobal("swigexample")); assert(cvar.ivar == ifunc); -assert(exist("swigexample","var")); clear all # load module in a function globally after base context clear all; +assert(exist("swigexample") == 3); swigexample; +assert(isglobal("swigexample")); assert(cvar.ivar == ifunc); -assert(exist("swigexample","var")); -function testme +function testme_3 + assert(exist("swigexample") == 3); swigexample; + assert(isglobal("swigexample")); assert(cvar.ivar == ifunc); - assert(exist("swigexample","var")); endfunction -testme -testme +testme_3 +testme_3 clear all +assert(exist("swigexample") == 3); swigexample; +assert(isglobal("swigexample")); assert(cvar.ivar == ifunc); -assert(exist("swigexample","var")); -function testme +function testme_4 + assert(exist("swigexample") == 3); swigexample; + assert(isglobal("swigexample")); assert(cvar.ivar == ifunc); - assert(exist("swigexample","var")); endfunction -testme -testme +testme_4 +testme_4 clear all # octave 3.0.5 randomly crashes on the remaining tests @@ -71,13 +81,16 @@ # load module with no cvar clear all; +who; +assert(exist("swigexample2") == 3); swigexample2; +assert(isglobal("swigexample2")); assert(swigexample2.ivar == ifunc); -assert(exist("swigexample2","var")); -assert(!isglobal("cvar")) +assert(!exist("cvar", "var")); clear all +assert(exist("swigexample2") == 3); swigexample2; +assert(isglobal("swigexample2")); assert(swigexample2.ivar == ifunc); -assert(exist("swigexample2","var")); -assert(!isglobal("cvar")) +assert(!exist("cvar", "var")); clear all diff -urN swig-3.0.12.old/Examples/test-suite/octave/Makefile.in swig-3.0.12.new/Examples/test-suite/octave/Makefile.in --- swig-3.0.12.old/Examples/test-suite/octave/Makefile.in 2017-01-27 18:52:02.000000000 -0500 +++ swig-3.0.12.new/Examples/test-suite/octave/Makefile.in 2018-05-26 08:39:16.511124567 -0400 @@ -59,7 +59,7 @@ # a file is found which has _runme.m appended after the testcase name. run_testcase = \ if [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then \ - env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH OCTAVE_PATH=$(srcdir):$$OCTAVE_PATH $(RUNTOOL) $(OCTAVE) $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX); \ + env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH OCTAVE_PATH=$(srcdir) OCTAVE_HISTFILE=/dev/null $(RUNTOOL) $(OCTAVE) $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX); \ fi # Clean: remove the generated .m file diff -urN swig-3.0.12.old/Examples/test-suite/octave/Makefile.in.orig swig-3.0.12.new/Examples/test-suite/octave/Makefile.in.orig --- swig-3.0.12.old/Examples/test-suite/octave/Makefile.in.orig 1969-12-31 19:00:00.000000000 -0500 +++ swig-3.0.12.new/Examples/test-suite/octave/Makefile.in.orig 2017-01-27 18:52:02.000000000 -0500 @@ -0,0 +1,92 @@ +####################################################################### +# Makefile for octave test-suite +####################################################################### + +LANGUAGE = octave +OCTAVE = @OCTAVE@ +SCRIPTSUFFIX = _runme.m + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +top_builddir = @top_builddir@ + +CPP_TEST_CASES += \ + li_std_pair_extra \ + li_std_string_extra \ + octave_cell_deref\ + octave_dim + +CPP_TEST_BROKEN += \ + implicittest \ + li_implicit \ + li_std_set \ + li_std_stream + +#C_TEST_CASES += + +# +# This test only works with modern C compilers +# +#C_TEST_CASES += \ +# complextest + +include $(srcdir)/../common.mk + +# Overridden variables here +LIBS = -L. +CSRCS = octave_empty.c + +# Custom tests - tests with additional commandline options +# none! + +# Rules for the different types of tests +%.cpptest: + $(setup) + +$(swig_and_compile_cpp) + $(run_testcase) + +%.ctest: + $(setup) + +$(swig_and_compile_c) + $(run_testcase) + +%.multicpptest: + $(setup) + +$(swig_and_compile_multi_cpp) + $(run_testcase) + +# Runs the testcase. A testcase is only run if +# a file is found which has _runme.m appended after the testcase name. +run_testcase = \ + if [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then \ + env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH OCTAVE_PATH=$(srcdir):$$OCTAVE_PATH $(RUNTOOL) $(OCTAVE) $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX); \ + fi + +# Clean: remove the generated .m file +%.clean: + @rm -f hugemod.h hugemod_a.i hugemod_b.i hugemod_a.m hugemod_b.m hugemod_runme.m + @rm -f $*.m; + +clean: + $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile SRCDIR='$(SRCDIR)' octave_clean + +cvsignore: + @echo '*wrap* *.mc *.so *.dll *.exp *.lib' + @echo Makefile + @for i in ${CPP_TEST_CASES} ${C_TEST_CASES}; do echo $$i.m; done + @for i in ${CPP_TEST_CASES} ${C_TEST_CASES}; do if grep -q $${i}_runme.m CVS/Entries ; then echo $${i}_runme.m; fi; done + @echo clientdata_prop_a.m + @echo clientdata_prop_b.m + @echo imports_a.m + @echo imports_b.m + @echo mod_a.m mod_b.m + @echo hugemod.h hugemod_a.i hugemod_b.i hugemod_a.m hugemod_b.m hugemod_runme.m + @echo template_typedef_import.m + + +hugemod: + perl hugemod.pl + $(MAKE) hugemod_a.cpptest + $(MAKE) hugemod_b.cpptest + time $(OCTAVE) hugemod_runme.m + time $(OCTAVE) hugemod_runme.m diff -urN swig-3.0.12.old/Examples/test-suite/register_par.i swig-3.0.12.new/Examples/test-suite/register_par.i --- swig-3.0.12.old/Examples/test-suite/register_par.i 2017-01-27 18:52:02.000000000 -0500 +++ swig-3.0.12.new/Examples/test-suite/register_par.i 2018-05-26 08:40:28.146164544 -0400 @@ -2,5 +2,5 @@ // bug # 924413 %inline { - void clear_tree_flags(register struct tree *tp, register int i) {} + void clear_tree_flags(register struct swig_tree *tp, register int i) {} } diff -urN swig-3.0.12.old/Examples/test-suite/register_par.i.orig swig-3.0.12.new/Examples/test-suite/register_par.i.orig --- swig-3.0.12.old/Examples/test-suite/register_par.i.orig 1969-12-31 19:00:00.000000000 -0500 +++ swig-3.0.12.new/Examples/test-suite/register_par.i.orig 2018-05-26 08:39:16.518124669 -0400 @@ -0,0 +1,6 @@ +%module register_par + +// bug # 924413 +%inline { + void clear_tree_flags(register struct tree *tp, register int i) {} +} diff -urN swig-3.0.12.old/Examples/test-suite/register_par.i.rej swig-3.0.12.new/Examples/test-suite/register_par.i.rej --- swig-3.0.12.old/Examples/test-suite/register_par.i.rej 1969-12-31 19:00:00.000000000 -0500 +++ swig-3.0.12.new/Examples/test-suite/register_par.i.rej 2018-05-26 08:39:16.518124669 -0400 @@ -0,0 +1,15 @@ +--- Examples/test-suite/register_par.i ++++ Examples/test-suite/register_par.i +@@ -1,10 +1,10 @@ + %module register_par + + %{ +-struct tree; ++struct swig_tree; + %} + + // bug # 924413 + %inline { +- void clear_tree_flags(register struct tree *tp, register int i) {} ++ void clear_tree_flags(register struct swig_tree *tp, register int i) {} + } diff -urN swig-3.0.12.old/Lib/octave/octcontainer.swg swig-3.0.12.new/Lib/octave/octcontainer.swg --- swig-3.0.12.old/Lib/octave/octcontainer.swg 2017-01-27 18:52:02.000000000 -0500 +++ swig-3.0.12.new/Lib/octave/octcontainer.swg 2018-05-26 08:39:16.488124234 -0400 @@ -567,7 +567,11 @@ if (seq) *seq = p; return SWIG_OLDOBJ; } +%#if SWIG_OCTAVE_PREREQ(4,4,0) + } else if (obj.iscell()) { +%#else } else if (obj.is_cell()) { +%#endif try { OctSequence_Cont octseq(obj); if (seq) { diff -urN swig-3.0.12.old/Lib/octave/octprimtypes.swg swig-3.0.12.new/Lib/octave/octprimtypes.swg --- swig-3.0.12.old/Lib/octave/octprimtypes.swg 2017-01-27 18:52:02.000000000 -0500 +++ swig-3.0.12.new/Lib/octave/octprimtypes.swg 2018-05-26 08:39:16.492124292 -0400 @@ -18,7 +18,11 @@ SWIGINTERN int SWIG_AsVal_dec(bool)(const octave_value& ov, bool *val) { +%#if SWIG_OCTAVE_PREREQ(4,4,0) + if (!ov.islogical()) +%#else if (!ov.is_bool_type()) +%#endif return SWIG_ERROR; if (val) *val = ov.bool_value(); @@ -214,7 +218,13 @@ SWIGINTERN int SWIG_AsCharPtrAndSize(octave_value ov, char** cptr, size_t* psize, int *alloc) { - if (ov.is_cell() && ov.rows() == 1 && ov.columns() == 1) + if ( +%#if SWIG_OCTAVE_PREREQ(4,4,0) + ov.iscell() +%#else + ov.is_cell() +%#endif + && ov.rows() == 1 && ov.columns() == 1) ov = ov.cell_value()(0); if (!ov.is_string()) return SWIG_TypeError; diff -urN swig-3.0.12.old/Lib/octave/octrun.swg swig-3.0.12.new/Lib/octave/octrun.swg --- swig-3.0.12.old/Lib/octave/octrun.swg 2017-01-27 18:52:02.000000000 -0500 +++ swig-3.0.12.new/Lib/octave/octrun.swg 2018-05-26 08:39:16.509124538 -0400 @@ -151,6 +151,67 @@ const swig_type_info **base; }; +#if SWIG_OCTAVE_PREREQ(4,4,0) + // in Octave 4.4 behaviour of octave_builtin() appears to have changed and 'self' argument is no longer passed + // to function (maybe because this is now a 'method'??) so need to create our own octave_function subclass +#define SWIG_OCTAVE_BOUND_FUNC(func, args) octave_value(new octave_swig_bound_func(func, args)) + class octave_swig_bound_func : public octave_function { + public: + + octave_swig_bound_func(void) : octave_function(), method(0), first_args() + { } + + octave_swig_bound_func(octave_function* _method, octave_value_list _first_args) + : octave_function("", ""), method(_method), first_args(_first_args) + { } + + octave_swig_bound_func(const octave_swig_bound_func& f) = delete; + + octave_swig_bound_func& operator= (const octave_swig_bound_func& f) = delete; + + ~octave_swig_bound_func(void) = default; + + bool is_function(void) const { return true; } + + octave_function* function_value(bool = false) { return this; } + + octave_value_list call(octave::tree_evaluator& tw, int nargout = 0, const octave_value_list& args = octave_value_list()) { + octave_value_list all_args; + all_args.append(first_args); + all_args.append(args); + return method->call(tw, nargout, all_args); + } + + octave_value subsref(const std::string &ops, const std::list < octave_value_list > &idx) { + octave_value_list ovl = subsref(ops, idx, 1); + return ovl.length() ? ovl(0) : octave_value(); + } + + octave_value_list subsref(const std::string &ops, const std::list < octave_value_list > &idx, int nargout) { + assert(ops.size() > 0); + assert(ops.size() == idx.size()); + if (ops != "(") + error("invalid function call"); + octave::tree_evaluator& tw = octave::interpreter::the_interpreter()->get_evaluator(); + return call(tw, nargout, *idx.begin()); + } + + protected: + + octave_function* method; + octave_value_list first_args; + + std::set dispatch_classes; + + private: + + DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA + }; + DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA(octave_swig_bound_func, "octave_swig_bound_func", "octave_swig_bound_func"); +#else +#define SWIG_OCTAVE_BOUND_FUNC(func, args) octave_value(func) +#endif + // octave_swig_type plays the role of both the shadow class and the class // representation within Octave, since there is no support for classes. // @@ -323,13 +384,17 @@ } octave_value_list member_deref(member_value_pair *m, const octave_value_list &args) { - if (m->second.is_defined()) - return m->second; - else if (m->first) { + if (m->second.is_defined()) { + if (m->second.is_function() || m->second.is_function_handle()) { + return SWIG_OCTAVE_BOUND_FUNC(m->second.function_value(), args); + } else { + return m->second; + } + } else if (m->first) { if (m->first->get_method) return m->first->get_method(args, 1); else if (m->first->method) - return octave_value(new octave_builtin(m->first->method)); + return SWIG_OCTAVE_BOUND_FUNC(new octave_builtin(m->first->method), args); } error("undefined member"); return octave_value_list(); @@ -383,7 +448,11 @@ return dim_vector(1,1); // Return value should be cell or matrix of integers +#if SWIG_OCTAVE_PREREQ(4,4,0) + if (out.iscell()) { +#else if (out.is_cell()) { +#endif const Cell & c=out.cell_value(); int ndim = c.rows(); if (ndim==1 && c.columns()!=1) ndim = c.columns(); @@ -401,7 +470,11 @@ if (error_state) return dim_vector(1,1); } return d; +#if SWIG_OCTAVE_PREREQ(4,4,0) + } else if (out.is_matrix_type() || out.isnumeric() ) { +#else } else if (out.is_matrix_type() || out.is_numeric_type() ) { +#endif if (out.rows()==1 || out.columns()==1) { Array a = out.int_vector_value(); if (error_state) return dim_vector(1,1); @@ -476,8 +549,12 @@ } types.insert(types.end(), rhs.types.begin(), rhs.types.end()); members.insert(rhs.members.begin(), rhs.members.end()); +#if SWIG_OCTAVE_PREREQ(4,4,0) + assign(rhs.swig_type_name(), rhs.as_value()); +#else rhs.types.clear(); rhs.members.clear(); +#endif } typedef member_map::const_iterator swig_member_const_iterator; @@ -848,7 +925,14 @@ octave_function *fcn = is_valid_function(symbol, std::string(), false); if (!fcn) return false; +#if SWIG_OCTAVE_PREREQ(4,4,0) + octave::tree_evaluator& tw = octave::interpreter::the_interpreter()->get_evaluator(); + octave_value_list retval = fcn->call(tw, 1, args); + if (retval.length() == 1) + ret = retval(0); +#else ret = fcn->do_multi_index_op(1, args)(0); +#endif return true; } @@ -1238,7 +1322,13 @@ } SWIGRUNTIME octave_swig_type *swig_value_deref(octave_value ov) { - if (ov.is_cell() && ov.rows() == 1 && ov.columns() == 1) + if ( +#if SWIG_OCTAVE_PREREQ(4,4,0) + ov.iscell() +#else + ov.is_cell() +#endif + && ov.rows() == 1 && ov.columns() == 1) ov = ov.cell_value()(0); return swig_value_deref(*ov.internal_rep()); } @@ -1261,12 +1351,24 @@ SWIGRUNTIME octave_value swig_binary_op_##name(const octave_base_value&lhs,const octave_base_value &rhs) { \ return octave_swig_type::dispatch_binary_op(lhs,rhs,#name); \ } +#if SWIG_OCTAVE_PREREQ(4,4,0) +#define swigreg_unary_op(name) \ +if (!octave_value_typeinfo::lookup_unary_op(octave_value::op_##name,tid)) \ +typeinfo.register_unary_op(octave_value::op_##name,tid,swig_unary_op_##name); +#else #define swigreg_unary_op(name) \ if (!octave_value_typeinfo::lookup_unary_op(octave_value::op_##name,tid)) \ octave_value_typeinfo::register_unary_op(octave_value::op_##name,tid,swig_unary_op_##name); +#endif +#if SWIG_OCTAVE_PREREQ(4,4,0) +#define swigreg_binary_op(name) \ +if (!octave_value_typeinfo::lookup_binary_op(octave_value::op_##name,tid1,tid2)) \ +typeinfo.register_binary_op(octave_value::op_##name,tid1,tid2,swig_binary_op_##name); +#else #define swigreg_binary_op(name) \ if (!octave_value_typeinfo::lookup_binary_op(octave_value::op_##name,tid1,tid2)) \ octave_value_typeinfo::register_binary_op(octave_value::op_##name,tid1,tid2,swig_binary_op_##name); +#endif swig_unary_op(not); swig_unary_op(uplus); @@ -1300,6 +1402,9 @@ swig_binary_op(el_or); SWIGRUNTIME void SWIG_InstallUnaryOps(int tid) { +#if SWIG_OCTAVE_PREREQ(4,4,0) + octave::type_info& typeinfo = octave::interpreter::the_interpreter()->get_type_info(); +#endif swigreg_unary_op(not); swigreg_unary_op(uplus); swigreg_unary_op(uminus); @@ -1309,6 +1414,9 @@ swigreg_unary_op(decr); } SWIGRUNTIME void SWIG_InstallBinaryOps(int tid1, int tid2) { +#if SWIG_OCTAVE_PREREQ(4,4,0) + octave::type_info& typeinfo = octave::interpreter::the_interpreter()->get_type_info(); +#endif swigreg_binary_op(add); swigreg_binary_op(sub); swigreg_binary_op(mul); @@ -1357,7 +1465,13 @@ } SWIGRUNTIME int SWIG_Octave_ConvertPtrAndOwn(octave_value ov, void **ptr, swig_type_info *type, int flags, int *own) { - if (ov.is_cell() && ov.rows() == 1 && ov.columns() == 1) + if ( +#if SWIG_OCTAVE_PREREQ(4,4,0) + ov.iscell() +#else + ov.is_cell() +#endif + && ov.rows() == 1 && ov.columns() == 1) ov = ov.cell_value()(0); if (!ov.is_defined() || (ov.is_matrix_type() && ov.rows() == 0 && ov.columns() == 0) ) { @@ -1390,14 +1504,30 @@ } SWIGRUNTIMEINLINE octave_value SWIG_Octave_GetGlobalValue(std::string name) { +#if SWIG_OCTAVE_PREREQ(4,4,0) + octave::symbol_table& symtab = octave::interpreter::the_interpreter()->get_symbol_table(); + return symtab.global_varval(name); +#else return get_global_value(name, true); +#endif } SWIGRUNTIME void SWIG_Octave_SetGlobalValue(std::string name, const octave_value& value) { +#if SWIG_OCTAVE_PREREQ(4,4,0) + octave::symbol_table& symtab = octave::interpreter::the_interpreter()->get_symbol_table(); + symtab.global_assign(name, value); +#else set_global_value(name, value); +#endif } SWIGRUNTIME void SWIG_Octave_LinkGlobalValue(std::string name) { +#if SWIG_OCTAVE_PREREQ(4,4,0) + octave::symbol_table& symtab = octave::interpreter::the_interpreter()->get_symbol_table(); + octave::symbol_scope symscope = octave::interpreter::the_interpreter()->get_current_scope(); + symscope.assign(name, symtab.global_varval(name)); + symscope.mark_global(name); +#else #if !SWIG_OCTAVE_PREREQ(3,2,0) link_to_global_variable(curr_sym_tab->lookup(name, true)); #else @@ -1406,6 +1536,7 @@ #endif symbol_table::mark_global(name); #endif +#endif } SWIGRUNTIME swig_module_info *SWIG_Octave_GetModule(void *clientdata) { diff -urN swig-3.0.12.old/Lib/octave/octruntime.swg swig-3.0.12.new/Lib/octave/octruntime.swg --- swig-3.0.12.old/Lib/octave/octruntime.swg 2017-01-27 18:52:02.000000000 -0500 +++ swig-3.0.12.new/Lib/octave/octruntime.swg 2018-05-26 08:39:16.507124509 -0400 @@ -139,7 +139,11 @@ #endif #if SWIG_OCTAVE_PREREQ(4,2,0) try { +#if SWIG_OCTAVE_PREREQ(4,4,0) + octave::feval(name, octave_value_list(), 0); +#else feval(name, octave_value_list(), 0); +#endif retn = true; } catch (octave::execution_exception&) { } #else @@ -170,7 +174,7 @@ frame.protect_var(discard_error_messages); discard_error_messages = true; frame.protect_var(discard_warning_messages); discard_warning_messages = true; #else - unwind_protect::begin_frame("SWIG_Octave_LoadModule"); + unwind_protect::begin_frame("SWIG_Octave_InstallFunction"); unwind_protect_int(error_state); error_state = 0; unwind_protect_int(warning_state); warning_state = 0; unwind_protect_bool(discard_error_messages); discard_error_messages = true; @@ -181,7 +185,11 @@ args.append(octloadfcn->fcn_file_name()); #if SWIG_OCTAVE_PREREQ(4,2,0) try { +#if SWIG_OCTAVE_PREREQ(4,4,0) + octave::feval("autoload", args, 0); +#else feval("autoload", args, 0); +#endif retn = true; } catch (octave::execution_exception&) { } #else @@ -312,6 +320,8 @@ Loads the SWIG-generated module `" SWIG_name_d "'.\n\ @end deftypefn"; +void __swig_atexit__(void) { ::_Exit(0); } + DEFUN_DLD( SWIG_name, args, nargout, SWIG_name_usage ) { static octave_swig_type* module_ns = 0; @@ -322,7 +332,9 @@ // version 3.4.*, but reappeared in 4.2.*, so turn on for all versions after 3.2.*. // can be turned off with macro definition. #ifndef SWIG_OCTAVE_NO_SEGFAULT_HACK -#if SWIG_OCTAVE_PREREQ(3,2,0) +#if SWIG_OCTAVE_PREREQ(4,4,0) + atexit(__swig_atexit__); +#elif SWIG_OCTAVE_PREREQ(3,2,0) octave_exit = ::_Exit; #endif #endif @@ -351,15 +363,54 @@ "__swig_atexit__; " "atexit(\"__swig_atexit__\", false); " "atexit(\"__swig_atexit__\")"); +#if SWIG_OCTAVE_PREREQ(4,4,0) + octave::feval("evalin", eval_args, 0); +#else feval("evalin", eval_args, 0); #endif +#endif +#if SWIG_OCTAVE_PREREQ(4,4,0) + { + octave::type_info& typeinfo = octave::interpreter::the_interpreter()->get_type_info(); + string_vector types = typeinfo.installed_type_names(); + bool register_octave_swig_ref = true; + bool register_octave_swig_packed = true; + bool register_octave_swig_bound_func = true; + for (int i = 0; i < types.numel(); ++i) { + if (types(i) == octave_swig_ref::static_type_name()) { + register_octave_swig_ref = false; + } + if (types(i) == octave_swig_packed::static_type_name()) { + register_octave_swig_packed = false; + } + if (types(i) == octave_swig_bound_func::static_type_name()) { + register_octave_swig_bound_func = false; + } + } + if (register_octave_swig_ref) { + octave_swig_ref::register_type(); + } + if (register_octave_swig_packed) { + octave_swig_packed::register_type(); + } + if (register_octave_swig_bound_func) { + octave_swig_bound_func::register_type(); + } + } +#else octave_swig_ref::register_type(); octave_swig_packed::register_type(); +#endif SWIG_InitializeModule(0); SWIG_PropagateClientData(); +#if SWIG_OCTAVE_PREREQ(4,4,0) + octave::call_stack& stack = octave::interpreter::the_interpreter()->get_call_stack(); + octave_function *me = stack.current(); +#else octave_function *me = octave_call_stack::current(); +#endif if (!SWIG_Octave_InstallFunction(me, "subclass")) { return octave_value_list(); @@ -426,10 +477,12 @@ } } -#if !SWIG_OCTAVE_PREREQ(3,2,0) - mlock(me->name()); -#else +#if SWIG_OCTAVE_PREREQ(4,4,0) + octave::interpreter::the_interpreter()->mlock(); +#elif SWIG_OCTAVE_PREREQ(3,2,0) mlock(); +#else + mlock(me->name()); #endif } diff -urN swig-3.0.12.old/Lib/octave/std_pair.i swig-3.0.12.new/Lib/octave/std_pair.i --- swig-3.0.12.old/Lib/octave/std_pair.i 2017-01-27 18:52:02.000000000 -0500 +++ swig-3.0.12.new/Lib/octave/std_pair.i 2018-05-26 08:39:16.489124248 -0400 @@ -38,7 +38,13 @@ } static int asval(const octave_value& obj, std::pair *val) { - if (obj.is_cell()) { + if ( +%#if SWIG_OCTAVE_PREREQ(4,4,0) + obj.iscell() +%#else + obj.is_cell() +%#endif + ) { Cell c=obj.cell_value(); if (c.numel()<2) { error("pair from Cell array requires at least two elements"); @@ -96,7 +102,13 @@ } static int asptr(const octave_value& obj, std::pair **val) { - if (obj.is_cell()) { + if ( +%#if SWIG_OCTAVE_PREREQ(4,4,0) + obj.iscell() +%#else + obj.is_cell() +%#endif + ) { Cell c=obj.cell_value(); if (c.numel()<2) { error("pair from Cell array requires at least two elements"); diff -urN swig-3.0.12.old/.travis.yml swig-3.0.12.new/.travis.yml --- swig-3.0.12.old/.travis.yml 2017-01-27 18:52:02.000000000 -0500 +++ swig-3.0.12.new/.travis.yml 2018-05-26 08:39:16.520124698 -0400 @@ -92,6 +92,11 @@ dist: trusty - compiler: gcc os: linux + env: SWIGLANG=octave SWIGJOBS=-j2 VER=4.4 CPP11=1 + sudo: required + dist: trusty + - compiler: gcc + os: linux env: SWIGLANG=perl5 sudo: required dist: trusty diff -urN swig-3.0.12.old/.travis.yml.orig swig-3.0.12.new/.travis.yml.orig --- swig-3.0.12.old/.travis.yml.orig 1969-12-31 19:00:00.000000000 -0500 +++ swig-3.0.12.new/.travis.yml.orig 2017-01-27 18:52:02.000000000 -0500 @@ -0,0 +1,334 @@ +language: cpp +matrix: + include: + - compiler: clang + os: linux + env: SWIGLANG= + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG= + - compiler: gcc + os: linux + env: SWIGLANG= + sudo: required + dist: trusty + - os: linux + env: SWIGLANG= SWIG_CC=gcc-5 SWIG_CXX=g++-5 CPP11=1 + sudo: required + dist: trusty + - os: linux + env: SWIGLANG= SWIG_CC=gcc-6 SWIG_CXX=g++-6 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=csharp + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=d + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=go + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=go VER=1.5 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=guile + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=java + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=javascript ENGINE=node + - compiler: gcc + os: linux + env: SWIGLANG=javascript ENGINE=jsc + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=javascript ENGINE=v8 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=lua + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=lua VER=5.3 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=octave SWIGJOBS=-j2 # 3.8 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=octave SWIGJOBS=-j2 VER=4.0 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=octave SWIGJOBS=-j2 VER=4.2 CPP11=1 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=perl5 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=php5 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=php VER=7.0 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=php VER=7.1 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=python VER=2.4 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=python VER=2.5 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=python VER=2.6 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=python # 2.7 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=python PY3=3 VER=3.2 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=python PY3=3 VER=3.3 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=python PY3=3 VER=3.4 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=python PY3=3 VER=3.5 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=python SWIG_FEATURES=-builtin VER=2.6 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=python SWIG_FEATURES=-builtin + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.4 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.5 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.5 SWIGOPTPY3= + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=python SWIG_FEATURES=-O + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=python SWIG_FEATURES=-classic + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=r + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=ruby VER=1.9.3 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=ruby VER=2.0.0 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=ruby VER=2.3.0 + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=scilab + sudo: required + dist: trusty + - compiler: gcc + os: linux + env: SWIGLANG=tcl + sudo: required + dist: trusty + - os: linux + env: SWIGLANG=csharp SWIG_CC=gcc-5 SWIG_CXX=g++-5 CPP11=1 + sudo: required + dist: trusty + - os: linux + env: SWIGLANG=java SWIG_CC=gcc-5 SWIG_CXX=g++-5 CPP11=1 + sudo: required + dist: trusty + - os: linux + env: SWIGLANG=python SWIG_CC=gcc-5 SWIG_CXX=g++-5 CPP11=1 + sudo: required + dist: trusty + - os: linux + env: SWIGLANG=csharp SWIG_CC=gcc-6 SWIG_CXX=g++-6 CPP14=1 + sudo: required + dist: trusty + - os: linux + env: SWIGLANG=java SWIG_CC=gcc-6 SWIG_CXX=g++-6 CPP14=1 + sudo: required + dist: trusty + - os: linux + env: SWIGLANG=python SWIG_CC=gcc-6 SWIG_CXX=g++-6 CPP14=1 + sudo: required + dist: trusty + - compiler: gcc + os: osx + env: SWIGLANG= + - compiler: clang + os: osx + env: SWIGLANG= + - compiler: clang + os: osx + env: SWIGLANG=csharp + - compiler: clang + os: osx + env: SWIGLANG=go + - compiler: clang + os: osx + env: SWIGLANG=guile + - compiler: clang + os: osx + env: SWIGLANG=java + - compiler: clang + os: osx + env: SWIGLANG=lua + - compiler: clang + os: osx + env: SWIGLANG=perl5 + - compiler: clang + os: osx + env: SWIGLANG=php5 + - compiler: clang + os: osx + env: SWIGLANG=python + - compiler: clang + os: osx + env: SWIGLANG=python PY3=3 + - compiler: clang + os: osx + env: SWIGLANG=ruby + - compiler: clang + os: osx + env: SWIGLANG=tcl + + allow_failures: + # Lots of failing tests currently + - compiler: gcc + os: linux + env: SWIGLANG=ocaml + sudo: required + dist: trusty + # Not quite working yet + - compiler: gcc + os: linux + env: SWIGLANG=python SWIG_FEATURES=-O + sudo: required + dist: trusty +before_install: + - date -u + - uname -a + - if test "$TRAVIS_OS_NAME" = "linux"; then lscpu && cat /proc/cpuinfo | grep "model name" && cat /proc/meminfo | grep MemTotal; fi + - if test "$TRAVIS_OS_NAME" = "osx"; then sysctl -a | grep brand_string; fi + # Travis overrides CC environment with compiler predefined values + - if test -n "$SWIG_CC"; then export CC="$SWIG_CC"; fi + - if test -n "$SWIG_CXX"; then export CXX="$SWIG_CXX"; fi +install: + - if test "$TRAVIS_OS_NAME" = "linux"; then source Tools/travis-linux-install.sh; fi + - if test "$TRAVIS_OS_NAME" = "osx"; then source Tools/travis-osx-install.sh; fi + - if test -n "$CPP11"; then CONFIGOPTS+=(--enable-cpp11-testing --without-maximum-compile-warnings "CXXFLAGS=-std=c++11 -Wall -Wextra" "CFLAGS=-std=c11 -Wall -Wextra") && export CSTD=c11 && export CPPSTD=c++11; fi + - if test -n "$CPP14"; then CONFIGOPTS+=(--enable-cpp11-testing --without-maximum-compile-warnings "CXXFLAGS=-std=c++14 -Wall -Wextra" "CFLAGS=-std=c11 -Wall -Wextra") && export CSTD=c11 && export CPPSTD=c++14; fi + - ls -la $(which $CC) + - ls -la $(which $CXX) + - $CC --version + - $CXX --version +script: + - echo 'Configuring...' && echo -en 'travis_fold:start:script.1\\r' + - if test -n "$SWIGLANG"; then CONFIGOPTS+=(--without-alllang --with-$WITHLANG); fi + - echo "${CONFIGOPTS[@]}" + - ./autogen.sh && mkdir -p build/build && cd build/build && ../../configure "${CONFIGOPTS[@]}" + - echo -en 'travis_fold:end:script.1\\r' + - make -s $SWIGJOBS + - ./swig -version && ./swig -pcreversion + - if test -z "$SWIGLANG"; then make -s $SWIGJOBS check-ccache; fi + - if test -z "$SWIGLANG"; then make -s $SWIGJOBS check-errors-test-suite; fi + - echo 'Installing...' && echo -en 'travis_fold:start:script.2\\r' + - if test -z "$SWIGLANG"; then sudo make -s install && swig -version && ccache-swig -V; fi + - echo -en 'travis_fold:end:script.2\\r' + # Stricter compile flags for examples. Various headers and SWIG generated code prevents full use of -pedantic. + - if test -n "$SWIGLANG"; then cflags=$($TRAVIS_BUILD_DIR/Tools/testflags.py --language $SWIGLANG --cflags --std=$CSTD --compiler=$CC) && echo $cflags; fi + - if test -n "$SWIGLANG"; then cxxflags=$($TRAVIS_BUILD_DIR/Tools/testflags.py --language $SWIGLANG --cxxflags --std=$CPPSTD --compiler=$CC) && echo $cxxflags; fi + - if test -n "$SWIGLANG"; then make -s check-$SWIGLANG-version; fi + - if test -n "$SWIGLANG"; then make check-$SWIGLANG-enabled; fi + - if test -n "$SWIGLANG"; then make $SWIGJOBS check-$SWIGLANG-examples CFLAGS="$cflags" CXXFLAGS="$cxxflags"; fi + - if test -n "$SWIGLANG"; then make $SWIGJOBS check-$SWIGLANG-test-suite CFLAGS="$cflags" CXXFLAGS="$cxxflags"; fi + - echo 'Cleaning...' && echo -en 'travis_fold:start:script.3\\r' + - make check-maintainer-clean && ../../configure $CONFIGOPTS + - echo -en 'travis_fold:end:script.3\\r'