From 564a91864a84046609bedcfc7cb5e5560fd62377 Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Thu, 23 Jan 2020 19:30:03 +0000 Subject: [PATCH] Refactor upcasts code In preparation for possible improvement in usage of SwigType_typedef_resolve_all - a SwigType* should be used, not a readable name in a String*. --- Source/Modules/csharp.cxx | 52 +++++++++++++++++---------------- Source/Modules/d.cxx | 60 ++++++++++++++++++++------------------- Source/Modules/java.cxx | 53 ++++++++++++++++++---------------- 3 files changed, 86 insertions(+), 79 deletions(-) diff --git a/Source/Modules/csharp.cxx b/Source/Modules/csharp.cxx index a5c236dac..aa0fece36 100644 --- a/Source/Modules/csharp.cxx +++ b/Source/Modules/csharp.cxx @@ -1709,11 +1709,11 @@ public: * addInterfaceNameAndUpcasts() * ----------------------------------------------------------------------------- */ - void addInterfaceNameAndUpcasts(SwigType *smart, String *interface_list, String *interface_upcasts, Hash *base_list, String *c_classname) { + void addInterfaceNameAndUpcasts(SwigType *smart, String *interface_list, String *interface_upcasts, Hash *base_list, SwigType *c_classname) { List *keys = Keys(base_list); for (Iterator it = First(keys); it.item; it = Next(it)) { Node *base = Getattr(base_list, it.item); - String *c_baseclass = SwigType_namestr(Getattr(base, "name")); + SwigType *c_baseclassname = Getattr(base, "name"); String *interface_name = Getattr(base, "interface:name"); if (Len(interface_list)) Append(interface_list, ", "); @@ -1733,12 +1733,11 @@ public: Replaceall(cptr_method_name, "$interfacename", interface_name); String *upcast_method_name = Swig_name_member(getNSpace(), getClassPrefix(), cptr_method_name); - upcastsCode(smart, upcast_method_name, c_classname, c_baseclass); + upcastsCode(smart, upcast_method_name, c_classname, c_baseclassname); Delete(upcast_method_name); Delete(cptr_method_name); Delete(interface_code); - Delete(c_baseclass); } Delete(keys); } @@ -1749,7 +1748,7 @@ public: * Add code for C++ casting to base class * ----------------------------------------------------------------------------- */ - void upcastsCode(SwigType *smart, String *upcast_method_name, String *c_classname, String *c_baseclass) { + void upcastsCode(SwigType *smart, String *upcast_method_name, SwigType *c_classname, SwigType *c_baseclassname) { String *wname = Swig_name_wrapper(upcast_method_name); Printv(imclass_cppcasts_code, "\n [global::System.Runtime.InteropServices.DllImport(\"", dllimport, "\", EntryPoint=\"", wname, "\")]\n", NIL); @@ -1757,29 +1756,34 @@ public: Replaceall(imclass_cppcasts_code, "$csclassname", proxy_class_name); + String *classname = SwigType_namestr(c_classname); + String *baseclassname = SwigType_namestr(c_baseclassname); if (smart) { String *smartnamestr = SwigType_namestr(smart); String *bsmartnamestr = SwigType_namestr(smart); - SwigType *rclassname = SwigType_typedef_resolve_all(c_classname); - SwigType *rbaseclass = SwigType_typedef_resolve_all(c_baseclass); - Replaceall(bsmartnamestr, rclassname, rbaseclass); - - Delete(rclassname); - Delete(rbaseclass); + SwigType *rclassname = SwigType_typedef_resolve_all(classname); + SwigType *rbaseclassname = SwigType_typedef_resolve_all(baseclassname); + Replaceall(bsmartnamestr, rclassname, rbaseclassname); Printv(upcasts_code, "SWIGEXPORT ", bsmartnamestr, " * SWIGSTDCALL ", wname, "(", smartnamestr, " *jarg1) {\n", " return jarg1 ? new ", bsmartnamestr, "(*jarg1) : 0;\n" "}\n", "\n", NIL); + + Delete(rbaseclassname); + Delete(rclassname); Delete(bsmartnamestr); Delete(smartnamestr); } else { Printv(upcasts_code, - "SWIGEXPORT ", c_baseclass, " * SWIGSTDCALL ", wname, "(", c_classname, " *jarg1) {\n", - " return (", c_baseclass, " *)jarg1;\n" + "SWIGEXPORT ", baseclassname, " * SWIGSTDCALL ", wname, "(", classname, " *jarg1) {\n", + " return (", baseclassname, " *)jarg1;\n" "}\n", "\n", NIL); } + + Delete(baseclassname); + Delete(classname); Delete(wname); } @@ -1788,10 +1792,9 @@ public: * ----------------------------------------------------------------------------- */ void emitProxyClassDefAndCPPCasts(Node *n) { - String *c_classname = SwigType_namestr(Getattr(n, "name")); - String *c_baseclass = NULL; + SwigType *c_classname = Getattr(n, "name"); + SwigType *c_baseclassname = NULL; String *baseclass = NULL; - String *c_baseclassname = NULL; String *interface_list = NewStringEmpty(); String *interface_upcasts = NewStringEmpty(); SwigType *typemap_lookup_type = Getattr(n, "classtypeobj"); @@ -1813,12 +1816,13 @@ public: Iterator base = First(baselist); while (base.item) { if (!(GetFlag(base.item, "feature:ignore") || Getattr(base.item, "feature:interface"))) { - String *baseclassname = Getattr(base.item, "name"); + SwigType *baseclassname = Getattr(base.item, "name"); if (!c_baseclassname) { - c_baseclassname = baseclassname; - baseclass = Copy(getProxyName(baseclassname)); - if (baseclass) - c_baseclass = SwigType_namestr(baseclassname); + String *name = getProxyName(baseclassname); + if (name) { + c_baseclassname = baseclassname; + baseclass = name; + } } else { /* Warn about multiple inheritance for additional base class(es) */ String *proxyclassname = Getattr(n, "classtypeobj"); @@ -1834,7 +1838,7 @@ public: if (interface_bases) addInterfaceNameAndUpcasts(smart, interface_list, interface_upcasts, interface_bases, c_classname); - bool derived = baseclass && getProxyName(c_baseclassname); + bool derived = baseclass != 0; if (derived && purebase_notderived) pure_baseclass = empty_string; const String *wanted_base = baseclass ? baseclass : pure_baseclass; @@ -1842,7 +1846,6 @@ public: if (purebase_replace) { wanted_base = pure_baseclass; derived = false; - Delete(baseclass); baseclass = NULL; if (purebase_notderived) Swig_error(Getfile(n), Getline(n), "The csbase typemap for proxy %s must contain just one of the 'replace' or 'notderived' attributes.\n", typemap_lookup_type); @@ -2033,12 +2036,11 @@ public: if (derived) { String *upcast_method_name = Swig_name_member(getNSpace(), getClassPrefix(), smart != 0 ? "SWIGSmartPtrUpcast" : "SWIGUpcast"); - upcastsCode(smart, upcast_method_name, c_classname, c_baseclass); + upcastsCode(smart, upcast_method_name, c_classname, c_baseclassname); Delete(upcast_method_name); } Delete(smart); - Delete(baseclass); } /* ---------------------------------------------------------------------- diff --git a/Source/Modules/d.cxx b/Source/Modules/d.cxx index af850ebbd..683686ea1 100644 --- a/Source/Modules/d.cxx +++ b/Source/Modules/d.cxx @@ -3140,11 +3140,10 @@ private: * Handle inheriting from D and C++ classes. */ - String *c_classname = SwigType_namestr(Getattr(n, "name")); - String *c_baseclass = NULL; - Node *basenode = NULL; - String *basename = NULL; + String *c_classname = Getattr(n, "name"); String *c_baseclassname = NULL; + Node *basenode = NULL; + String *baseclass = NULL; // Inheritance from pure D classes. Node *attributes = NewHash(); @@ -3161,13 +3160,14 @@ private: Iterator base = First(baselist); while (base.item) { if (!GetFlag(base.item, "feature:ignore")) { - String *baseclassname = Getattr(base.item, "name"); + SwigType *baseclassname = Getattr(base.item, "name"); if (!c_baseclassname) { basenode = base.item; - c_baseclassname = baseclassname; - basename = createProxyName(c_baseclassname); - if (basename) - c_baseclass = SwigType_namestr(baseclassname); + String *name = createProxyName(baseclassname); + if (name) { + c_baseclassname = baseclassname; + baseclass = name; + } } else { /* Warn about multiple inheritance for additional base class(es) */ String *proxyclassname = Getattr(n, "classtypeobj"); @@ -3180,25 +3180,24 @@ private: } } - bool derived = (basename != NULL); + bool derived = baseclass != NULL; if (derived && purebase_notderived) { pure_baseclass = empty_string; } - const String *wanted_base = basename ? basename : pure_baseclass; + const String *wanted_base = baseclass ? baseclass : pure_baseclass; if (purebase_replace) { wanted_base = pure_baseclass; derived = false; basenode = NULL; - Delete(basename); - basename = NULL; + baseclass = NULL; if (purebase_notderived) { Swig_error(Getfile(n), Getline(n), "The dbase typemap for proxy %s must contain just one of the 'replace' or 'notderived' attributes.\n", typemap_lookup_type); } - } else if (basename && Len(pure_baseclass) > 0) { + } else if (baseclass && Len(pure_baseclass) > 0) { Swig_warning(WARN_D_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base class %s ignored. Multiple inheritance is not supported in D. " "Perhaps you need one of the 'replace' or 'notderived' attributes in the dbase typemap?\n", typemap_lookup_type, pure_baseclass); @@ -3206,7 +3205,7 @@ private: // Add code to do C++ casting to base class (only for classes in an inheritance hierarchy) if (derived) { - writeClassUpcast(n, proxy_class_name, c_classname, c_baseclass); + writeClassUpcast(n, proxy_class_name, c_classname, c_baseclassname); } /* @@ -3354,8 +3353,7 @@ private: // Write the class body and the curly bracket closing the class definition // to the proxy module. indentCode(body); - Replaceall(body, "$dbaseclass", basename); - Delete(basename); + Replaceall(body, "$dbaseclass", baseclass); Printv(proxy_class_code, body, "\n}\n", NIL); Delete(body); @@ -3368,7 +3366,7 @@ private: /* --------------------------------------------------------------------------- * D::writeClassUpcast() * --------------------------------------------------------------------------- */ - void writeClassUpcast(Node *n, const String* d_class_name, String* c_class_name, String* c_base_name) { + void writeClassUpcast(Node *n, const String* d_class_name, SwigType* c_classname, SwigType* c_baseclassname) { SwigType *smart = Swig_cparse_smartptr(n); String *upcast_name = Swig_name_member(getNSpace(), d_class_name, (smart != 0 ? "SmartPtrUpcast" : "Upcast")); @@ -3377,16 +3375,15 @@ private: writeImDModuleFunction(upcast_name, "void*", "(void* objectRef)", upcast_wrapper_name); + String *classname = SwigType_namestr(c_classname); + String *baseclassname = SwigType_namestr(c_baseclassname); if (smart) { String *smartnamestr = SwigType_namestr(smart); String *bsmartnamestr = SwigType_namestr(smart); - SwigType *rclassname = SwigType_typedef_resolve_all(c_class_name); - SwigType *rbaseclass = SwigType_typedef_resolve_all(c_base_name); - Replaceall(bsmartnamestr, rclassname, rbaseclass); - - Delete(rclassname); - Delete(rbaseclass); + SwigType *rclassname = SwigType_typedef_resolve_all(classname); + SwigType *rbaseclassname = SwigType_typedef_resolve_all(baseclassname); + Replaceall(bsmartnamestr, rclassname, rbaseclassname); Printv(upcasts_code, "SWIGEXPORT ", bsmartnamestr, " * ", upcast_wrapper_name, @@ -3394,20 +3391,25 @@ private: " return objectRef ? new ", bsmartnamestr, "(*objectRef) : 0;\n" "}\n", "\n", NIL); + + Delete(rbaseclassname); + Delete(rclassname); Delete(bsmartnamestr); Delete(smartnamestr); } else { Printv(upcasts_code, - "SWIGEXPORT ", c_base_name, " * ", upcast_wrapper_name, - "(", c_base_name, " *objectRef) {\n", - " return (", c_base_name, " *)objectRef;\n" + "SWIGEXPORT ", baseclassname, " * ", upcast_wrapper_name, + "(", baseclassname, " *objectRef) {\n", + " return (", baseclassname, " *)objectRef;\n" "}\n", "\n", NIL); } - Replaceall(upcasts_code, "$cclass", c_class_name); - Replaceall(upcasts_code, "$cbaseclass", c_base_name); + Replaceall(upcasts_code, "$cclass", classname); + Replaceall(upcasts_code, "$cbaseclass", baseclassname); + Delete(baseclassname); + Delete(classname); Delete(upcast_name); Delete(upcast_wrapper_name); Delete(smart); diff --git a/Source/Modules/java.cxx b/Source/Modules/java.cxx index 14d4d50ad..0c3b5bf3c 100644 --- a/Source/Modules/java.cxx +++ b/Source/Modules/java.cxx @@ -1853,11 +1853,11 @@ public: * addInterfaceNameAndUpcasts() * ----------------------------------------------------------------------------- */ - void addInterfaceNameAndUpcasts(SwigType *smart, String *interface_list, String *interface_upcasts, Hash *base_list, String *c_classname) { + void addInterfaceNameAndUpcasts(SwigType *smart, String *interface_list, String *interface_upcasts, Hash *base_list, SwigType *c_classname) { List *keys = Keys(base_list); for (Iterator it = First(keys); it.item; it = Next(it)) { Node *base = Getattr(base_list, it.item); - String *c_baseclass = SwigType_namestr(Getattr(base, "name")); + SwigType *c_baseclassname = Getattr(base, "name"); String *interface_name = Getattr(base, "interface:name"); if (Len(interface_list)) Append(interface_list, ", "); @@ -1877,11 +1877,11 @@ public: Replaceall(cptr_method_name, "$interfacename", interface_name); String *upcast_method_name = Swig_name_member(getNSpace(), getClassPrefix(), cptr_method_name); - upcastsCode(smart, upcast_method_name, c_classname, c_baseclass); + upcastsCode(smart, upcast_method_name, c_classname, c_baseclassname); + Delete(upcast_method_name); Delete(cptr_method_name); Delete(interface_code); - Delete(c_baseclass); } Delete(keys); } @@ -1892,21 +1892,21 @@ public: * Add code for C++ casting to base class * ----------------------------------------------------------------------------- */ - void upcastsCode(SwigType *smart, String *upcast_method_name, String *c_classname, String *c_baseclass) { + void upcastsCode(SwigType *smart, String *upcast_method_name, SwigType *c_classname, SwigType *c_baseclassname) { String *jniname = makeValidJniName(upcast_method_name); String *wname = Swig_name_wrapper(jniname); + Printf(imclass_cppcasts_code, " public final static native long %s(long jarg1);\n", upcast_method_name); + + String *classname = SwigType_namestr(c_classname); + String *baseclassname = SwigType_namestr(c_baseclassname); if (smart) { String *smartnamestr = SwigType_namestr(smart); String *bsmartnamestr = SwigType_namestr(smart); - SwigType *rclassname = SwigType_typedef_resolve_all(c_classname); - SwigType *rbaseclass = SwigType_typedef_resolve_all(c_baseclass); - - Replaceall(bsmartnamestr, rclassname, rbaseclass); - - Delete(rclassname); - Delete(rbaseclass); + SwigType *rclassname = SwigType_typedef_resolve_all(classname); + SwigType *rbaseclassname = SwigType_typedef_resolve_all(baseclassname); + Replaceall(bsmartnamestr, rclassname, rbaseclassname); Printv(upcasts_code, "SWIGEXPORT jlong JNICALL ", wname, "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n", @@ -1918,6 +1918,9 @@ public: " *(", bsmartnamestr, " **)&baseptr = argp1 ? new ", bsmartnamestr, "(*argp1) : 0;\n" " return baseptr;\n" "}\n", "\n", NIL); + + Delete(rbaseclassname); + Delete(rclassname); Delete(bsmartnamestr); Delete(smartnamestr); } else { @@ -1926,11 +1929,13 @@ public: " jlong baseptr = 0;\n" " (void)jenv;\n" " (void)jcls;\n" - " *(", c_baseclass, " **)&baseptr = *(", c_classname, " **)&jarg1;\n" + " *(", baseclassname, " **)&baseptr = *(", classname, " **)&jarg1;\n" " return baseptr;\n" "}\n", "\n", NIL); } + Delete(baseclassname); + Delete(classname); Delete(wname); Delete(jniname); } @@ -1940,10 +1945,9 @@ public: * ----------------------------------------------------------------------------- */ void emitProxyClassDefAndCPPCasts(Node *n) { - String *c_classname = SwigType_namestr(Getattr(n, "name")); - String *c_baseclass = NULL; + SwigType *c_classname = Getattr(n, "name"); + SwigType *c_baseclassname = NULL; String *baseclass = NULL; - String *c_baseclassname = NULL; String *interface_list = NewStringEmpty(); String *interface_upcasts = NewStringEmpty(); SwigType *typemap_lookup_type = Getattr(n, "classtypeobj"); @@ -1965,12 +1969,13 @@ public: Iterator base = First(baselist); while (base.item) { if (!(GetFlag(base.item, "feature:ignore") || Getattr(base.item, "feature:interface"))) { - String *baseclassname = Getattr(base.item, "name"); + SwigType *baseclassname = Getattr(base.item, "name"); if (!c_baseclassname) { - c_baseclassname = baseclassname; - baseclass = Copy(getProxyName(baseclassname)); - if (baseclass) - c_baseclass = SwigType_namestr(baseclassname); + String *name = getProxyName(baseclassname); + if (name) { + c_baseclassname = baseclassname; + baseclass = name; + } } else { /* Warn about multiple inheritance for additional base class(es) */ String *proxyclassname = Getattr(n, "classtypeobj"); @@ -1987,7 +1992,7 @@ public: if (interface_bases) addInterfaceNameAndUpcasts(smart, interface_list, interface_upcasts, interface_bases, c_classname); - bool derived = baseclass && getProxyName(c_baseclassname); + bool derived = baseclass != 0; if (derived && purebase_notderived) pure_baseclass = empty_string; const String *wanted_base = baseclass ? baseclass : pure_baseclass; @@ -1995,7 +2000,6 @@ public: if (purebase_replace) { wanted_base = pure_baseclass; derived = false; - Delete(baseclass); baseclass = NULL; if (purebase_notderived) Swig_error(Getfile(n), Getline(n), "The javabase typemap for proxy %s must contain just one of the 'replace' or 'notderived' attributes.\n", typemap_lookup_type); @@ -2118,12 +2122,11 @@ public: if (derived) { String *upcast_method_name = Swig_name_member(getNSpace(), getClassPrefix(), smart != 0 ? "SWIGSmartPtrUpcast" : "SWIGUpcast"); - upcastsCode(smart, upcast_method_name, c_classname, c_baseclass); + upcastsCode(smart, upcast_method_name, c_classname, c_baseclassname); Delete(upcast_method_name); } Delete(smart); - Delete(baseclass); } /* ----------------------------------------------------------------------