From 4267a26ecdee5db80cc58eac498f1bccb3894de1 Mon Sep 17 00:00:00 2001 From: Marcelo Matus Date: Thu, 24 Nov 2005 00:54:10 +0000 Subject: [PATCH] fix for perl + multiple modules git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@7863 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- SWIG/Lib/perl5/perlrun.swg | 30 +++++++++++++++++++++--------- SWIG/Source/Modules/perl5.cxx | 17 ++++++++--------- SWIG/Source/Swig/swig.h | 1 + SWIG/Source/Swig/typesys.c | 16 +++++++++++++++- 4 files changed, 45 insertions(+), 19 deletions(-) diff --git a/SWIG/Lib/perl5/perlrun.swg b/SWIG/Lib/perl5/perlrun.swg index 321f588bc..58ddb3044 100644 --- a/SWIG/Lib/perl5/perlrun.swg +++ b/SWIG/Lib/perl5/perlrun.swg @@ -77,11 +77,24 @@ extern "C" { #define SWIG_MAYBE_PERL_OBJECT SWIG_PERL_OBJECT_DECL -SWIGRUNTIME swig_cast_info * -SWIG_Perl_TypeCheckRV(SWIG_MAYBE_PERL_OBJECT SV *rv, swig_type_info *ty) { - SWIG_TypeCheck_Template(sv_derived_from(rv, (char *) iter->type->name), ty); +SWIGRUNTIME const char * +SWIG_Perl_TypeProxyName(const swig_type_info *type) { + if (!type) return NULL; + if (type->clientdata != NULL) { + return (const char*) type->clientdata; + } + else { + return type->name; + } } +SWIGRUNTIME swig_cast_info * +SWIG_TypeProxyCheck(const char *c, swig_type_info *ty) { + SWIG_TypeCheck_Template(( (!iter->type->clientdata && (strcmp((char*)iter->type->name, c) == 0)) + || (iter->type->clientdata && (strcmp((char*)iter->type->clientdata, c) == 0))), ty); +} + + /* Function for getting a pointer value */ SWIGRUNTIME int @@ -131,8 +144,7 @@ SWIG_Perl_ConvertPtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info * if (_t) { /* Now see if the types match */ char *_c = HvNAME(SvSTASH(SvRV(sv))); - - tc = SWIG_TypeCheck(_c,_t); + tc = SWIG_TypeProxyCheck(_c,_t); if (!tc) { return SWIG_ERROR; } @@ -171,7 +183,7 @@ SWIG_Perl_MakePtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, swig_type_info *t, i SV *obj=newSV(0); HV *hash=newHV(); HV *stash; - sv_setref_pv(obj, (char *) t->name, ptr); + sv_setref_pv(obj, (char *) SWIG_Perl_TypeProxyName(t), ptr); stash=SvSTASH(SvRV(obj)); if (flags & SWIG_POINTER_OWN) { HV *hv; @@ -189,7 +201,7 @@ SWIG_Perl_MakePtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, swig_type_info *t, i sv_bless(sv, stash); } else { - sv_setref_pv(sv, (char *) t->name, ptr); + sv_setref_pv(sv, (char *) SWIG_Perl_TypeProxyName(t), ptr); } } @@ -204,10 +216,10 @@ SWIGRUNTIME void SWIG_Perl_MakePackedObj(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, int sz, swig_type_info *type) { char result[1024]; char *r = result; - if ((2*sz + 1 + strlen(type->name)) > 1000) return; + if ((2*sz + 1 + strlen(SWIG_Perl_TypeProxyName(type))) > 1000) return; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); - strcpy(r,type->name); + strcpy(r,SWIG_Perl_TypeProxyName(type)); sv_setpv(sv, result); } diff --git a/SWIG/Source/Modules/perl5.cxx b/SWIG/Source/Modules/perl5.cxx index 1a4766a10..f2208aa08 100644 --- a/SWIG/Source/Modules/perl5.cxx +++ b/SWIG/Source/Modules/perl5.cxx @@ -325,27 +325,26 @@ public: Printf(f_header,"%s\n", magic); String *type_table = NewString(""); - SwigType_emit_type_table(f_runtime,type_table); /* Patch the type table to reflect the names used by shadow classes */ if (blessed) { Iterator cls; for (cls = First(classlist); cls.item; cls = Next(cls)) { - if (Getattr(cls.item,"perl5:proxy")) { - SwigType *type = Copy(Getattr(cls.item,"classtype")); - + String *pname = Getattr(cls.item,"perl5:proxy"); + if (pname) { + SwigType *type = Getattr(cls.item,"classtypeobj"); if (!type) continue; /* If unnamed class, no type will be found */ + type = Copy(type); SwigType_add_pointer(type); - String *mangle = NewStringf("\"%s\"", SwigType_manglestr(type)); - String *rep = NewStringf("\"%s\"", Getattr(cls.item,"perl5:proxy")); - Replaceall(type_table,mangle,rep); - Delete(mangle); - Delete(rep); + String *mangled = SwigType_manglestr(type); + SwigType_remember_mangleddata(mangled, NewStringf("\"%s\"",pname)); Delete(type); + Delete(mangled); } } } + SwigType_emit_type_table(f_runtime,type_table); Printf(f_wrappers,"%s",type_table); Delete(type_table); diff --git a/SWIG/Source/Swig/swig.h b/SWIG/Source/Swig/swig.h index c115eaaca..b1178f547 100644 --- a/SWIG/Source/Swig/swig.h +++ b/SWIG/Source/Swig/swig.h @@ -292,6 +292,7 @@ extern int SwigType_isclass(SwigType *t); extern void SwigType_attach_symtab(Symtab *syms); extern void SwigType_remember(SwigType *t); extern void SwigType_remember_clientdata(SwigType *t, const String_or_char *clientdata); +extern void SwigType_remember_mangleddata(String *mangled, const String_or_char *clientdata); extern void (*SwigType_remember_trace(void (*tf)(SwigType *, String *, String *)))(SwigType *, String *, String *); extern void SwigType_emit_type_table(File *f_headers, File *f_table); extern int SwigType_type(SwigType *t); diff --git a/SWIG/Source/Swig/typesys.c b/SWIG/Source/Swig/typesys.c index f61e89272..9249653c4 100644 --- a/SWIG/Source/Swig/typesys.c +++ b/SWIG/Source/Swig/typesys.c @@ -1379,10 +1379,19 @@ static Hash *r_mangled = 0; /* Hash mapping mangled types to full static Hash *r_resolved = 0; /* Hash mapping resolved types to mangled types */ static Hash *r_ltype = 0; /* Hash mapping mangled names to their local c type */ static Hash *r_clientdata = 0; /* Hash mapping resolved types to client data */ +static Hash *r_mangleddata = 0; /* Hash mapping mangled types to client data */ static Hash *r_remembered = 0; /* Hash of types we remembered already */ static void (*r_tracefunc)(SwigType *t, String *mangled, String *clientdata) = 0; +void SwigType_remember_mangleddata(String *mangled, const String_or_char *clientdata) { + if (!r_mangleddata) { + r_mangleddata = NewHash(); + } + Setattr(r_mangleddata, mangled, clientdata); +} + + void SwigType_remember_clientdata(SwigType *t, const String_or_char *clientdata) { String *mt; SwigType *lt; @@ -1566,6 +1575,11 @@ String *SwigType_clientdata_collect(String *ms) { Hash *mh; String *clientdata = 0; + if (r_mangleddata) { + clientdata = Getattr(r_mangleddata,ms); + if (clientdata) return clientdata; + } + mh = Getattr(r_mangled,ms); if (mh) { Iterator ki; @@ -1875,7 +1889,7 @@ SwigType_emit_type_table(File *f_forward, File *f_table) { } else { nt = NewStringf("%s|%s", rn, ln); } - Printf(types, "\"%s\", \"%s\", 0, 0, %s, 0};\n", ki.item, nt, cd); + Printf(types, "\"%s\", \"%s\", 0, 0, (void*)%s, 0};\n", ki.item, nt, cd); el = SwigType_equivalent_mangle(ki.item,0,0); for (ei = First(el); ei.item; ei = Next(ei)) {