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]

Patch: FYI: better error message


I'm checking this in.

This adds a better error message when throwing an AbstractMethodError,
and fixes _Jv_GetMethodString to be slightly more efficient.  This
improved message makes it a lot easier to find out exactly why an
AbstractMethodError is thrown, without having to enter the debugger.

Tom

Index: ChangeLog
from  Tom Tromey  <tromey@redhat.com>

	* java/lang/Class.h (_Jv_GetMethodString): Updated declaration.
	* java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA): Updated.
	* java/lang/natClass.cc (_Jv_LookupInterfaceMethod): Updated.
	* link.cc (_Jv_GetMethodString): Added 'derived' argument.
	Changed type of second argument.  Rewrote.
	(make_vtable): Use it.
	(append_partial_itable): Updated.
	(layout_vtable_methods): Updated.

Index: link.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/link.cc,v
retrieving revision 1.7
diff -u -r1.7 link.cc
--- link.cc 2 Feb 2005 22:29:31 -0000 1.7
+++ link.cc 17 Feb 2005 19:12:39 -0000
@@ -665,12 +665,21 @@
 
 // Format method name for use in error messages.
 jstring
-_Jv_GetMethodString (jclass klass, _Jv_Utf8Const *name)
+_Jv_GetMethodString (jclass klass, _Jv_Method *meth,
+		     jclass derived)
 {
-  jstring r = klass->name->toString();
-  r = r->concat (JvNewStringUTF ("."));
-  r = r->concat (name->toString());
-  return r;
+  using namespace java::lang;
+  StringBuffer *buf = new StringBuffer (klass->name->toString());
+  buf->append (jchar ('.'));
+  buf->append (meth->name->toString());
+  buf->append ((jchar) ' ');
+  buf->append (meth->signature->toString());
+  if (derived)
+    {
+      buf->append(JvNewStringLatin1(" in "));
+      buf->append(derived->name->toString());
+    }
+  return buf->toString();
 }
 
 void 
@@ -720,13 +729,13 @@
         {
 	  if ((meth->accflags & Modifier::STATIC) != 0)
 	    throw new java::lang::IncompatibleClassChangeError
-	      (_Jv_GetMethodString (klass, meth->name));
+	      (_Jv_GetMethodString (klass, meth));
 	  if ((meth->accflags & Modifier::ABSTRACT) != 0)
 	    throw new java::lang::AbstractMethodError
-	      (_Jv_GetMethodString (klass, meth->name));
+	      (_Jv_GetMethodString (klass, meth));
 	  if ((meth->accflags & Modifier::PUBLIC) == 0)
 	    throw new java::lang::IllegalAccessError
-	      (_Jv_GetMethodString (klass, meth->name));
+	      (_Jv_GetMethodString (klass, meth));
 
 	  itable[pos] = meth->ncode;
 	}
@@ -1161,9 +1170,9 @@
 		  using namespace java::lang;
 		  StringBuffer *sb = new StringBuffer();
 		  sb->append(JvNewStringLatin1("method "));
-		  sb->append(_Jv_GetMethodString(klass, meth->name));
+		  sb->append(_Jv_GetMethodString(klass, meth));
 		  sb->append(JvNewStringLatin1(" overrides final method "));
-		  sb->append(_Jv_GetMethodString(declarer, super_meth->name));
+		  sb->append(_Jv_GetMethodString(declarer, super_meth));
 		  throw new VerifyError(sb->toString());
 		}
 	    }
