From: Vadim Z. <vz...@ze...> - 2010-11-12 13:45:10
|
On Thu, 19 Aug 2010 19:28:15 +0100 William S Fulton <ws...@fu...> wrote: WSF> > WSF> Vadim Zeitlin wrote: WSF> > WSF> > But while doing this I discovered something else that I hadn't WSF> > WSF> > realised before: apparently there can be only a single %rename WSF> > WSF> > attached to a declaration. So if you want to rename stuff globally WSF> > WSF> > and try to do e.g. WSF> > WSF> > WSF> > WSF> > %rename("%(regex/^Set(.*)/put\\1/)s") ""; WSF> > WSF> > %rename("%(regex/^Get(.*)/get\\1/)s") ""; ... WSF> There must be some iteration through the list somewhere in the code as WSF> there is priority as to what is a better match You were right, of course, there is already an iteration over all rename_list elements in Swig_name_nameobj_lget() in naming.c. And the problem lies in this function too: it currently assumes that if there is no "target name", then the %rename always matches. This is, however, not true in the above case as a %(regex)s expansion may fail. So I'd like to propose the following patch: --- a/Source/Swig/naming.c +++ b/Source/Swig/naming.c @@ -1302,7 +1302,13 @@ Hash *Swig_name_nameobj_lget(List *namelist, Node *n, String *prefix, String *na : Swig_name_match_value(tname, sname); Delete(sname); } else { - match = 1; + /* Applying the renaming rule may fail if it contains a %(regex)s expression that doesn't match the given name. */ + String *sname = NewStringf(Getattr(rn, "name"), name); + if (sname) { + if (Len(sname)) + match = 1; + Delete(sname); + } } } if (match) { It makes the above example work for me and, AFAICS, shouldn't break anything else. Do you have any objections against committing this? Thanks, VZ P.S. Thanks a lot for adding swigprint gdb command, it made debugging this incomparably easier. |