From: David F. <fr...@tu...> - 2009-05-26 16:42:41
|
Hi all, I see that the fix I made to perl5.cxx isn't quite correct. I can't use the Swig_cparse_replace_descriptor() function directly, because this adds an extra "SWIGTYPE" string to the descriptor, and this expanded string doesn't match the actual class type that is generated by the perl interface. As a workaround, I've created a local (static) function in order to solve this problem - see the patch below. I'm less than satisfied with this solution, however, because $descriptor() will expand in two different ways depending upon the context. Does have anyone have any advice on a better way to solve this? Tx. David Fletcher Tuscany Design Automation, Inc. fr...@tu... 3030 S. College Ave, Suite 102 Ft. Collins, CO 80525 USA ===File /tmp/perl5.cxx.diff================================= Index: perl5.cxx =================================================================== --- perl5.cxx (revision 11232) +++ perl5.cxx (working copy) @@ -103,6 +103,56 @@ static Hash *operators = 0; static int have_operators = 0; +static void +Swig_perl5_replace_descriptor(String *s) { + char tmp[512]; + String *arg = 0; + SwigType *t; + char *c = 0; + + while ((c = strstr(Char(s), "$descriptor("))) { + char *d = tmp; + int level = 0; + while (*c) { + if (*c == '(') + level++; + if (*c == ')') { + level--; + if (level == 0) { + break; + } + } + *d = *c; + d++; + c++; + } + *d = 0; + arg = NewString(tmp + 12); + t = Swig_cparse_type(arg); + Delete(arg); + arg = 0; + + if (t) { + String *mangle; + String *descriptor; + + mangle = SwigType_manglestr(t); + descriptor = NewString(mangle); + SwigType_remember(t); + *d = ')'; + d++; + *d = 0; + Replace(s, tmp, descriptor, DOH_REPLACE_ANY); + Delete(mangle); + Delete(descriptor); + Delete(t); + } else { + Swig_error(Getfile(s), Getline(s), "Bad $descriptor() macro.\n"); + break; + } + } +} + class PERL5:public Language { public: @@ -461,7 +511,7 @@ } Setattr(n, "wrap:name", wname); if(GetFlag(n, "perl5:instancevariable")) { - int addfail; + int addfail = 1; Printv(f->def, "SWIGCLASS_STATIC int ", wname, "(pTHX_ SV *sv, MAGIC *mg) {\n", NIL); @@ -1651,6 +1701,7 @@ virtual int insertDirective(Node *n) { String *code = Getattr(n, "code"); + Swig_perl5_replace_descriptor(code); String *section = Getattr(n, "section"); if ((!ImportMode) && (Cmp(section, "perl") == 0)) { ============================================================ |