aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Haley <aph@redhat.com>2006-04-18 15:25:36 +0000
committerAndrew Haley <aph@redhat.com>2006-04-18 15:25:36 +0000
commit35dc08adea8a8db36e8d8094e6e2411d6200cb5a (patch)
tree67da60dd487aa87ea6e4e98ba1fc84214e4fa55b
parente7accbf016bf087b15beaaaead6cacdb27e0096b (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/ChangeLog11
-rw-r--r--gcc/java/java-expr.c42
-rw-r--r--gcc/java/java-tree.h2
-rw-r--r--gcc/java/parse.y4
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;