From 6c5a5ac719344959e01bc3cf61875b6758200384 Mon Sep 17 00:00:00 2001 From: Dave Beazley Date: Thu, 29 May 2003 18:28:31 +0000 Subject: [PATCH] Changes to default type handling to disambiguate dimensionless [] and dimensioned arrays [ANY]. git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@4832 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- Source/Swig/stype.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/Source/Swig/stype.c b/Source/Swig/stype.c index b88bc5e14..1a7161de9 100644 --- a/Source/Swig/stype.c +++ b/Source/Swig/stype.c @@ -534,6 +534,9 @@ SwigType_strip_qualifiers(SwigType *t) { * Types: SWIGTYPE * MemberPointer: m(CLASS).SWIGTYPE * Enums: enum SWIGENUM + * + * Note: if this function is applied to a primitive type, it returns NULL. This + * allows recursive application for special types like arrays. * ----------------------------------------------------------------------------- */ static Hash *default_cache = 0; @@ -545,8 +548,15 @@ SwigType *SwigType_default(SwigType *t) { if (!default_cache) default_cache = NewHash(); r = Getattr(default_cache,t); - if (r) return Copy(r); - + if (r) { + if (Strcmp(r,t) == 0) return 0; + return Copy(r); + } + + if (SwigType_isvarargs(t)) { + return 0; + } + r = t; while ((r1 = SwigType_typedef_resolve(r))) { if (r != t) Delete(r); @@ -563,18 +573,37 @@ SwigType *SwigType_default(SwigType *t) { } else if (SwigType_isreference(r)) { def = NewString("r.SWIGTYPE"); } else if (SwigType_isarray(r)) { - def = NewString("a().SWIGTYPE"); + if (Strcmp(r,"a(ANY).SWIGTYPE") == 0) { + def = NewString("a().SWIGTYPE"); + } else { + int i, empty = 0; + int ndim = SwigType_array_ndim(r); + for (i = 0; i < ndim; i++) { + String *dim = SwigType_array_getdim(r,i); + if (!Len(dim)) { + empty = 1; + } + Delete(dim); + } + if (empty) { + def = NewString("a().SWIGTYPE"); + } else { + def = NewString("a(ANY).SWIGTYPE"); + } + } } else if (SwigType_ismemberpointer(r)) { def = NewString("m(CLASS).SWIGTYPE"); } else if (SwigType_isenum(r)) { def = NewString("enum SWIGTYPE"); - } else if (SwigType_isvarargs(r)) { - def = NewString("v(...)"); } else { def = NewString("SWIGTYPE"); } if (r != t) Delete(r); Setattr(default_cache,t,Copy(def)); + if (Strcmp(def,t) == 0) { + Delete(def); + def = 0; + } return def; }