diff options
author | bryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-04-21 19:26:22 +0000 |
---|---|---|
committer | bryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-04-21 19:26:22 +0000 |
commit | c3d74f41c6dee1db5eb78637116b272dffd1f38d (patch) | |
tree | 99703a9508cd86ea402bd95d8a86b8bdbe3cbe2a /libjava/java | |
parent | 345da44ba84c5c6cc7dc8bd66a08958c95e0699d (diff) | |
download | ppe42-gcc-c3d74f41c6dee1db5eb78637116b272dffd1f38d.tar.gz ppe42-gcc-c3d74f41c6dee1db5eb78637116b272dffd1f38d.zip |
2004-04-21 Bryce McKinlay <mckinlay@redhat.com>
* java/lang/natClass.cc (_Jv_LayoutInterfaceMethods): New method.
Set method->index values for interface methods to their itable
index.
(initializeClass): Call _Jv_LayoutInterfaceMethods.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@80978 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/java')
-rw-r--r-- | libjava/java/lang/Class.h | 1 | ||||
-rw-r--r-- | libjava/java/lang/natClass.cc | 17 |
2 files changed, 18 insertions, 0 deletions
diff --git a/libjava/java/lang/Class.h b/libjava/java/lang/Class.h index 86dc6a079db..e93920c06b5 100644 --- a/libjava/java/lang/Class.h +++ b/libjava/java/lang/Class.h @@ -339,6 +339,7 @@ private: friend jshort _Jv_AppendPartialITable (jclass, jclass, void **, jshort); friend jshort _Jv_FindIIndex (jclass *, jshort *, jshort); friend void _Jv_LinkSymbolTable (jclass); + friend void _Jv_LayoutInterfaceMethods (jclass); friend void _Jv_LayoutVTableMethods (jclass klass); friend void _Jv_SetVTableEntries (jclass, _Jv_VTable *, jboolean *); friend void _Jv_MakeVTable (jclass); diff --git a/libjava/java/lang/natClass.cc b/libjava/java/lang/natClass.cc index 419ed7d9d29..3ceda11238f 100644 --- a/libjava/java/lang/natClass.cc +++ b/libjava/java/lang/natClass.cc @@ -790,6 +790,9 @@ java::lang::Class::initializeClass (void) } } + if (isInterface ()) + _Jv_LayoutInterfaceMethods (this); + _Jv_PrepareConstantTimeTables (this); if (vtable == NULL) @@ -1787,6 +1790,20 @@ _Jv_abstractMethodError (void) throw new java::lang::AbstractMethodError(); } +// Set itable method indexes for members of interface IFACE. +void +_Jv_LayoutInterfaceMethods (jclass iface) +{ + if (! iface->isInterface()) + return; + + // itable indexes start at 1. + // FIXME: Static initalizers currently get a NULL placeholder entry in the + // itable so they are also assigned an index here. + for (int i = 0; i < iface->method_count; i++) + iface->methods[i].index = i + 1; +} + // Prepare virtual method declarations in KLASS, and any superclasses as // required, by determining their vtable index, setting method->index, and // finally setting the class's vtable_method_count. Must be called with the |