aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/java/ChangeLog9
-rw-r--r--gcc/java/decl.c6
-rw-r--r--gcc/java/expr.c13
-rw-r--r--gcc/java/java-tree.h3
4 files changed, 29 insertions, 2 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 60a0aef..a830972 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,12 @@
+2005-11-28 Tom Tromey <tromey@redhat.com>
+
+ PR java/18278:
+ * expr.c (build_jni_stub): Unwrap the return value.
+ * java-tree.h (soft_unwrapjni_node): New define.
+ (enum java_tree_index): Added JTI_SOFT_UNWRAPJNI_NODE.
+ * decl.c (java_init_decl_processing): Initialize
+ soft_unwrapjni_node.
+
2005-11-24 Bryce McKinlay <mckinlay@redhat.com>
* gcj.texi (gij options): Add -Xss documentation.
diff --git a/gcc/java/decl.c b/gcc/java/decl.c
index de8f9ad..21488ff 100644
--- a/gcc/java/decl.c
+++ b/gcc/java/decl.c
@@ -1169,6 +1169,12 @@ java_init_decl_processing (void)
build_function_type (void_type_node, t),
0, NOT_BUILT_IN, NULL, NULL_TREE);
+ t = tree_cons (NULL_TREE, object_ptr_type_node, endlink);
+ soft_unwrapjni_node
+ = builtin_function ("_Jv_UnwrapJNIweakReference",
+ build_function_type (object_ptr_type_node, t),
+ 0, NOT_BUILT_IN, NULL, NULL_TREE);
+
t = tree_cons (NULL_TREE, int_type_node,
tree_cons (NULL_TREE, int_type_node, endlink));
soft_idiv_node
diff --git a/gcc/java/expr.c b/gcc/java/expr.c
index a21e151..4c2f3f4 100644
--- a/gcc/java/expr.c
+++ b/gcc/java/expr.c
@@ -2558,8 +2558,17 @@ build_jni_stub (tree method)
/* If the JNI call returned a result, capture it here. If we had to
unwrap JNI object results, we would do that here. */
if (res_var != NULL_TREE)
- call = build2 (MODIFY_EXPR, TREE_TYPE (TREE_TYPE (method)),
- res_var, call);
+ {
+ /* If the call returns an object, it may return a JNI weak
+ reference, in which case we must unwrap it. */
+ if (! JPRIMITIVE_TYPE_P (TREE_TYPE (TREE_TYPE (method))))
+ call = build3 (CALL_EXPR, TREE_TYPE (TREE_TYPE (method)),
+ build_address_of (soft_unwrapjni_node),
+ build_tree_list (NULL_TREE, call),
+ NULL_TREE);
+ call = build2 (MODIFY_EXPR, TREE_TYPE (TREE_TYPE (method)),
+ res_var, call);
+ }
TREE_SIDE_EFFECTS (call) = 1;
CAN_COMPLETE_NORMALLY (call) = 1;
diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h
index 658da38..d337131 100644
--- a/gcc/java/java-tree.h
+++ b/gcc/java/java-tree.h
@@ -394,6 +394,7 @@ enum java_tree_index
JTI_SOFT_LOOKUPJNIMETHOD_NODE,
JTI_SOFT_GETJNIENVNEWFRAME_NODE,
JTI_SOFT_JNIPOPSYSTEMFRAME_NODE,
+ JTI_SOFT_UNWRAPJNI_NODE,
JTI_SOFT_FMOD_NODE,
JTI_SOFT_IDIV_NODE,
JTI_SOFT_IREM_NODE,
@@ -663,6 +664,8 @@ extern GTY(()) tree java_global_trees[JTI_MAX];
java_global_trees[JTI_SOFT_GETJNIENVNEWFRAME_NODE]
#define soft_jnipopsystemframe_node \
java_global_trees[JTI_SOFT_JNIPOPSYSTEMFRAME_NODE]
+#define soft_unwrapjni_node \
+ java_global_trees[JTI_SOFT_UNWRAPJNI_NODE]
#define soft_fmod_node \
java_global_trees[JTI_SOFT_FMOD_NODE]
#define soft_idiv_node \