diff options
Diffstat (limited to 'gcc/java')
-rw-r--r-- | gcc/java/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/java/decl.c | 6 | ||||
-rw-r--r-- | gcc/java/expr.c | 13 | ||||
-rw-r--r-- | gcc/java/java-tree.h | 3 |
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 \ |