diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 5fa89f02587d..3ed758f29207 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -116,6 +116,30 @@ from the c++ compiler. * Makefile.in: Rebuilt. +2001-01-07 Alexandre Petit-Bianco + + All files with updated copyright. + * prims.cc (class _Jv_PrimClass): Removed. + (init_prim_class): New function. + (DECLARE_PRIM_TYPE): Rewritten. `java::lang::Class' replaces + `_Jv_PrimClass' in primitive type declarations. Assign to the + value returned by `init_prim_class.' + * gcj/array.h: `java::lang::Class' replaces `_Jv_PrimClass' in + primitive type declarations. + (JvPrimClass): Cast to `jclass' removed. + * java/lang/Class.h (Class): New constructor. + (Class): New copy constructor. + (initializePrim): New prototype. + (_Jv_PrimClass): Field removed. + * java/lang/Object.h (struct _JvObjectPrefix): New virtuals + nacd_1 and nacd_2 (for compatibility with the new C++ ABI.) + (class java::lang::Object): `finalize' moved up front. + * java/lang/natClass.cc + (isAssignableFrom): Turned outline. + (isInstance): Likewise. + (isInterface): Likewise, fixed indentation. + (initializePrim): New function. + 2001-01-07 Anthony Green * Makefile.am (texinfo): Add texinfo target for generating texinfo diff --git a/libjava/gcj/array.h b/libjava/gcj/array.h index 8d280857ffe5..db58ddfbdf87 100644 --- a/libjava/gcj/array.h +++ b/libjava/gcj/array.h @@ -1,6 +1,6 @@ // array.h - Header file for CNI arrays. -*- c++ -*- -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation +/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. @@ -60,10 +60,10 @@ typedef JArray *jfloatArray; typedef JArray *jdoubleArray; typedef JArray *jstringArray; -extern class _Jv_PrimClass _Jv_byteClass, _Jv_shortClass, _Jv_intClass, +extern java::lang::Class _Jv_byteClass, _Jv_shortClass, _Jv_intClass, _Jv_longClass, _Jv_booleanClass, _Jv_charClass, _Jv_floatClass, _Jv_doubleClass, _Jv_voidClass; -#define JvPrimClass(TYPE) ((jclass) & _Jv_##TYPE##Class) +#define JvPrimClass(TYPE) (& _Jv_##TYPE##Class) extern "C" jobjectArray _Jv_NewObjectArray(jsize length, jclass, jobject init); extern "C" jobject _Jv_NewPrimArray (jclass eltype, jint count); diff --git a/libjava/java/lang/Class.h b/libjava/java/lang/Class.h index 12e3ed5838fb..9793a5698dd2 100644 --- a/libjava/java/lang/Class.h +++ b/libjava/java/lang/Class.h @@ -1,6 +1,6 @@ // Class.h - Header file for java.lang.Class. -*- c++ -*- -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation +/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. @@ -14,6 +14,7 @@ details. */ #pragma interface +#include #include #include #include @@ -191,6 +192,53 @@ public: // finalization void finalize (); + // For the initialization of primitive types: some constructors as + // required by prims.cc:init_prim_class(), and the prototype of + // method to perform a lightweight initialization of a Class object. + Class (void) {} + Class (const Class& x) : Object () { + + // C++ ctors are fixing the vtbl in a way that doesn't fit Java. + // We can fix the C++ compiler, or we can hack our runtime. What's + // below fix the vtable so that it starts at -2. + void *p = ((void **)this)[0]; + ((void **)this)[0] = (void *)((char *)p-2*sizeof (void *)); + + _Jv_VTable *avtable = x.vtable; + + // We must initialize every field of the class. We do this in + // the same order they are declared in Class.h. + next = NULL; + name = x.name; + accflags = x.accflags; + superclass = NULL; + constants.size = 0; + constants.tags = NULL; + constants.data = NULL; + methods = NULL; + method_count = x.method_count; + vtable_method_count = 0; + fields = NULL; + size_in_bytes = x.size_in_bytes; + field_count = 0; + static_field_count = 0; + vtable = JV_PRIMITIVE_VTABLE; + interfaces = NULL; + loader = NULL; + interface_count = 0; + state = JV_STATE_DONE; + thread = NULL; + depth = -1; + ancestors = NULL; + idt = NULL; + + if (method_count != 'V') + _Jv_NewArrayClass (this, NULL, avtable); + else + arrayclass = NULL; + } + void initializePrim (jobject cname, jbyte sig, jint len, jobject avtable); + static java::lang::Class class$; private: @@ -237,8 +285,6 @@ private: friend jint JvNumMethods (jclass); friend jmethodID JvGetFirstMethod (jclass); - friend class _Jv_PrimClass; - // Friends classes and functions to implement the ClassLoader friend class java::lang::ClassLoader; diff --git a/libjava/java/lang/Object.h b/libjava/java/lang/Object.h index 21e8fb0918f0..81b5a66dfb62 100644 --- a/libjava/java/lang/Object.h +++ b/libjava/java/lang/Object.h @@ -1,6 +1,6 @@ // Object.h - Header file for java.lang.Object. -*- c++ -*- -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation +/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. @@ -15,23 +15,22 @@ details. */ #include -// This class is mainly here as a kludge to get G++ to allocate -// vtable pointer as the *first* word of each Object, instead of -// the second word (following sync_info). Note that various pieces of -// code know that finalize() is the first method. For instance, -// Object.java knows this, as does _Jv_AllocObject. +// This class is mainly here as a kludge to get G++ to allocate two +// extra entries in the vtable. We will use them to store data. This +// allows us to support the new C++ ABI. struct _JvObjectPrefix { protected: - // This is disguised as the C++ vtbl. - // _Jv_VTable* vtable; - - virtual void finalize () = 0; + // New ABI Compatibility Dummy, #1 and 2. + virtual void nacd_1 (void) {}; + virtual void nacd_2 (void) {}; }; class java::lang::Object : public _JvObjectPrefix { +protected: + virtual void finalize (void); public: // Order must match order in Object.java. jclass getClass (void); @@ -61,7 +60,6 @@ public: protected: virtual jobject clone (void); - virtual void finalize (void); private: // This does not actually refer to a Java object. Instead it is a diff --git a/libjava/java/lang/natClass.cc b/libjava/java/lang/natClass.cc index 3a02b46a8af9..0e5479154b49 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 Free Software Foundation +/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. @@ -615,7 +615,7 @@ java::lang::Class::getMethods (void) return result; } -inline jboolean +jboolean java::lang::Class::isAssignableFrom (jclass klass) { // Arguments may not have been initialized, given ".class" syntax. @@ -624,7 +624,7 @@ java::lang::Class::isAssignableFrom (jclass klass) return _Jv_IsAssignableFrom (this, klass); } -inline jboolean +jboolean java::lang::Class::isInstance (jobject obj) { if (__builtin_expect (! obj || isPrimitive (), false)) @@ -633,7 +633,7 @@ java::lang::Class::isInstance (jobject obj) return _Jv_IsAssignableFrom (this, JV_CLASS (obj)); } -inline jboolean +jboolean java::lang::Class::isInterface (void) { return (accflags & java::lang::reflect::Modifier::INTERFACE) != 0; @@ -1235,7 +1235,7 @@ _Jv_AppendPartialITable (jclass klass, jclass iface, void **itable, for (jclass cl = klass; cl; cl = cl->getSuperclass()) { meth = _Jv_GetMethodLocal (cl, iface->methods[j].name, - iface->methods[j].signature); + iface->methods[j].signature); if (meth) break; @@ -1409,3 +1409,19 @@ java::lang::Class::getPrivateMethod (jstring name, JArray *param_types) JvThrow (new java::lang::NoSuchMethodException); } +// Perform a lightweight initialization of a Class object, for the +// purpose of creating the Class object of primitive types. + +void +java::lang::Class::initializePrim (jobject cname, jbyte sig, jint len, jobject avtable) +{ + using namespace java::lang::reflect; + + name = _Jv_makeUtf8Const ((char *) cname, -1); + accflags = Modifier::PUBLIC | Modifier::FINAL | Modifier::ABSTRACT; + method_count = sig; + size_in_bytes = len; + // We temporarily store `avtable' in the `vtable' field, so that the + // copy constructor can correctly invoke _Jv_FindArrayClass. + vtable = (_Jv_VTable *) avtable; +} diff --git a/libjava/prims.cc b/libjava/prims.cc index c4c7316dfcea..415c82ce61df 100644 --- a/libjava/prims.cc +++ b/libjava/prims.cc @@ -1,6 +1,6 @@ // prims.cc - Code for core of runtime environment. -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation +/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. @@ -510,57 +510,21 @@ _Jv_NewMultiArray (jclass array_type, jint dimensions, ...) -class _Jv_PrimClass : public java::lang::Class +// Initialize Class object for primitive types. The `return' statement +// does the actuall job. +static java::lang::Class +init_prim_class (jobject cname, jbyte sig, jint len, jobject array_vtable) { -public: - // FIXME: calling convention is weird. If we use the natural types - // then the compiler will complain because they aren't Java types. - _Jv_PrimClass (jobject cname, jbyte sig, jint len, jobject array_vtable) - { - using namespace java::lang::reflect; - - // We must initialize every field of the class. We do this in - // the same order they are declared in Class.h. - next = NULL; - name = _Jv_makeUtf8Const ((char *) cname, -1); - accflags = Modifier::PUBLIC | Modifier::FINAL | Modifier::ABSTRACT; - superclass = NULL; - constants.size = 0; - constants.tags = NULL; - constants.data = NULL; - methods = NULL; - method_count = sig; - vtable_method_count = 0; - fields = NULL; - size_in_bytes = len; - field_count = 0; - static_field_count = 0; - vtable = JV_PRIMITIVE_VTABLE; - interfaces = NULL; - loader = NULL; - interface_count = 0; - state = JV_STATE_DONE; - thread = NULL; - depth = -1; - ancestors = NULL; - idt = NULL; - - // Note that we have to set `methods' to NULL. - if (sig != 'V') - _Jv_NewArrayClass (this, NULL, (_Jv_VTable *) array_vtable); - else - arrayclass = NULL; - } -}; - -// We use this to define both primitive classes and the vtables for -// arrays of primitive classes. The latter are given names so that we -// can refer to them from the compiler, allowing us to construct -// arrays of primitives statically. -#define DECLARE_PRIM_TYPE(NAME, SIG, LEN) \ - _Jv_ArrayVTable _Jv_##NAME##VTable; \ - _Jv_PrimClass _Jv_##NAME##Class((jobject) #NAME, (jbyte) SIG, (jint) LEN, \ - (jobject) &_Jv_##NAME##VTable) + static java::lang::Class iclass; + iclass.initializePrim (cname, sig, len, array_vtable); + return iclass; +} + +#define DECLARE_PRIM_TYPE(NAME, SIG, LEN) \ + _Jv_ArrayVTable _Jv_##NAME##VTable; \ + java::lang::Class _Jv_##NAME##Class = \ + init_prim_class ((jobject) #NAME, (jbyte) SIG, \ + (jint) LEN, (jobject) &_Jv_##NAME##VTable); DECLARE_PRIM_TYPE(byte, 'B', 1); DECLARE_PRIM_TYPE(short, 'S', 2);