This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[gcjx] Patch: FYI: fix method call
- From: Tom Tromey <tromey at redhat dot com>
- To: Java Patch List <java-patches at gcc dot gnu dot org>
- Date: 07 Mar 2005 18:13:45 -0700
- Subject: [gcjx] Patch: FYI: fix method call
- Reply-to: tromey at redhat dot com
I'm checking this in on the gcjx branch.
This fixes method calls via the vtable. We didn't cast the result
properly. Also this fixes builtins.cc to use build_function_type and
build_method_type_directly; I didn't know these existed.
Tom
Index: ChangeLog
from Tom Tromey <tromey@redhat.com>
* builtins.cc (add): Use build_function_type and
build_method_type_directly. Use correct 'self' type for methods.
* abi.cc (build_method_call): Cast vtable lookup to correct type.
Index: abi.cc
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/Attic/abi.cc,v
retrieving revision 1.1.2.8
diff -u -r1.1.2.8 abi.cc
--- abi.cc 8 Mar 2005 00:34:35 -0000 1.1.2.8
+++ abi.cc 8 Mar 2005 01:15:36 -0000
@@ -103,10 +103,11 @@
func = build2 (PLUS_EXPR, type_nativecode_ptr_ptr, dtable,
convert (type_nativecode_ptr_ptr, index));
- if (TARGET_VTABLE_USES_DESCRIPTORS)
- func = build1 (NOP_EXPR, type_nativecode_ptr, func);
- else
+ if (! TARGET_VTABLE_USES_DESCRIPTORS)
func = build1 (INDIRECT_REF, type_nativecode_ptr, func);
+ // Cast back to the correct type, not just 'void *'.
+ func = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (meth_tree)),
+ func);
}
// METH_TREE is a method decl, so we need one TREE_TYPE to get the
Index: builtins.cc
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/Attic/builtins.cc,v
retrieving revision 1.1.2.13
diff -u -r1.1.2.13 builtins.cc
--- builtins.cc 8 Mar 2005 00:53:04 -0000 1.1.2.13
+++ builtins.cc 8 Mar 2005 01:15:36 -0000
@@ -81,24 +81,23 @@
void
tree_builtins::add (tree context, model_method *meth)
{
- // Create a function or method type.
- tree mtype = make_node (meth->static_p () ? FUNCTION_TYPE : METHOD_TYPE);
- if (! meth->static_p ())
- TYPE_METHOD_BASETYPE (mtype) = map_type (meth->get_declaring_class ());
- TREE_TYPE (mtype) = map_type (meth->get_return_type ());
-
// Convert argument types.
std::list<ref_variable_decl> args = meth->get_parameters ();
tree argt = NULL_TREE;
- if (! meth->static_p ())
- argt = tree_cons (NULL_TREE, TYPE_METHOD_BASETYPE (mtype), argt);
for (std::list<ref_variable_decl>::const_iterator i = args.begin ();
i != args.end ();
++i)
argt = tree_cons (NULL_TREE, map_type ((*i)->type ()), argt);
- TYPE_ARG_TYPES (mtype) = chainon (nreverse (argt), void_list_node);
+ argt = chainon (nreverse (argt), void_list_node);
- layout_type (mtype);
+ // Create a function or method type.
+ tree ret_type = map_type (meth->get_return_type ());
+ tree mtype;
+ tree klass_ptr = map_type (meth->get_declaring_class ());
+ if (meth->static_p ())
+ mtype = build_function_type (ret_type, argt);
+ else
+ mtype = build_method_type_directly (TREE_TYPE (klass_ptr), ret_type, argt);
// Now create the function decl.
tree result = build_decl (FUNCTION_DECL,
@@ -115,7 +114,7 @@
if (! meth->static_p ())
{
tree this_decl = build_decl (PARM_DECL, get_identifier ("this"),
- TYPE_METHOD_BASETYPE (mtype));
+ klass_ptr);
DECL_CONTEXT (this_decl) = result;
TREE_CHAIN (this_decl) = formals;
formals = this_decl;
Index: lower.cc
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/Attic/lower.cc,v
retrieving revision 1.1.2.5
diff -u -r1.1.2.5 lower.cc
--- lower.cc 8 Mar 2005 00:22:45 -0000 1.1.2.5
+++ lower.cc 8 Mar 2005 01:15:37 -0000
@@ -1100,8 +1100,7 @@
ret);
tsi_link_after (&statements, push (ret_label),
TSI_CONTINUE_LINKING);
- insn = build1 (GOTO_EXPR, void_type_node,
- dest);
+ insn = build1 (GOTO_EXPR, void_type_node, dest);
}
break;
@@ -1110,23 +1109,18 @@
int here = pc - 1;
tree dest = find_label (here + get2s (bytes, pc));
tree ret = find_label (pc);
- tree ret_label = build1 (ADDR_EXPR,
- type_nativecode_ptr,
- ret);
+ tree ret_label = build1 (ADDR_EXPR, type_nativecode_ptr, ret);
tsi_link_after (&statements, push (ret_label),
TSI_CONTINUE_LINKING);
- insn = build1 (GOTO_EXPR, void_type_node,
- dest);
+ insn = build1 (GOTO_EXPR, void_type_node, dest);
}
break;
case op_ret:
{
jint index = get1u (bytes, pc);
- tree where = load (index,
- type_nativecode_ptr);
- insn = build1 (GOTO_EXPR, void_type_node,
- where);
+ tree where = load (index, type_nativecode_ptr);
+ insn = build1 (GOTO_EXPR, void_type_node, where);
}
break;