fix def args + director + constructors
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@6689 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
ccf5343b34
commit
464c01da12
4 changed files with 97 additions and 11 deletions
|
|
@ -28,3 +28,17 @@ public:
|
||||||
std::string GetMsg(std::string msg) { return Msg(msg); }
|
std::string GetMsg(std::string msg) { return Msg(msg); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
%inline %{
|
||||||
|
class Bar {
|
||||||
|
public:
|
||||||
|
Bar() {}
|
||||||
|
Bar(int i) {}
|
||||||
|
virtual ~Bar() {}
|
||||||
|
virtual std::string Msg(std::string msg = "default") { return "Bar-" + msg; }
|
||||||
|
|
||||||
|
std::string GetMsg() { return Msg(); }
|
||||||
|
std::string GetMsg(std::string msg) { return Msg(msg); }
|
||||||
|
};
|
||||||
|
|
||||||
|
%}
|
||||||
|
|
|
||||||
19
SWIG/Examples/test-suite/ruby/director_default_runme.rb
Normal file
19
SWIG/Examples/test-suite/ruby/director_default_runme.rb
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
require 'director_default'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
a = Director_default::Foo.new 1
|
||||||
|
a = Director_default::Foo.new
|
||||||
|
|
||||||
|
a.Msg
|
||||||
|
a.Msg "hello"
|
||||||
|
a.GetMsg
|
||||||
|
a.GetMsg "hello"
|
||||||
|
|
||||||
|
a = Director_default::Bar.new 1
|
||||||
|
a = Director_default::Bar.new
|
||||||
|
|
||||||
|
a.Msg
|
||||||
|
a.Msg "hello"
|
||||||
|
a.GetMsg
|
||||||
|
a.GetMsg "hello"
|
||||||
|
|
@ -10,3 +10,4 @@ typedef unsigned long VALUE;
|
||||||
%typemap(directorin) VALUE "$input = $1;";
|
%typemap(directorin) VALUE "$input = $1;";
|
||||||
%typemap(directorout) VALUE "$result = $input;";
|
%typemap(directorout) VALUE "$result = $input;";
|
||||||
|
|
||||||
|
%typecheck(SWIG_TYPECHECK_POINTER) VALUE "$1 = ($input != T_NONE);";
|
||||||
|
|
|
||||||
|
|
@ -187,14 +187,13 @@ public:
|
||||||
f_init = 0;
|
f_init = 0;
|
||||||
useGlobalModule = false;
|
useGlobalModule = false;
|
||||||
multipleInheritance = false;
|
multipleInheritance = false;
|
||||||
|
|
||||||
director_prot_ctor_code = NewString("");
|
director_prot_ctor_code = NewString("");
|
||||||
Printv(director_prot_ctor_code,
|
Printv(director_prot_ctor_code,
|
||||||
"if ( $comparison ) { /* subclassed */\n",
|
"if ( $comparison ) { /* subclassed */\n",
|
||||||
" $director_new \n",
|
" $director_new \n",
|
||||||
"} else {\n",
|
"} else {\n",
|
||||||
" rb_raise(rb_eRuntimeError,\"accessing abstract class or protected constructor\"); \n",
|
" rb_raise(rb_eRuntimeError,\"accessing abstract class or protected constructor\"); \n",
|
||||||
" result = 0;\n",
|
" return Qnil;\n",
|
||||||
"}\n", NIL);
|
"}\n", NIL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -360,7 +359,9 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set comparison with none for ConstructorToFunction */
|
/* Set comparison with none for ConstructorToFunction */
|
||||||
setSubclassInstanceCheck(NewString("CLASS_OF(self) != Qnil")); // FIXME
|
|
||||||
|
|
||||||
|
setSubclassInstanceCheck(NewStringf("strcmp(rb_obj_classname(self), classname) != 0"));
|
||||||
// setSubclassInstanceCheck(NewString("CLASS_OF(self) != cFoo.klass"));
|
// setSubclassInstanceCheck(NewString("CLASS_OF(self) != cFoo.klass"));
|
||||||
|
|
||||||
/* Initialize all of the output files */
|
/* Initialize all of the output files */
|
||||||
|
|
@ -752,7 +753,7 @@ public:
|
||||||
source = NewString("");
|
source = NewString("");
|
||||||
target = NewString("");
|
target = NewString("");
|
||||||
|
|
||||||
bool use_director = (current == CONSTRUCTOR_INITIALIZE && Swig_directorclass(n));
|
bool ctor_director = (current == CONSTRUCTOR_INITIALIZE && Swig_directorclass(n));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The 'start' value indicates which of the C/C++ function arguments
|
* The 'start' value indicates which of the C/C++ function arguments
|
||||||
|
|
@ -761,7 +762,7 @@ public:
|
||||||
* the first argument (with name arg1) is based on the value of argv[0].
|
* the first argument (with name arg1) is based on the value of argv[0].
|
||||||
* If start is one, then arg1 is based on the value of argv[1].
|
* If start is one, then arg1 is based on the value of argv[1].
|
||||||
*/
|
*/
|
||||||
int start = (current == MEMBER_FUNC || current == MEMBER_VAR || use_director) ? 1 : 0;
|
int start = (current == MEMBER_FUNC || current == MEMBER_VAR || ctor_director) ? 1 : 0;
|
||||||
|
|
||||||
int varargs = emit_isvarargs(l);
|
int varargs = emit_isvarargs(l);
|
||||||
|
|
||||||
|
|
@ -1005,8 +1006,8 @@ public:
|
||||||
int varargs = emit_isvarargs(l);
|
int varargs = emit_isvarargs(l);
|
||||||
bool allow_kwargs = Getattr(n,"feature:kwargs") ? true : false;
|
bool allow_kwargs = Getattr(n,"feature:kwargs") ? true : false;
|
||||||
|
|
||||||
bool use_director = (current == CONSTRUCTOR_INITIALIZE && Swig_directorclass(n));
|
bool ctor_director = (current == CONSTRUCTOR_INITIALIZE && Swig_directorclass(n));
|
||||||
int start = (current == MEMBER_FUNC || current == MEMBER_VAR || use_director) ? 1 : 0;
|
int start = (current == MEMBER_FUNC || current == MEMBER_VAR || ctor_director) ? 1 : 0;
|
||||||
|
|
||||||
/* Now write the wrapper function itself */
|
/* Now write the wrapper function itself */
|
||||||
if (current == CONSTRUCTOR_ALLOCATE) {
|
if (current == CONSTRUCTOR_ALLOCATE) {
|
||||||
|
|
@ -1040,7 +1041,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME?
|
// FIXME?
|
||||||
if (use_director) {
|
if (ctor_director) {
|
||||||
numarg--;
|
numarg--;
|
||||||
numreq--;
|
numreq--;
|
||||||
}
|
}
|
||||||
|
|
@ -1254,14 +1255,16 @@ public:
|
||||||
NIL);
|
NIL);
|
||||||
|
|
||||||
Wrapper_add_local(f, "argc", "int argc");
|
Wrapper_add_local(f, "argc", "int argc");
|
||||||
if (current == MEMBER_FUNC || current == MEMBER_VAR) {
|
bool ctor_director = (current == CONSTRUCTOR_INITIALIZE && Swig_directorclass(n));
|
||||||
|
if (current == MEMBER_FUNC || current == MEMBER_VAR || ctor_director) {
|
||||||
Printf(tmp, "VALUE argv[%d]", maxargs+1);
|
Printf(tmp, "VALUE argv[%d]", maxargs+1);
|
||||||
} else {
|
} else {
|
||||||
Printf(tmp, "VALUE argv[%d]", maxargs);
|
Printf(tmp, "VALUE argv[%d]", maxargs);
|
||||||
}
|
}
|
||||||
Wrapper_add_local(f, "argv", tmp);
|
Wrapper_add_local(f, "argv", tmp);
|
||||||
Wrapper_add_local(f, "ii", "int ii");
|
Wrapper_add_local(f, "ii", "int ii");
|
||||||
if (current == MEMBER_FUNC || current == MEMBER_VAR) {
|
|
||||||
|
if (current == MEMBER_FUNC || current == MEMBER_VAR || ctor_director) {
|
||||||
Printf(f->code, "argc = nargs + 1;\n");
|
Printf(f->code, "argc = nargs + 1;\n");
|
||||||
Printf(f->code, "argv[0] = self;\n");
|
Printf(f->code, "argv[0] = self;\n");
|
||||||
Printf(f->code, "for (ii = 1; (ii < argc) && (ii < %d); ii++) {\n", maxargs);
|
Printf(f->code, "for (ii = 1; (ii < argc) && (ii < %d); ii++) {\n", maxargs);
|
||||||
|
|
@ -1717,12 +1720,47 @@ public:
|
||||||
* Method for adding C++ member constructor
|
* Method for adding C++ member constructor
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void set_director_ctor_code(Node *n)
|
||||||
|
{
|
||||||
|
/* director ctor code is specific for each class */
|
||||||
|
Delete(director_prot_ctor_code);
|
||||||
|
director_prot_ctor_code = NewString("");
|
||||||
|
Node *pn = Swig_methodclass(n);
|
||||||
|
String *symname = Getattr(pn,"sym:name");
|
||||||
|
String *name = Copy(symname);
|
||||||
|
char *cname = Char(name);
|
||||||
|
if(cname) cname[0] = toupper(cname[0]);
|
||||||
|
Printv(director_prot_ctor_code,
|
||||||
|
"char *classname = \"",module,"::",cname,"\";\n",
|
||||||
|
"if ( $comparison ) { /* subclassed */\n",
|
||||||
|
" $director_new \n",
|
||||||
|
"} else {\n",
|
||||||
|
" rb_raise(rb_eNameError,\"accessing abstract class or protected constructor\"); \n",
|
||||||
|
" return Qnil;\n",
|
||||||
|
"}\n", NIL);
|
||||||
|
Delete(director_ctor_code);
|
||||||
|
director_ctor_code = NewString("");
|
||||||
|
Printv(director_ctor_code,
|
||||||
|
"char *classname = \"",module,"::",cname,"\";\n",
|
||||||
|
"if ( $comparison ) { /* subclassed */\n",
|
||||||
|
" $director_new \n",
|
||||||
|
"} else {\n",
|
||||||
|
" $nondirector_new \n",
|
||||||
|
"}\n", NIL);
|
||||||
|
Delete(name);
|
||||||
|
}
|
||||||
|
|
||||||
virtual int constructorHandler(Node *n) {
|
virtual int constructorHandler(Node *n) {
|
||||||
int use_director = Swig_directorclass(n);
|
int use_director = Swig_directorclass(n);
|
||||||
|
if (use_director) {
|
||||||
|
set_director_ctor_code(n);
|
||||||
|
}
|
||||||
|
|
||||||
/* First wrap the allocate method */
|
/* First wrap the allocate method */
|
||||||
current = CONSTRUCTOR_ALLOCATE;
|
current = CONSTRUCTOR_ALLOCATE;
|
||||||
Swig_name_register((String_or_char *) "construct", (String_or_char *) "%c_allocate");
|
Swig_name_register((String_or_char *) "construct", (String_or_char *) "%c_allocate");
|
||||||
|
|
||||||
|
|
||||||
Language::constructorHandler(n);
|
Language::constructorHandler(n);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -1762,6 +1800,20 @@ public:
|
||||||
return SWIG_OK;
|
return SWIG_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual int copyconstructorHandler(Node *n) {
|
||||||
|
int use_director = Swig_directorclass(n);
|
||||||
|
if (use_director) {
|
||||||
|
set_director_ctor_code(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* First wrap the allocate method */
|
||||||
|
current = CONSTRUCTOR_ALLOCATE;
|
||||||
|
Swig_name_register((String_or_char *) "construct", (String_or_char *) "%c_allocate");
|
||||||
|
|
||||||
|
return Language::copyconstructorHandler(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------
|
/* ---------------------------------------------------------------------
|
||||||
* destructorHandler()
|
* destructorHandler()
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue