From b32d6f93f89dbfd30e0190fa6201839ad0d1d172 Mon Sep 17 00:00:00 2001
From: Tom Tromey <tromey@redhat.com>
Date: Thu, 16 Mar 2006 00:08:12 +0000
Subject: [PATCH] jcf-write.c (generate_bytecode_insns): Use qualifying type
 for non-static method calls.

gcc/java
	* jcf-write.c (generate_bytecode_insns): Use qualifying type for
	non-static method calls.
libjava
	* testsuite/libjava.jacks/jacks.xfail: Removed
	13.1-runtime-method-5.

From-SVN: r112102
---
 gcc/java/ChangeLog                          |  5 ++++
 gcc/java/jcf-write.c                        | 28 ++++++++++++++-------
 libjava/ChangeLog                           |  5 ++++
 libjava/testsuite/libjava.jacks/jacks.xfail |  1 -
 4 files changed, 29 insertions(+), 10 deletions(-)

diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 9e40d60d9408..5f840751fb42 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,8 @@
+2006-03-15  Tom Tromey  <tromey@redhat.com>
+
+	* jcf-write.c (generate_bytecode_insns): Use qualifying type for
+	non-static method calls.
+
 2006-03-15  David Daney  <ddaney@avtrex.com>
 
 	* java-tree.h : Moved comment for TYPE_DOT_CLASS adjacent to its
diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c
index 534336190918..aa4d33b141f8 100644
--- a/gcc/java/jcf-write.c
+++ b/gcc/java/jcf-write.c
@@ -1,5 +1,5 @@
 /* Write out a Java(TM) class file.
-   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -2610,26 +2610,36 @@ generate_bytecode_insns (tree exp, int target, struct jcf_partial *state)
 	    tree context = DECL_CONTEXT (f);
 	    int index, interface = 0;
 	    RESERVE (5);
+
+	    /* If the method is not static, use the qualifying type.
+	       However, don't use the qualifying type if the method
+	       was declared in Object.  */
+	    if (! METHOD_STATIC (f)
+		&& ! DECL_CONSTRUCTOR_P (f)
+		&& ! METHOD_PRIVATE (f)
+		&& DECL_CONTEXT (f) != object_type_node)
+	      {
+		tree arg1 = TREE_VALUE (TREE_OPERAND (exp, 1));
+		context = TREE_TYPE (TREE_TYPE (arg1));
+	      }
+
 	    if (METHOD_STATIC (f))
 	      OP1 (OPCODE_invokestatic);
 	    else if (DECL_CONSTRUCTOR_P (f) || CALL_USING_SUPER (exp)
-		|| METHOD_PRIVATE (f))
+		     || METHOD_PRIVATE (f))
 	      OP1 (OPCODE_invokespecial);
 	    else
 	      {
 		if (CLASS_INTERFACE (TYPE_NAME (context)))
-		  {
-		    tree arg1 = TREE_VALUE (TREE_OPERAND (exp, 1));
-		    context = TREE_TYPE (TREE_TYPE (arg1));
-		    if (CLASS_INTERFACE (TYPE_NAME (context)))
-		      interface = 1;
-		  }
+		  interface = 1;
 		if (interface)
 		  OP1 (OPCODE_invokeinterface);
 		else
 		  OP1 (OPCODE_invokevirtual);
 	      }
-	    index = find_methodref_with_class_index (&state->cpool, f, context);
+
+	    index = find_methodref_with_class_index (&state->cpool, f,
+						     context);
 	    OP2 (index);
 	    if (interface)
 	      {
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index cbcb506ba920..f3ff2d68a792 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,8 @@
+2006-03-15  Tom Tromey  <tromey@redhat.com>
+
+	* testsuite/libjava.jacks/jacks.xfail: Removed
+	13.1-runtime-method-5.
+
 2006-03-15  Tom Tromey  <tromey@redhat.com>
 
 	PR java/26638:
diff --git a/libjava/testsuite/libjava.jacks/jacks.xfail b/libjava/testsuite/libjava.jacks/jacks.xfail
index 0ecb62b28b33..081e8ac233a1 100644
--- a/libjava/testsuite/libjava.jacks/jacks.xfail
+++ b/libjava/testsuite/libjava.jacks/jacks.xfail
@@ -5,7 +5,6 @@
 13.1-runtime-constant-1
 13.1-runtime-constant-3
 13.1-runtime-field-1
-13.1-runtime-method-5
 13.1-runtime-method-6
 13.4.8-constant-runtime-1
 13.4.8-constant-runtime-2
-- 
GitLab