diff options
author | Andrew Haley <aph@redhat.com> | 2006-04-18 15:25:36 +0000 |
---|---|---|
committer | Andrew Haley <aph@redhat.com> | 2006-04-18 15:25:36 +0000 |
commit | 35dc08adea8a8db36e8d8094e6e2411d6200cb5a (patch) | |
tree | 67da60dd487aa87ea6e4e98ba1fc84214e4fa55b | |
parent | e7accbf016bf087b15beaaaead6cacdb27e0096b (diff) |
2006-04-18 Andrew Haley <aph@redhat.com>
* java-expr.c (maybe_rewrite): New.
(build_known_method_ref): Call maybe_rewrite().
(expand_invoke): Pass method, signature, and
args by reference.
* java-tree.h (build_known_method_ref): Pass method, signature, and
args by reference.
* parse.y (patch_invoke): Pass method, signature, and args to
build_known_method_ref() by reference.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcj/gcj-abi-experimental-branch@113045 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/java/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/java/java-expr.c | 42 | ||||
-rw-r--r-- | gcc/java/java-tree.h | 2 | ||||
-rw-r--r-- | gcc/java/parse.y | 4 |
4 files changed, 49 insertions, 10 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index fcecbaadf89..42b28e0ec45 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,5 +1,16 @@ 2006-04-18 Andrew Haley <aph@redhat.com> + * java-expr.c (maybe_rewrite): New. + (build_known_method_ref): Call maybe_rewrite(). + (expand_invoke): Pass method, signature, and + args by reference. + * java-tree.h (build_known_method_ref): Pass method, signature, and + args by reference. + * parse.y (patch_invoke): Pass method, signature, and args to + build_known_method_ref() by reference. + +2006-04-18 Andrew Haley <aph@redhat.com> + * lang.opt (flag_indirect_classes): New. * gjavah.c (process_file): Comment out class$$. * lang.c (java_init): Set flag_indirect_classes. diff --git a/gcc/java/java-expr.c b/gcc/java/java-expr.c index 107d28a6313..f20cd9df190 100644 --- a/gcc/java/java-expr.c +++ b/gcc/java/java-expr.c @@ -1997,12 +1997,40 @@ build_class_init (tree clas, tree expr) return init; } +static void +maybe_rewrite (tree *method_p, tree *arg_list_p, tree *method_signature_p) +{ + tree context = DECL_NAME (TYPE_NAME (DECL_CONTEXT (*method_p))); + if (strcmp ("java.lang.Class", IDENTIFIER_POINTER (context)) == 0) + { + tree name = DECL_NAME (*method_p); + if (strcmp ("getClassLoader", IDENTIFIER_POINTER (name)) == 0) + { + if (strcmp ("()Ljava/lang/ClassLoader;", + IDENTIFIER_POINTER (*method_signature_p)) == 0) + { + *method_p = lookup_java_method (DECL_CONTEXT (*method_p), + name, + get_identifier ("(Ljava/lang/Class;)Ljava/lang/ClassLoader;")); + *arg_list_p = chainon (*arg_list_p, + tree_cons (NULL_TREE, build_class_ref (output_class), NULL_TREE)); + *method_signature_p = get_identifier ("(Ljava/lang/Class;)Ljava/lang/ClassLoader;"); + } + } + } +} + tree -build_known_method_ref (tree method, tree method_type ATTRIBUTE_UNUSED, - tree self_type, tree method_signature ATTRIBUTE_UNUSED, - tree arg_list ATTRIBUTE_UNUSED) +build_known_method_ref (tree *method_p, tree method_type ATTRIBUTE_UNUSED, + tree self_type, tree *method_signature_p ATTRIBUTE_UNUSED, + tree *arg_list_p ATTRIBUTE_UNUSED) { tree func; + tree method; + + maybe_rewrite (method_p, arg_list_p, method_signature_p); + method = *method_p; + if (is_compiled_class (self_type)) { /* With indirect dispatch we have to use indirect calls for all @@ -2373,8 +2401,8 @@ expand_invoke (int opcode, int method_ref_index, int nargs ATTRIBUTE_UNUSED) func = NULL_TREE; if (opcode == OPCODE_invokestatic) - func = build_known_method_ref (method, method_type, self_type, - method_signature, arg_list); + func = build_known_method_ref (&method, method_type, self_type, + &method_signature, &arg_list); else if (opcode == OPCODE_invokespecial || (opcode == OPCODE_invokevirtual && (METHOD_PRIVATE (method) @@ -2393,8 +2421,8 @@ expand_invoke (int opcode, int method_ref_index, int nargs ATTRIBUTE_UNUSED) tree save_arg = save_expr (TREE_VALUE (arg_list)); TREE_VALUE (arg_list) = save_arg; check = java_check_reference (save_arg, ! DECL_INIT_P (method)); - func = build_known_method_ref (method, method_type, self_type, - method_signature, arg_list); + func = build_known_method_ref (&method, method_type, self_type, + &method_signature, &arg_list); } else { diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h index 2fe1ce814e3..fc3b298da3e 100644 --- a/gcc/java/java-tree.h +++ b/gcc/java/java-tree.h @@ -1235,7 +1235,7 @@ extern tree check_for_builtin (tree, tree); extern void initialize_builtins (void); extern tree lookup_name (tree); -extern tree build_known_method_ref (tree, tree, tree, tree, tree); +extern tree build_known_method_ref (tree *, tree, tree, tree *, tree *); extern tree build_class_init (tree, tree); extern int attach_init_test_initialization_flags (void **, void *); extern tree build_invokevirtual (tree, tree); diff --git a/gcc/java/parse.y b/gcc/java/parse.y index 4ba158171b0..deb46835f11 100644 --- a/gcc/java/parse.y +++ b/gcc/java/parse.y @@ -11056,9 +11056,9 @@ patch_invoke (tree patch, tree method, tree args) case INVOKE_STATIC: { tree signature = build_java_signature (TREE_TYPE (method)); - func = build_known_method_ref (method, TREE_TYPE (method), + func = build_known_method_ref (&method, TREE_TYPE (method), DECL_CONTEXT (method), - signature, args); + &signature, &args); } break; |