@@ -1245,18 +1254,15 @@
 	if (vtable->get_method(i) == (void *) &_Jv_abstractMethodError)
 	  {
 	    using namespace java::lang;
+	    jclass orig = klass;
 	    while (klass != NULL)
 	      {
 		for (int j = 0; j < klass->method_count; ++j)
 		  {
 		    if (klass->methods[j].index == i)
-		      {
-			StringBuffer *buf = new StringBuffer ();
-			buf->append (_Jv_NewStringUtf8Const (klass->methods[j].name));
-			buf->append ((jchar) ' ');
-			buf->append (_Jv_NewStringUtf8Const (klass->methods[j].signature));
-			throw new AbstractMethodError (buf->toString ());
-		      }
+		      throw new AbstractMethodError(_Jv_GetMethodString(klass,
+									&klass->methods[j],
+									orig));
 		  }
 		klass = klass->getSuperclass ();
 	      }
Index: java/lang/Class.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/Class.h,v
retrieving revision 1.77
diff -u -r1.77 Class.h
--- java/lang/Class.h 7 Feb 2005 21:29:04 -0000 1.77
+++ java/lang/Class.h 17 Feb 2005 19:12:39 -0000
@@ -228,7 +228,7 @@
 
 // Friend functions and classes in prims.cc
 void _Jv_InitPrimClass (jclass, char *, char, int);
-jstring _Jv_GetMethodString (jclass, _Jv_Utf8Const *);
+jstring _Jv_GetMethodString (jclass, _Jv_Method *, jclass = NULL);
 
 jboolean _Jv_CheckAccess (jclass self_klass, jclass other_klass,
 			  jint flags);
@@ -454,7 +454,7 @@
   // in prims.cc
   friend void ::_Jv_InitPrimClass (jclass, char *, char, int);
 
-  friend jstring (::_Jv_GetMethodString) (jclass, _Jv_Utf8Const *);
+  friend jstring (::_Jv_GetMethodString) (jclass, _Jv_Method *, jclass);
 
   friend jboolean (::_Jv_CheckAccess) (jclass self_klass, jclass other_klass,
 				   jint flags);
Index: java/lang/natClass.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/natClass.cc,v
retrieving revision 1.83
diff -u -r1.83 natClass.cc
--- java/lang/natClass.cc 25 Nov 2004 03:47:04 -0000 1.83
+++ java/lang/natClass.cc 17 Feb 2005 19:12:40 -0000
@@ -1,6 +1,6 @@
 // natClass.cc - Implementation of java.lang.Class native methods.
 
-/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004  
+/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005  
    Free Software Foundation
 
    This file is part of libgcj.
@@ -973,13 +973,13 @@
 
       if (Modifier::isStatic(meth->accflags))
 	throw new java::lang::IncompatibleClassChangeError
-	  (_Jv_GetMethodString (klass, meth->name));
+	  (_Jv_GetMethodString (klass, meth));
       if (Modifier::isAbstract(meth->accflags))
 	throw new java::lang::AbstractMethodError
-	  (_Jv_GetMethodString (klass, meth->name));
+	  (_Jv_GetMethodString (klass, meth));
       if (! Modifier::isPublic(meth->accflags))
 	throw new java::lang::IllegalAccessError
-	  (_Jv_GetMethodString (klass, meth->name));
+	  (_Jv_GetMethodString (klass, meth));
 
       _Jv_AddMethodToCache (klass, meth);
 
Index: java/lang/reflect/natMethod.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/reflect/natMethod.cc,v
retrieving revision 1.43
diff -u -r1.43 natMethod.cc
--- java/lang/reflect/natMethod.cc 17 Dec 2004 15:13:44 -0000 1.43
+++ java/lang/reflect/natMethod.cc 17 Feb 2005 19:12:40 -0000
@@ -1,6 +1,6 @@
 // natMethod.cc - Native code for Method class.
 
-/* Copyright (C) 1998, 1999, 2000, 2001 , 2002, 2003, 2004 Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001 , 2002, 2003, 2004, 2005 Free Software Foundation
 
    This file is part of libgcj.
 
@@ -496,7 +496,7 @@
 		  || concrete_meth->ncode == NULL
 		  || Modifier::isAbstract(concrete_meth->accflags))
 		throw new java::lang::IncompatibleClassChangeError
-		  (_Jv_GetMethodString (vtable->clas, meth->name));
+		  (_Jv_GetMethodString (vtable->clas, meth));
 	      ncode = concrete_meth->ncode;
 	    }
 	  else


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