From 2a2c6e55e790704eb0e4013276aee8a91cec46c5 Mon Sep 17 00:00:00 2001 From: Tom Tromey <tromey@redhat.com> Date: Thu, 17 Feb 2005 19:17:08 +0000 Subject: [PATCH] Class.h (_Jv_GetMethodString): Updated declaration. * 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. From-SVN: r95181 --- libjava/ChangeLog | 11 +++++++ libjava/java/lang/Class.h | 4 +-- libjava/java/lang/natClass.cc | 8 +++--- libjava/java/lang/reflect/natMethod.cc | 4 +-- libjava/link.cc | 40 +++++++++++++++----------- 5 files changed, 42 insertions(+), 25 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index a271fd1ae8ab..49a0b6e4f29b 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,14 @@ +2005-02-17 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. + 2005-02-17 Michael Koch <konqueror@gmx.de> * gnu/java/net/PlainSocketImpl.java diff --git a/libjava/java/lang/Class.h b/libjava/java/lang/Class.h index 34ff5df634d0..d7b21e76b05b 100644 --- a/libjava/java/lang/Class.h +++ b/libjava/java/lang/Class.h @@ -228,7 +228,7 @@ void _Jv_InitNewClassFields (jclass klass); // 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 @@ private: // 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); diff --git a/libjava/java/lang/natClass.cc b/libjava/java/lang/natClass.cc index 0e9c26c7b4fa..f29f66747649 100644 --- a/libjava/java/lang/natClass.cc +++ b/libjava/java/lang/natClass.cc @@ -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 @@ _Jv_LookupInterfaceMethod (jclass klass, _Jv_Utf8Const *name, 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); diff --git a/libjava/java/lang/reflect/natMethod.cc b/libjava/java/lang/reflect/natMethod.cc index b4b3a7a9b069..27c26e19ac74 100644 --- a/libjava/java/lang/reflect/natMethod.cc +++ b/libjava/java/lang/reflect/natMethod.cc @@ -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 @@ _Jv_CallAnyMethodA (jobject obj, || 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 diff --git a/libjava/link.cc b/libjava/link.cc index 3f45ac119a2f..8dd809b86878 100644 --- a/libjava/link.cc +++ b/libjava/link.cc @@ -665,12 +665,21 @@ _Jv_Linker::generate_itable (jclass klass, _Jv_ifaces *ifaces, // 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 @@ _Jv_Linker::append_partial_itable (jclass klass, jclass iface, { 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 @@ _Jv_Linker::layout_vtable_methods (jclass klass) 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 @@ _Jv_Linker::make_vtable (jclass klass) 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 (); }