diff options
Diffstat (limited to 'libjava')
-rw-r--r-- | libjava/ChangeLog | 10 | ||||
-rw-r--r-- | libjava/include/jvm.h | 2 | ||||
-rw-r--r-- | libjava/jni.cc | 13 | ||||
-rw-r--r-- | libjava/testsuite/libjava.jni/pr18278.c | 10 | ||||
-rw-r--r-- | libjava/testsuite/libjava.jni/pr18278.java | 13 | ||||
-rw-r--r-- | libjava/testsuite/libjava.jni/pr18278.out | 2 |
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 |