summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam S Fulton <wsf@fultondesigns.co.uk>2010-03-09 21:15:34 +0000
committerWilliam S Fulton <wsf@fultondesigns.co.uk>2010-03-09 21:15:34 +0000
commit96f98795116fbf5b176ea5f299f15d0e469c23f4 (patch)
treec7613de081880cf281e08b5c60176c517f7b0920
parentdeafe98dc4d4fc1b0683f950cfffeb2ea519f45b (diff)
downloadswig-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.html1
-rw-r--r--Doc/Manual/Java.html8
-rw-r--r--Examples/test-suite/csharp/nspace_runme.cs6
-rw-r--r--Examples/test-suite/java/nspace_runme.java6
-rw-r--r--Examples/test-suite/nspace.i12
-rw-r--r--Lib/csharp/csharp.swg2
-rw-r--r--Lib/java/java.swg2
-rw-r--r--Source/Modules/csharp.cxx22
-rw-r--r--Source/Modules/java.cxx34
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 -&gt; imclassinterfaces
$javaclassname -&gt; $csclassname
$&amp;javaclassname -&gt; $&amp;csclassname
$*javaclassname -&gt; $*csclassname
+$javaclazzname -&gt; $csclazzname
$javainput -&gt; $csinput
$jnicall -&gt; $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);
}