This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[gcjx] Patch: FYI: fix method call


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;
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]