summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Delacour <xavier.delacour@gmail.com>2008-03-24 22:33:55 +0000
committerXavier Delacour <xavier.delacour@gmail.com>2008-03-24 22:33:55 +0000
commit7b1cab1554c632df79280f08fd673bccb880fffb (patch)
treee4b38a97b31514d5e89ab4ca7df4d8e80d95c585
parent316a2decd7cf3f428af3cde0e5d923d073ea36d0 (diff)
downloadswig-7b1cab1554c632df79280f08fd673bccb880fffb.tar.gz
varargs fixes.
Added passthrough out typemaps for internal Octave types. git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@10320 626c5289-ae23-0410-ae9c-e8d60b6d4f22
-rw-r--r--Doc/Manual/Octave.html6
-rw-r--r--Lib/octave/octrun.swg6
-rw-r--r--Lib/octave/octtypemaps.swg22
-rw-r--r--Source/Modules/octave.cxx5
4 files changed, 31 insertions, 8 deletions
diff --git a/Doc/Manual/Octave.html b/Doc/Manual/Octave.html
index 69ed3a6c9..97e1be17c 100644
--- a/Doc/Manual/Octave.html
+++ b/Doc/Manual/Octave.html
@@ -626,11 +626,11 @@ and then used from Octave
</p>
<div class="targetlang"><pre>
-octave:3> mul(4,3)
+octave:1> mul(4,3)
ans = 12
-octave:4> mul(4.2,3.6)
+octave:2> mul(4.2,3.6)
ans = 15.120
-octave:2> mul(3+4i,10+2i)
+octave:3> mul(3+4i,10+2i)
ans = 22 + 46i
</pre></div>
diff --git a/Lib/octave/octrun.swg b/Lib/octave/octrun.swg
index 7876ae2c0..da8ae03f8 100644
--- a/Lib/octave/octrun.swg
+++ b/Lib/octave/octrun.swg
@@ -1,7 +1,7 @@
-SWIGRUNTIME bool SWIG_check_num_args(const char *func_name, int num_args, int max_args, int min_args) {
- if (num_args > max_args)
+SWIGRUNTIME bool SWIG_check_num_args(const char *func_name, int num_args, int max_args, int min_args, int varargs) {
+ if (num_args > max_args && !varargs)
error("function %s takes at most %i arguments", func_name, max_args);
else if (num_args < min_args)
error("function %s requires at least %i arguments", func_name, max_args);
@@ -549,7 +549,7 @@ namespace {
octave_value_list args;
if (!m->first || (!m->first->is_static() && !m->first->is_global()))
args.append(as_value());
- if (skip < (int) ops.size() &&ops[skip] == '(' && ((m->first && m->first->method) || m->second.is_function() || m->second.is_function_handle())) {
+ if (skip < (int) ops.size() && ops[skip] == '(' && ((m->first && m->first->method) || m->second.is_function() || m->second.is_function_handle())) {
args.append(*idx_it++);
++skip;
sub_ovl = member_invoke(m, args, nargout);
diff --git a/Lib/octave/octtypemaps.swg b/Lib/octave/octtypemaps.swg
index f95005593..7934f90bd 100644
--- a/Lib/octave/octtypemaps.swg
+++ b/Lib/octave/octtypemaps.swg
@@ -50,9 +50,31 @@
for (int j=$argnum-1;j<args.length();++j)
$1.append(args(j));
}
+%typecheck(2000) (octave_value_list varargs,...) {
+ $1=1;
+}
+
+%typemap(in) (const octave_value_list& varargs,...) (octave_value_list tmp) {
+ for (int j=$argnum-1;j<args.length();++j)
+ tmp.append(args(j));
+ $1=&tmp;
+}
+%typecheck(2000) (const octave_value_list& varargs,...) {
+ $1=1;
+}
+
%typemap(out) octave_value_list {
_outp->append($1);
}
+%typemap(out,noblock=1) Octave_map {
+ $result=$1;
+}
+%typemap(out,noblock=1) NDArray {
+ $result=$1;
+}
+%typemap(out,noblock=1) Cell {
+ $result=$1;
+}
/*
// Smart Pointers
diff --git a/Source/Modules/octave.cxx b/Source/Modules/octave.cxx
index f2fbf9c08..e049a6bba 100644
--- a/Source/Modules/octave.cxx
+++ b/Source/Modules/octave.cxx
@@ -365,7 +365,8 @@ public:
int varargs = emit_isvarargs(l);
char source[64];
- Printf(f->code, "if (!SWIG_check_num_args(\"%s\",args.length(),%i,%i)) " "{\n SWIG_fail;\n }\n", iname, num_arguments, num_required);
+ Printf(f->code, "if (!SWIG_check_num_args(\"%s\",args.length(),%i,%i,%i)) "
+ "{\n SWIG_fail;\n }\n", iname, num_arguments, num_required, varargs);
if (constructor && num_arguments == 1 && num_required == 1) {
if (Cmp(storage, "explicit") == 0) {
@@ -602,7 +603,7 @@ public:
String *setname = Swig_name_set(iname);
Printf(setf->def, "static octave_value_list _wrap_%s(const octave_value_list& args,int nargout) {", setname);
- Printf(setf->def, "if (!SWIG_check_num_args(\"%s_set\",args.length(),1,1)) return octave_value_list();", iname);
+ Printf(setf->def, "if (!SWIG_check_num_args(\"%s_set\",args.length(),1,1,0)) return octave_value_list();", iname);
if (is_assignable(n)) {
Setattr(n, "wrap:name", setname);
if ((tm = Swig_typemap_lookup_new("varin", n, name, 0))) {