aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog10
-rw-r--r--libjava/include/jvm.h2
-rw-r--r--libjava/jni.cc13
-rw-r--r--libjava/testsuite/libjava.jni/pr18278.c10
-rw-r--r--libjava/testsuite/libjava.jni/pr18278.java13
-rw-r--r--libjava/testsuite/libjava.jni/pr18278.out2
6 files changed, 50 insertions, 0 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index d303755..2d88d05 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,13 @@
+2005-11-28 Tom Tromey <tromey@redhat.com>
+
+ PR java/18278:
+ * testsuite/libjava.jni/pr18278.out: New file.
+ * testsuite/libjava.jni/pr18278.c: New file.
+ * testsuite/libjava.jni/pr18278.java: New file.
+ * include/jvm.h (_Jv_UnwrapJNIweakReference): Declare.
+ * jni.cc (_Jv_UnwrapJNIweakReference): New function.
+ (call): Unwrap return value if needed.
+
2005-11-25 Mark Wielaard <mark@klomp.org>
* standard.omit.in: Remove javax/rmi, org/omg, gnu/CORBA and
diff --git a/libjava/include/jvm.h b/libjava/include/jvm.h
index fc104d6..8d34059 100644
--- a/libjava/include/jvm.h
+++ b/libjava/include/jvm.h
@@ -459,6 +459,8 @@ extern "C" void _Jv_RegisterClasses_Counted (const jclass *classes,
extern "C" void _Jv_RegisterResource (void *vptr);
extern void _Jv_UnregisterClass (_Jv_Utf8Const*, java::lang::ClassLoader*);
+extern "C" jobject _Jv_UnwrapJNIweakReference (jobject);
+
extern jclass _Jv_FindClass (_Jv_Utf8Const *name,
java::lang::ClassLoader *loader);
extern jclass _Jv_FindClassFromSignature (char *,
diff --git a/libjava/jni.cc b/libjava/jni.cc
index 13bb12c..fd82706 100644
--- a/libjava/jni.cc
+++ b/libjava/jni.cc
@@ -226,6 +226,12 @@ unwrap (T *obj)
return reinterpret_cast<T *> (wr->get ());
}
+jobject
+_Jv_UnwrapJNIweakReference (jobject obj)
+{
+ return unwrap (obj);
+}
+
static jobject JNICALL
@@ -2304,6 +2310,13 @@ _Jv_JNIMethod::call (ffi_cif *, void *ret, ffi_raw *args, void *__this)
ret, real_args);
#endif
+ // We might need to unwrap a JNI weak reference here.
+ if (_this->jni_cif.rtype == &ffi_type_pointer)
+ {
+ _Jv_value *val = (_Jv_value *) ret;
+ val->object_value = unwrap (val->object_value);
+ }
+
if (sync != NULL)
_Jv_MonitorExit (sync);
diff --git a/libjava/testsuite/libjava.jni/pr18278.c b/libjava/testsuite/libjava.jni/pr18278.c
new file mode 100644
index 0000000..7ca73a4
--- /dev/null
+++ b/libjava/testsuite/libjava.jni/pr18278.c
@@ -0,0 +1,10 @@
+#include <jni.h>
+#include <stdio.h>
+
+#include "pr18278.h"
+
+jobject Java_pr18278_weakRef(JNIEnv *env, jclass cls, jobject data)
+{
+ jobject r = (* env)->NewWeakGlobalRef(env, data);
+ return r;
+}
diff --git a/libjava/testsuite/libjava.jni/pr18278.java b/libjava/testsuite/libjava.jni/pr18278.java
new file mode 100644
index 0000000..8a39dde
--- /dev/null
+++ b/libjava/testsuite/libjava.jni/pr18278.java
@@ -0,0 +1,13 @@
+public class pr18278 {
+ public pr18278() {}
+
+ public static void main(String[] args) {
+ System.loadLibrary("pr18278");
+ String bob = "Bob";
+ Object o = weakRef("Bob");
+ System.out.println(o);
+ System.out.println(bob == o);
+ }
+
+ static native Object weakRef(Object o);
+}
diff --git a/libjava/testsuite/libjava.jni/pr18278.out b/libjava/testsuite/libjava.jni/pr18278.out
new file mode 100644
index 0000000..e01142a
--- /dev/null
+++ b/libjava/testsuite/libjava.jni/pr18278.out
@@ -0,0 +1,2 @@
+Bob
+true