[PATCH] New C++ ABI compatibility changes.

Alexandre Petit-Bianco apbianco@cygnus.com
Mon Jan 15 14:15:00 GMT 2001


Tom Tromey writes:

> Or, failing that, I also think we could just remove the `static' from
> the iclass definition.

Is this what you had in mind? Can I check this in? 

./A

2001-01-15  Alexandre Petit-Bianco  <apbianco@cygnus.com>

	* prims.cc (init_prim_class): Deleted.
	(DECLARE_PRIM_TYPE): Rewritten.
	* java/lang/Class.h (stdio.h): Bogus include removed.
	(java/lang/reflect/Modifier.h): Added.
	(Class): Contructor now takes arguments, initializes fields.
	(initializePrim): Prototype deleted.
	* java/lang/natClass.cc: (initializePrim): Deleted.

Index: prims.cc
===================================================================
RCS file: /cvs/gcc/egcs/libjava/prims.cc,v
retrieving revision 1.45
diff -u -p -r1.45 prims.cc
--- prims.cc	2001/01/15 08:11:40	1.45
+++ prims.cc	2001/01/15 22:02:43
@@ -510,21 +510,11 @@ _Jv_NewMultiArray (jclass array_type, ji
 
 
 
-// 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)
-{
-  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);
+  java::lang::Class _Jv_##NAME##Class ((jobject) #NAME,			\
+				       (jbyte) SIG, (jint) LEN,		\
+				       (jobject) &_Jv_##NAME##VTable);
 
 DECLARE_PRIM_TYPE(byte, 'B', 1);
 DECLARE_PRIM_TYPE(short, 'S', 2);
Index: java/lang/Class.h
===================================================================
RCS file: /cvs/gcc/egcs/libjava/java/lang/Class.h,v
retrieving revision 1.29
diff -u -p -r1.29 Class.h
--- Class.h	2001/01/15 08:11:40	1.29
+++ Class.h	2001/01/15 22:02:48
@@ -14,10 +14,10 @@ details.  */
 
 #pragma interface
 
-#include <stdio.h>
 #include <java/lang/Object.h>
 #include <java/lang/String.h>
 #include <java/net/URL.h>
+#include <java/lang/reflect/Modifier.h>
 
 // We declare these here to avoid including gcj/cni.h.
 extern "C" void _Jv_InitClass (jclass klass);
@@ -192,52 +192,32 @@ 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 () {
+  // This constructor is used to create Class object for the primitive
+  // types.
+  Class (jobject cname, jbyte sig, jint len, jobject array_vtable) {
     
+    using namespace java::lang::reflect;
+    _Jv_Utf8Const *_Jv_makeUtf8Const (char *s, int len);
+
     // 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;
+    // We must initialize every field of the class.  We do this in the
+    // same order they are declared in Class.h, except for fields that
+    // are initialized to NULL.
+    name = _Jv_makeUtf8Const ((char *) cname, -1);
+    accflags = Modifier::PUBLIC | Modifier::FINAL | Modifier::ABSTRACT;
+    method_count = sig;
+    size_in_bytes = len;
     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;
+      _Jv_NewArrayClass (this, NULL, (_Jv_VTable *) array_vtable);
   }
-  void initializePrim (jobject cname, jbyte sig, jint len, jobject avtable);
 
   static java::lang::Class class$;
 
Index: java/lang/natClass.cc
===================================================================
RCS file: /cvs/gcc/egcs/libjava/java/lang/natClass.cc,v
retrieving revision 1.33
diff -u -p -r1.33 natClass.cc
--- natClass.cc	2001/01/15 08:11:40	1.33
+++ natClass.cc	2001/01/15 22:02:52
@@ -1408,20 +1408,3 @@ java::lang::Class::getPrivateMethod (jst
     }
   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;
-}


More information about the Java-patches mailing list