From: Charlie S. <cf...@in...> - 2005-12-14 22:54:50
|
Hmmm...interesting. Based on that, here is a short test case: %inline %{ class CoordinateSequence { public: CoordinateSequence() {} bool hasRepeatedPoints() const { } static bool hasRepeatedPoints(const CoordinateSequence *cl) { } }; %} However,looking at the generated code, I'm not sure I understand why there is a problem (at least in Ruby). Here is the first method wrapped in Ruby - it specifically requires 0 arguments: SWIGINTERN VALUE _wrap_CoordinateSequence_hasRepeatedPoints__SWIG_0(int argc, VALUE *argv, VALUE self) { CoordinateSequence *arg1 = (CoordinateSequence *) 0 ; bool result; void *argp1 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } if (SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CoordinateSequence, 0 | 0) != SWIG_OK) { SWIG_exception(SWIG_TypeError, "in argument ""1"" of type '" "CoordinateSequence const *""'"); } arg1 = reinterpret_cast<CoordinateSequence * >(argp1); result = (bool)((CoordinateSequence const *)arg1)->hasRepeatedPoints(); vresult = SWIG_From_bool(static_cast<bool >(result)); return vresult; fail: return Qnil; } While here is the second one, which requires 1 argument. SWIGINTERN VALUE _wrap_CoordinateSequence_hasRepeatedPoints__SWIG_1(int argc, VALUE *argv, VALUE self) { geos::CoordinateSequence *arg1 = (geos::CoordinateSequence *) 0 ; bool result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } ... try { result = (bool)geos::CoordinateSequence::hasRepeatedPoints((geos::CoordinateSequence const *)arg1); } catch (geos::GEOSException *e) { SWIG_exception(SWIG_RuntimeError, e->toString().data()); } } vresult = SWIG_From_bool(static_cast<bool >(result)); return vresult; fail: return Qnil; } In the member function case, the object is represented by self, not by an argument. In the static member function case, the parameter is an argument and of course there is no self. So it seems to me that the dispatcher method is not correct. Shouldn't the first check be "if (argc == 0)": SWIGINTERN VALUE _wrap_CoordinateSequence_hasRepeatedPoints(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[1]; int ii; argc = nargs; for (ii = 0; (ii < argc) && (ii < 1); ii++) { argv[ii] = args[ii]; } if (argc == 1) { int _v; void *ptr = 0; _v = (SWIG_ConvertPtr(argv[0], &ptr, SWIGTYPE_p_CoordinateSequence, 0) == SWIG_OK); if (_v) { return _wrap_CoordinateSequence_hasRepeatedPoints__SWIG_0(nargs, args, self); } } if (argc == 1) { int _v; void *ptr = 0; _v = (SWIG_ConvertPtr(argv[0], &ptr, SWIGTYPE_p_CoordinateSequence, 0) == SWIG_OK); if (_v) { return _wrap_CoordinateSequence_hasRepeatedPoints__SWIG_1(nargs, args, self); } } rb_raise(rb_eArgError, "No matching function for overloaded 'CoordinateSequence_hasRepeatedPoints'"); return Qnil; } As comparison, let's say we have this: // Simple tests of overloaded functions %module swig_test %inline %{ class CoordinateSequence { public: CoordinateSequence() {} void non_static_test() { } void non_static_test(CoordinateSequence* seq) { } }; %} In this case, the dispatch method looks like this: SWIGINTERN VALUE _wrap_CoordinateSequence_non_static_test(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[3]; int ii; argc = nargs + 1; argv[0] = self; for (ii = 1; (ii < argc) && (ii < 2); ii++) { argv[ii] = args[ii-1]; } if (argc == 1) { int _v; void *ptr = 0; _v = (SWIG_ConvertPtr(argv[0], &ptr, SWIGTYPE_p_CoordinateSequence, 0) == SWIG_OK); if (_v) { return _wrap_CoordinateSequence_non_static_test__SWIG_0(nargs, args, self); } } if (argc == 2) { int _v; void *ptr = 0; _v = (SWIG_ConvertPtr(argv[0], &ptr, SWIGTYPE_p_CoordinateSequence, 0) == SWIG_OK); if (_v) { void *ptr = 0; _v = (SWIG_ConvertPtr(argv[1], &ptr, SWIGTYPE_p_CoordinateSequence, 0) == SWIG_OK); if (_v) { return _wrap_CoordinateSequence_non_static_test__SWIG_1(nargs, args, self); } } } rb_raise(rb_eArgError, "No matching function for overloaded 'CoordinateSequence_non_static_test'"); return Qnil; } Note that in the first case, nargs will be 0 while in the second it will be 1. The check for argc is actually uses 1 and 2 because self is added to argv - but that is *not* actually passed to either method being called (in fact the code would be a lot simpler to skip the argc/argv manipulations but perhaps they are needed in other cases). So at least in Ruby, I don't see why there is a problem - these two cases seem easily distinguished. Thanks, Charlie Marcelo Matus wrote: > Well, technically > > bool hasRepeatedPoints() const; > > requires one parameter, the 'this' pointer, which happens > to be the same type of the argument in the static method. > > If you look at the generated code.you will see that they > are indistinguishable between them, at least in python. > > Marcelo > > > > Charlie Savage wrote: > >> I'm trying to wrap the GEOS library. It has a class that looks like >> this: >> >> class CoordinateSequence { >> public: >> bool hasRepeatedPoints() const; >> static bool hasRepeatedPoints(const CoordinateSequence *cl); >> ... >> }; >> When swiging this file (either Python or Ruby), I get this error >> message: >> >> ..\..\source\headers\geos\geom.h(705): Warning(509): Overloaded >> geos::CoordinateSequence::hasRepeatedPoints(geos::CoordinateSequence >> const *) is shadowed by hasRepeatedPoints() const at >> ..\..\source\headers\geos\geom.h:692. >> >> Not what I would expect. Checking a similar example in the test-suite >> shows no problems, nor does a simple test case. >> >> In case it helps, the relevant part of the parse tree: >> >> +++ cdecl >> ---------------------------------------- >> | feature:except - "{\n try {\n >> $action\n }\n ..." >> | name - "hasRepeatedPoints" >> | tmap:out:fragment - "SWIG_From_bool" >> | sym:symtab - 0xc27040 >> | sym:nextSibling - 0xc28b60 >> | csym:nextSibling - 0xc28b60 >> | sym:name - "hasRepeatedPoints" >> | view - "memberfunctionHandler" >> | wrap:parms - 0xfee788 >> | decl - "q(const).f()." >> | tmap:out - "vresult = >> SWIG_From_bool(static_cast<boo..." >> | sym:overloaded - 0xc287b0 >> | wrap:action - "result = >> (bool)((geos::CoordinateSequenc..." >> | type - "bool" >> | wrap:name - >> "_wrap_CoordinateSequence_hasRepeatedPoin..." >> | tmap:out:noblock - "1" >> | qualifier - "q(const)." >> | sym:overname - "__SWIG_0" >> | >> >> >> +++ cdecl >> ---------------------------------------- >> | feature:except - "{\n try {\n >> $action\n }\n ..." >> | cplus:staticbase - 0xc2a610 >> | name - "hasRepeatedPoints" >> | tmap:out:fragment - "SWIG_From_bool" >> | sym:symtab - 0xc27040 >> | sym:previousSibling - 0xc287b0 >> | sym:name - "hasRepeatedPoints" >> | view - >> "staticmemberfunctionHandler" >> | wrap:parms - 0xc28b10 >> | decl - >> "f(p.q(const).geos::CoordinateSequence)." >> | tmap:out - "vresult = >> SWIG_From_bool(static_cast<boo..." >> | sym:overloaded - 0xc287b0 >> | parms - >> geos::CoordinateSequence const * >> | wrap:action - "result = >> (bool)geos::CoordinateSequence:..." >> | type - "bool" >> | wrap:name - >> "_wrap_CoordinateSequence_hasRepeatedPoin..." >> | overload:ignore - "1" >> | tmap:out:noblock - "1" >> | sym:overname - "__SWIG_1" >> | storage - "static" >> | >> >> >> Tracing through the code in Swig_overload_rank (in overload.cxx), the >> problem seems to be that SWIG thinks incorrectly that the first method >> has one parameter instead of none (the emit_num_required returns one). >> >> What is the best way to track this down? Unfortunately, when I try a >> simple test case (like in the test-suite), I cannot reproduce the >> problem. I can point people at the geos project and the .i files if >> that is helpful. Also, any pointers on debugging SWIG internals would >> be appreciated, I find all the DOH data types to be fairly opaque... >> >> Charlie >> >> >> >> >> ------------------------------------------------------- >> This SF.net email is sponsored by: Splunk Inc. Do you grep through log >> files >> for problems? Stop! Download the new AJAX search engine that makes >> searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! >> http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click >> _______________________________________________ >> Swig-devel mailing list >> Swi...@li... >> https://lists.sourceforge.net/lists/listinfo/swig-devel > > > > > ------------------------------------------------------- > This SF.net email is sponsored by: Splunk Inc. Do you grep through log > files > for problems? Stop! Download the new AJAX search engine that makes > searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! > http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click |