[gcjx] Patch: FYI: write out class object

Tom Tromey tromey@redhat.com
Sun Feb 13 04:05:00 GMT 2005


I'm checking this in on the gcjx branch.

This changes the tree code generator to (try to :-) create a
representation of the Class object.  More patches in this vein to
follow.

Tom

# 
# patch "gcc/gcc/java/ChangeLog"
#  from [75208a208572e30bec162c925d3928c8d108c266]
#    to [11adee3ebe14e5679540cf49f610af3b7cfa2411]
# 
# patch "gcc/gcc/java/classobj.cc"
#  from [a8e3e1ffd8585509c45d34f57312b67a5dd5ecaa]
#    to [be3a1b80dd209963741abfa39ab49293ed7e3c97]
# 
# patch "gcc/gcc/java/classobj.hh"
#  from [4218584b63c257583a0dcfc82d378ebd1e5a4866]
#    to [a193f433c6ff4a84f649b0da7a50ab81adc15094]
# 
# patch "gcc/gcc/java/treegen.cc"
#  from [b4113fa40fa42c72e3a22052cdcdab02cf173eae]
#    to [48d7f5e8cb97ae8b96df3e4edb95a080237b4e6d]
# 
--- gcc/gcc/java/ChangeLog
+++ gcc/gcc/java/ChangeLog
@@ -1,5 +1,14 @@
 2005-02-09  Tom Tromey  <tromey@redhat.com>
 
+	* classobj.cc (record_creator): Initialize new fields.
+	(set_field): Updated.
+	(create_class_instance): Initialize fields of Object.
+	* treegen.cc (generate): Create a class_instance_creator.
+	* classobj.hh (class_object_creator): Added 'record' argument.
+	Uncommented body.
+	(record_creator::field_class): New field.
+	(record_creator::the_class): Likewise.
+
 	* tree.cc (visit_array_ref): Lay out array class.
 
 2005-02-09  Tom Tromey  <tromey@redhat.com>
--- gcc/gcc/java/classobj.cc
+++ gcc/gcc/java/classobj.cc
@@ -22,9 +22,18 @@
 #include "java/glue.hh"
 
 record_creator::record_creator (tree record_type)
+  : the_class (record_type)
 {
   constructor = build_constructor (record_type, NULL_TREE);
-  field_iterator = TYPE_FIELDS (record_type);
+
+  field_class = the_class;
+  field_iterator = TYPE_FIELDS (field_class);
+
+  while (DECL_NAME (field_iterator) == NULL_TREE)
+    {
+      field_class = TREE_TYPE (field_iterator);
+      field_iterator = TYPE_FIELDS (field_class);
+    }
 }
 
 record_creator::~record_creator ()
@@ -40,6 +49,25 @@
   CONSTRUCTOR_ELTS (constructor) = tree_cons (field_iterator, value,
 					      CONSTRUCTOR_ELTS (constructor));
   field_iterator = TREE_CHAIN (field_iterator);
+  if (field_iterator == NULL_TREE
+      && field_class != the_class)
+    {
+      // Now search downward from the most derived class to the parent
+      // of the base class over which we just iterated.
+      tree search = the_class;
+      while (search != NULL_TREE)
+	{
+	  tree parent = TREE_TYPE (TYPE_FIELDS (search));
+	  if (parent == field_class)
+	    break;
+	  search = parent;
+	}
+      assert (search != NULL_TREE);
+      assert (search != field_class);
+      field_class = search;
+      // Make sure to skip over the super-class field.
+      field_iterator = TREE_CHAIN (TYPE_FIELDS (field_class));
+    }
 }
 
 tree
@@ -216,6 +244,12 @@
   gcj_abi *abi = builtins->find_abi (real_class);
   record_creator inst (type_class);
 
+  // First the fields from Object.
+  inst.set_field ("vtable", null_pointer_node);	// FIXME
+  if (! flag_hash_synchronization)
+    inst.set_field ("sync_info", null_pointer_node);
+
+  // Now fields from Class.
   inst.set_field ("next", null_pointer_node);
   inst.set_field ("name",
 		  builtins->map_utf8const (real_class->get_fully_qualified_name ()));
--- gcc/gcc/java/classobj.hh
+++ gcc/gcc/java/classobj.hh
@@ -31,6 +31,12 @@
   // Iterator over fields of class type.
   tree field_iterator;
 
+  // The most-derived class over which we're iterating.
+  tree the_class;
+  // The class containing the fields over which we are currently
+  // iterating.
+  tree field_class;
+
 public:
 
   record_creator (tree record_type);
@@ -68,12 +74,11 @@
 
 public:
 
-  class_object_creator (tree_builtins *b, aot_class *k)
+  class_object_creator (tree_builtins *b, aot_class *k, tree record)
     : builtins (b),
       klass (k)
   {
-    abort ();
-    // create_class_instance (FIXME);
+    create_class_instance (record);
   }
 
   /// Return the class object we created.
--- gcc/gcc/java/treegen.cc
+++ gcc/gcc/java/treegen.cc
@@ -88,5 +88,7 @@
       cgraph_varpool_finalize_decl (field);
     }
 
-  // FIXME: write out the class object now.
+  class_object_creator creator (builtins, wrapper, TREE_TYPE (class_tree));
+  tree class_obj = creator.get_class ();
+  // FIXME: do something with the class now.
 }



More information about the Java-patches mailing list