summaryrefslogtreecommitdiff
path: root/gcc/java/expr.c
diff options
context:
space:
mode:
authoraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>2007-11-26 06:31:13 +0000
committeraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>2007-11-26 06:31:13 +0000
commit46a395d1026e314b9bcab796de1a5d425d4a2b3b (patch)
tree388d0e4a5d91f6f66a30d8c6539033660d785856 /gcc/java/expr.c
parentb92c9ea1d3651598848c5fb3201674577a0cc7d5 (diff)
downloadgcc-46a395d1026e314b9bcab796de1a5d425d4a2b3b.tar.gz
* expr.c (build_jni_stub): Use the computed jni func type for
variable meth. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@130428 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/java/expr.c')
-rw-r--r--gcc/java/expr.c48
1 files changed, 27 insertions, 21 deletions
diff --git a/gcc/java/expr.c b/gcc/java/expr.c
index 8311fbcdee8..a482a969235 100644
--- a/gcc/java/expr.c
+++ b/gcc/java/expr.c
@@ -2651,17 +2651,6 @@ build_jni_stub (tree method)
TREE_CHAIN (env_var) = res_var;
}
- meth_var = build_decl (VAR_DECL, get_identifier ("meth"), ptr_type_node);
- TREE_STATIC (meth_var) = 1;
- TREE_PUBLIC (meth_var) = 0;
- DECL_EXTERNAL (meth_var) = 0;
- DECL_CONTEXT (meth_var) = method;
- DECL_ARTIFICIAL (meth_var) = 1;
- DECL_INITIAL (meth_var) = null_pointer_node;
- TREE_USED (meth_var) = 1;
- chainon (env_var, meth_var);
- build_result_decl (method);
-
method_args = DECL_ARGUMENTS (method);
block = build_block (env_var, NULL_TREE, method_args, NULL_TREE);
TREE_SIDE_EFFECTS (block) = 1;
@@ -2725,23 +2714,40 @@ build_jni_stub (tree method)
jni_func_type = build_pointer_type (tem);
- jnifunc = build3 (COND_EXPR, ptr_type_node,
+ /* Use the actual function type, rather than a generic pointer type,
+ such that this decl keeps the actual pointer type from being
+ garbage-collected. If it is, we end up using canonical types
+ with different uids for equivalent function types, and this in
+ turn causes utf8 identifiers and output order to vary. */
+ meth_var = build_decl (VAR_DECL, get_identifier ("meth"), jni_func_type);
+ TREE_STATIC (meth_var) = 1;
+ TREE_PUBLIC (meth_var) = 0;
+ DECL_EXTERNAL (meth_var) = 0;
+ DECL_CONTEXT (meth_var) = method;
+ DECL_ARTIFICIAL (meth_var) = 1;
+ DECL_INITIAL (meth_var) = null_pointer_node;
+ TREE_USED (meth_var) = 1;
+ chainon (env_var, meth_var);
+ build_result_decl (method);
+
+ jnifunc = build3 (COND_EXPR, jni_func_type,
build2 (NE_EXPR, boolean_type_node,
meth_var, build_int_cst (TREE_TYPE (meth_var), 0)),
meth_var,
- build2 (MODIFY_EXPR, ptr_type_node, meth_var,
- build_call_nary (ptr_type_node,
- build_address_of
- (soft_lookupjnimethod_node),
- 4,
- jniarg0, jniarg1,
- jniarg2, jniarg3)));
+ build2 (MODIFY_EXPR, jni_func_type, meth_var,
+ build1
+ (NOP_EXPR, jni_func_type,
+ build_call_nary (ptr_type_node,
+ build_address_of
+ (soft_lookupjnimethod_node),
+ 4,
+ jniarg0, jniarg1,
+ jniarg2, jniarg3))));
/* Now we make the actual JNI call via the resulting function
pointer. */
call = build_call_list (TREE_TYPE (TREE_TYPE (method)),
- build1 (NOP_EXPR, jni_func_type, jnifunc),
- args);
+ jnifunc, args);
/* If the JNI call returned a result, capture it here. If we had to
unwrap JNI object results, we would do that here. */