diff options
author | William S Fulton <wsf@fultondesigns.co.uk> | 2010-03-09 21:15:34 +0000 |
---|---|---|
committer | William S Fulton <wsf@fultondesigns.co.uk> | 2010-03-09 21:15:34 +0000 |
commit | 96f98795116fbf5b176ea5f299f15d0e469c23f4 (patch) | |
tree | c7613de081880cf281e08b5c60176c517f7b0920 | |
parent | deafe98dc4d4fc1b0683f950cfffeb2ea519f45b (diff) | |
download | swig-96f98795116fbf5b176ea5f299f15d0e469c23f4.tar.gz |
Fixes for nspace and derived classes
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@11930 626c5289-ae23-0410-ae9c-e8d60b6d4f22
-rw-r--r-- | Doc/Manual/CSharp.html | 1 | ||||
-rw-r--r-- | Doc/Manual/Java.html | 8 | ||||
-rw-r--r-- | Examples/test-suite/csharp/nspace_runme.cs | 6 | ||||
-rw-r--r-- | Examples/test-suite/java/nspace_runme.java | 6 | ||||
-rw-r--r-- | Examples/test-suite/nspace.i | 12 | ||||
-rw-r--r-- | Lib/csharp/csharp.swg | 2 | ||||
-rw-r--r-- | Lib/java/java.swg | 2 | ||||
-rw-r--r-- | Source/Modules/csharp.cxx | 22 | ||||
-rw-r--r-- | Source/Modules/java.cxx | 34 |
9 files changed, 68 insertions, 25 deletions
diff --git a/Doc/Manual/CSharp.html b/Doc/Manual/CSharp.html index fd2ef981f..21b319e29 100644 --- a/Doc/Manual/CSharp.html +++ b/Doc/Manual/CSharp.html @@ -206,6 +206,7 @@ jniclassinterfaces -> imclassinterfaces $javaclassname -> $csclassname $&javaclassname -> $&csclassname $*javaclassname -> $*csclassname +$javaclazzname -> $csclazzname $javainput -> $csinput $jnicall -> $imcall </pre></div> diff --git a/Doc/Manual/Java.html b/Doc/Manual/Java.html index 0984b2ecf..5b61955ab 100644 --- a/Doc/Manual/Java.html +++ b/Doc/Manual/Java.html @@ -5162,6 +5162,14 @@ If the type does not have an associated proxy class, it expands to the type wrap </p> <p> +<b><tt>$javaclazzname</tt></b><br> +This special variable works like <tt>$javaclassname</tt>, but expands the fully qualified C++ class into the package name, +if used by the <a href="SWIGPlus.html#SWIGPlus_nspace">nspace feature</a>, and the proxy class name, mangled for use as a function name. +For example, <tt>Namespace1::Namespace2::Klass</tt> is expanded into <tt>Namespace1_Namespace2_Klass_</tt>. +This special variable is usually used for making calls to a function in the intermediary JNI class, as they are mangled with this prefix. +</p> + +<p> <b><tt>$null </tt></b><br> Used in input typemaps to return early from JNI functions that have either void or a non-void return type. Example: </p> diff --git a/Examples/test-suite/csharp/nspace_runme.cs b/Examples/test-suite/csharp/nspace_runme.cs index 91baf6a0f..7ced06a04 100644 --- a/Examples/test-suite/csharp/nspace_runme.cs +++ b/Examples/test-suite/csharp/nspace_runme.cs @@ -56,5 +56,11 @@ public class runme ns.Dispose(); nspaceNamespace.NoNSpacePlease nons = new nspaceNamespace.NoNSpacePlease(); nons.Dispose(); + + // Derived class + nspaceNamespace.Outer.Inner3.Blue blue3 = new nspaceNamespace.Outer.Inner3.Blue(); + blue3.blueInstanceMethod(); + nspaceNamespace.Outer.Inner4.Blue blue4 = new nspaceNamespace.Outer.Inner4.Blue(); + blue4.blueInstanceMethod(); } } diff --git a/Examples/test-suite/java/nspace_runme.java b/Examples/test-suite/java/nspace_runme.java index ca83b7d04..a50bb9ae9 100644 --- a/Examples/test-suite/java/nspace_runme.java +++ b/Examples/test-suite/java/nspace_runme.java @@ -60,5 +60,11 @@ public class nspace_runme { // turn feature off / ignoring nspacePackage.Outer.nspace ns = new nspacePackage.Outer.nspace(); nspacePackage.NoNSpacePlease nons = new nspacePackage.NoNSpacePlease(); + + // Derived class + nspacePackage.Outer.Inner3.Blue blue3 = new nspacePackage.Outer.Inner3.Blue(); + blue3.blueInstanceMethod(); + nspacePackage.Outer.Inner4.Blue blue4 = new nspacePackage.Outer.Inner4.Blue(); + blue4.blueInstanceMethod(); } } diff --git a/Examples/test-suite/nspace.i b/Examples/test-suite/nspace.i index 14be0aa20..82f6e1101 100644 --- a/Examples/test-suite/nspace.i +++ b/Examples/test-suite/nspace.i @@ -73,6 +73,18 @@ namespace Outer { class NoNSpacePlease {}; } // Inner2 + // Derived class + namespace Inner3 { + struct Blue : Inner2::Color { + void blueInstanceMethod() {} + }; + } + namespace Inner4 { + struct Blue : Inner2::Color { + void blueInstanceMethod() {} + }; + } + class SomeClass { public: Inner1::Color::Channel GetInner1ColorChannel() { return Inner1::Color::Transmission; } diff --git a/Lib/csharp/csharp.swg b/Lib/csharp/csharp.swg index 204cf4b2f..1f58db48d 100644 --- a/Lib/csharp/csharp.swg +++ b/Lib/csharp/csharp.swg @@ -841,7 +841,7 @@ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { %typemap(csbody_derived) SWIGTYPE %{ private HandleRef swigCPtr; - internal $csclassname(IntPtr cPtr, bool cMemoryOwn) : base($imclassname.$csclassnameUpcast(cPtr), cMemoryOwn) { + internal $csclassname(IntPtr cPtr, bool cMemoryOwn) : base($imclassname.$csclazznameSWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new HandleRef(this, cPtr); } diff --git a/Lib/java/java.swg b/Lib/java/java.swg index f37cba77a..ad7c8074d 100644 --- a/Lib/java/java.swg +++ b/Lib/java/java.swg @@ -1072,7 +1072,7 @@ private long swigCPtr; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { - super($imclassname.SWIG$javaclassnameUpcast(cPtr), cMemoryOwn); + super($imclassname.$javaclazznameSWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } diff --git a/Source/Modules/csharp.cxx b/Source/Modules/csharp.cxx index 0dbed4d1e..55de14285 100644 --- a/Source/Modules/csharp.cxx +++ b/Source/Modules/csharp.cxx @@ -1753,6 +1753,8 @@ public: Delete(attributes); Delete(destruct); + String *csclazzname = Swig_name_member(getNSpace(), proxy_class_name, ""); // mangled full proxy class name + // Emit extra user code Printv(proxy_class_def, typemapLookup(n, "cscode", typemap_lookup_type, WARN_NONE), // extra C# code "\n", NIL); @@ -1770,21 +1772,27 @@ public: Replaceall(proxy_class_def, "$dllimport", dllimport); Replaceall(proxy_class_code, "$dllimport", dllimport); + Replaceall(proxy_class_def, "$csclazzname", csclazzname); + Replaceall(proxy_class_code, "$csclazzname", csclazzname); + // Add code to do C++ casting to base class (only for classes in an inheritance hierarchy) if (derived) { - Printv(imclass_cppcasts_code, "\n [DllImport(\"", dllimport, "\", EntryPoint=\"CSharp_", proxy_class_name, "Upcast", "\")]\n", NIL); - Printf(imclass_cppcasts_code, " public static extern IntPtr $csclassnameUpcast(IntPtr objectRef);\n"); + String *upcast_method = Swig_name_member(getNSpace(), proxy_class_name, "SWIGUpcast"); + String *wname = Swig_name_wrapper(upcast_method); + + Printv(imclass_cppcasts_code, "\n [DllImport(\"", dllimport, "\", EntryPoint=\"", wname, "\")]\n", NIL); + Printf(imclass_cppcasts_code, " public static extern IntPtr %s(IntPtr jarg1);\n", upcast_method); Replaceall(imclass_cppcasts_code, "$csclassname", proxy_class_name); Printv(upcasts_code, - "SWIGEXPORT $cbaseclass * SWIGSTDCALL CSharp_$imclazznameUpcast", - "($cclass *objectRef) {\n", " return ($cbaseclass *)objectRef;\n" "}\n", "\n", NIL); + "SWIGEXPORT ", c_baseclass, " * SWIGSTDCALL ", wname, + "(", c_classname, " *jarg1) {\n", " return (", c_baseclass, " *)jarg1;\n" "}\n", "\n", NIL); - Replaceall(upcasts_code, "$cbaseclass", c_baseclass); - Replaceall(upcasts_code, "$imclazzname", proxy_class_name); - Replaceall(upcasts_code, "$cclass", c_classname); + Delete(wname); + Delete(upcast_method); } + Delete(csclazzname); Delete(baseclass); } diff --git a/Source/Modules/java.cxx b/Source/Modules/java.cxx index 50b80dc8b..7315bd9a5 100644 --- a/Source/Modules/java.cxx +++ b/Source/Modules/java.cxx @@ -1762,6 +1762,8 @@ public: Delete(attributes); Delete(destruct); + String *javaclazzname = Swig_name_member(getNSpace(), proxy_class_name, ""); // mangled full proxy class name + // Emit extra user code Printv(proxy_class_def, typemapLookup(n, "javacode", typemap_lookup_type, WARN_NONE), // extra Java code "\n", NIL); @@ -1776,29 +1778,29 @@ public: Replaceall(proxy_class_def, "$imclassname", full_imclass_name); Replaceall(proxy_class_code, "$imclassname", full_imclass_name); + Replaceall(proxy_class_def, "$javaclazzname", javaclazzname); + Replaceall(proxy_class_code, "$javaclazzname", javaclazzname); + // Add code to do C++ casting to base class (only for classes in an inheritance hierarchy) if (derived) { - Printv(imclass_cppcasts_code, " public final static native long SWIG$javaclassnameUpcast(long jarg1);\n", NIL); + String *upcast_method = Swig_name_member(getNSpace(), proxy_class_name, "SWIGUpcast"); + String *jniname = makeValidJniName(upcast_method); + String *wname = Swig_name_wrapper(jniname); - Replaceall(imclass_cppcasts_code, "$javaclassname", full_proxy_class_name); + Printf(imclass_cppcasts_code, " public final static native long %s(long jarg1);\n", upcast_method); Printv(upcasts_code, - "SWIGEXPORT jlong JNICALL Java_$jnipackage$imimclass_SWIG$imclazznameUpcast", - "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n", + "SWIGEXPORT jlong JNICALL ", wname, "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n", " jlong baseptr = 0;\n" - " (void)jenv;\n" " (void)jcls;\n" " *($cbaseclass **)&baseptr = *($cclass **)&jarg1;\n" " return baseptr;\n" "}\n", "\n", NIL); - - String *imimclass = makeValidJniName(imclass_name); - String *imclazzname = makeValidJniName(full_proxy_class_name); - Replaceall(upcasts_code, "$cbaseclass", c_baseclass); - Replaceall(upcasts_code, "$imclazzname", imclazzname); - Replaceall(upcasts_code, "$cclass", c_classname); - Replaceall(upcasts_code, "$jnipackage", jnipackage); - Replaceall(upcasts_code, "$imimclass", imimclass); - - Delete(imclazzname); - Delete(imimclass); + " (void)jenv;\n" " (void)jcls;\n" " *(", c_baseclassname, " **)&baseptr = *(", c_classname, " **)&jarg1;\n" + " return baseptr;\n" + "}\n", "\n", NIL); + + Delete(wname); + Delete(jniname); + Delete(upcast_method); } + Delete(javaclazzname); Delete(baseclass); } |