From 1a78785526bdf2a52982c302a4ff0b6527a1efa7 Mon Sep 17 00:00:00 2001 From: tromey Date: Wed, 15 Mar 2006 18:29:44 +0000 Subject: [PATCH] gcc/java PR java/26390: * class.c (get_interface_method_index): Don't put into interface table. libjava PR java/26390: * link.cc (get_interfaces): Skip . (append_partial_itable): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@112093 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/java/ChangeLog | 6 ++++++ gcc/java/class.c | 11 +++++++---- libjava/ChangeLog | 6 ++++++ libjava/link.cc | 26 +++++++++++++++++--------- 4 files changed, 36 insertions(+), 13 deletions(-) diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 485e362b094..9d9091e683d 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,5 +1,11 @@ 2006-03-15 Tom Tromey + PR java/26390: + * class.c (get_interface_method_index): Don't put into + interface table. + +2006-03-15 Tom Tromey + * parse.y (analyze_clinit_body): Ignore empty statements. 2006-03-08 David Daney diff --git a/gcc/java/class.c b/gcc/java/class.c index 743b9eba79e..6d666e362e6 100644 --- a/gcc/java/class.c +++ b/gcc/java/class.c @@ -1,5 +1,5 @@ /* Functions related to building classes and their related objects. - Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This file is part of GCC. @@ -2303,18 +2303,21 @@ layout_class_methods (tree this_class) TYPE_NVIRTUALS (this_class) = dtable_count; } -/* Return the index of METHOD in INTERFACE. This index begins at 1 and is used as an - argument for _Jv_LookupInterfaceMethodIdx(). */ +/* Return the index of METHOD in INTERFACE. This index begins at 1 + and is used as an argument for _Jv_LookupInterfaceMethodIdx(). */ int get_interface_method_index (tree method, tree interface) { tree meth; int i = 1; - for (meth = TYPE_METHODS (interface); ; meth = TREE_CHAIN (meth), i++) + for (meth = TYPE_METHODS (interface); ; meth = TREE_CHAIN (meth)) { if (meth == method) return i; + /* We don't want to put into the interface table. */ + if (! ID_CLINIT_P (DECL_NAME (meth))) + ++i; gcc_assert (meth != NULL_TREE); } } diff --git a/libjava/ChangeLog b/libjava/ChangeLog index d08bf1612c8..ff256f6ea2f 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,9 @@ +2006-03-15 Tom Tromey + + PR java/26390: + * link.cc (get_interfaces): Skip . + (append_partial_itable): Likewise. + 2006-03-10 Tom Tromey PR libgcj/25713: diff --git a/libjava/link.cc b/libjava/link.cc index df148a38e64..827d3185059 100644 --- a/libjava/link.cc +++ b/libjava/link.cc @@ -699,9 +699,18 @@ _Jv_Linker::get_interfaces (jclass klass, _Jv_ifaces *ifaces) result += get_interfaces (klass->interfaces[i], ifaces); } } - + if (klass->isInterface()) - result += klass->method_count + 1; + { + // We want to add 1 plus the number of interface methods here. + // But, we take special care to skip . + ++result; + for (int i = 0; i < klass->method_count; ++i) + { + if (klass->methods[i].name->first() != '<') + ++result; + } + } else if (klass->superclass) result += get_interfaces (klass->superclass, ifaces); return result; @@ -817,7 +826,7 @@ _Jv_ThrowAbstractMethodError () // Returns the offset at which the next partial ITable should be appended. jshort _Jv_Linker::append_partial_itable (jclass klass, jclass iface, - void **itable, jshort pos) + void **itable, jshort pos) { using namespace java::lang::reflect; @@ -826,6 +835,10 @@ _Jv_Linker::append_partial_itable (jclass klass, jclass iface, for (int j=0; j < iface->method_count; j++) { + // Skip '' here. + if (iface->methods[j].name->first() == '<') + continue; + meth = NULL; for (jclass cl = klass; cl; cl = cl->getSuperclass()) { @@ -836,12 +849,7 @@ _Jv_Linker::append_partial_itable (jclass klass, jclass iface, break; } - if (meth && (meth->name->first() == '<')) - { - // leave a placeholder in the itable for hidden init methods. - itable[pos] = NULL; - } - else if (meth) + if (meth) { if ((meth->accflags & Modifier::STATIC) != 0) throw new java::lang::IncompatibleClassChangeError -- 2.11.0