diff options
author | aoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-11-26 06:31:13 +0000 |
---|---|---|
committer | aoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-11-26 06:31:13 +0000 |
commit | 46a395d1026e314b9bcab796de1a5d425d4a2b3b (patch) | |
tree | 388d0e4a5d91f6f66a30d8c6539033660d785856 /gcc/java/expr.c | |
parent | b92c9ea1d3651598848c5fb3201674577a0cc7d5 (diff) | |
download | gcc-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.c | 48 |
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. */ |