This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [ecj] enum types


We seem to have forgotten to handle enum types in gcj; fixed thusly.

Also, I took the oportunity to move the reflection data into R/O
memory.

Andrew.


2006-11-02  Andrew Haley  <aph@redhat.com>

	* java-tree.h (FIELD_ENUM): New.
	(lang_decl_var.field_enum): New.
	(lang_type.enum_class): New.
	(CLASS_ENUM): New.
	* class.c (set_class_decl_access_flags): Handle enum types.
	(add_field): Handle enum fields.
	(get_access_flags_from_decl): Likewise.

	* class.c (make_class_data): Put reflection_data into rodata.

 /* Return length of inheritance chain of CLAS, where java.lang.Object is 0,
@@ -781,6 +782,7 @@
   TREE_CHAIN (field) = TYPE_FIELDS (class);
   TYPE_FIELDS (class) = field;
   DECL_CONTEXT (field) = class;
+  MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
 
   if (flags & ACC_PUBLIC) FIELD_PUBLIC (field) = 1;
   if (flags & ACC_PROTECTED) FIELD_PROTECTED (field) = 1;
@@ -788,6 +790,7 @@
   if (flags & ACC_FINAL) FIELD_FINAL (field) = 1;
   if (flags & ACC_VOLATILE) FIELD_VOLATILE (field) = 1;
   if (flags & ACC_TRANSIENT) FIELD_TRANSIENT (field) = 1;
+  if (flags & ACC_ENUM) FIELD_ENUM (field) = 1;
   if (is_static)
     {
       FIELD_STATIC (field) = 1;
@@ -1215,6 +1218,8 @@
 	access_flags |= ACC_VOLATILE;
       if (FIELD_TRANSIENT (decl))
 	access_flags |= ACC_TRANSIENT;
+      if (FIELD_ENUM (decl))
+	access_flags |= ACC_ENUM;
       return access_flags;
     }
   if (TREE_CODE (decl) == TYPE_DECL)
@@ -1237,6 +1242,8 @@
 	access_flags |= ACC_PROTECTED;
       if (CLASS_STRICTFP (decl))
 	access_flags |= ACC_STRICT;
+      if (CLASS_ENUM (decl))
+	access_flags |= ACC_ENUM;
       return access_flags;
     }
   if (TREE_CODE (decl) == FUNCTION_DECL)
@@ -2088,7 +2095,7 @@
       DECL_ARTIFICIAL (array) = 1;
       DECL_IGNORED_P (array) = 1;
       TREE_READONLY (array) = 1;
-      TREE_CONSTANT (array) = 1;
+      TREE_CONSTANT (DECL_INITIAL (array)) = 1;
       rest_of_decl_compilation (array, 1, 0);
       
       PUSH_FIELD_VALUE (cons, "reflection_data", build_address_of (array));
Index: java/constants.c
===================================================================
--- java/constants.c	(revision 118395)
+++ java/constants.c	(working copy)
@@ -571,6 +571,7 @@
       TREE_STATIC (tags_decl) = 1;
       DECL_INITIAL (tags_decl) = build_constructor_from_list
 				 (tags_type, tags_list);
+      TREE_CONSTANT (DECL_INITIAL (tags_decl)) = 1;
       rest_of_decl_compilation (tags_decl, 1, 0);
       tags_value = build_address_of (tags_decl);
     }
Index: java/java-tree.h
===================================================================
--- java/java-tree.h	(revision 118395)
+++ java/java-tree.h	(working copy)
@@ -901,6 +901,7 @@
 /* True if NODE is a final field. */
 #define FINAL_VARIABLE_P(NODE) (FIELD_FINAL (NODE) && !FIELD_STATIC (NODE))
 /* True if NODE is a class final field. */
+#define FIELD_ENUM(DECL)	    (DECL_LANG_SPECIFIC (DECL)->u.v.field_enum)
 #define CLASS_FINAL_VARIABLE_P(NODE) \
   (FIELD_FINAL (NODE) && FIELD_STATIC (NODE))
 /* True if NODE is a class initialization flag. This macro accesses
@@ -1052,6 +1053,7 @@
   unsigned int local_slot : 1;	/* Decl is a temporary in the stack frame.  */
   unsigned int class_field : 1; /* Decl needs mangle_class_field.  */
   unsigned int vtable : 1;	/* Decl needs mangle_vtable.  */
+  unsigned int field_enum:1;	/* Field is an enum.  */
 };
 
 /* This is what 'lang_decl' really points to.  */
@@ -1095,6 +1097,7 @@
 #define TYPE_PRIVATE_INNER_CLASS(T) (TYPE_LANG_SPECIFIC (T)->pic)
 #define TYPE_PROTECTED_INNER_CLASS(T) (TYPE_LANG_SPECIFIC (T)->poic)
 #define TYPE_STRICTFP(T) (TYPE_LANG_SPECIFIC (T)->strictfp)
+#define TYPE_ENUM(T) 		(TYPE_LANG_SPECIFIC (T)->enum_class)
 #define TYPE_USES_ASSERTIONS(T) (TYPE_LANG_SPECIFIC (T)->assertions)
 
 #define TYPE_ATABLE_METHODS(T)   (TYPE_LANG_SPECIFIC (T)->atable_methods)
@@ -1182,6 +1185,7 @@
   unsigned strictfp:1;		/* `strictfp' class.  */
   unsigned assertions:1;	/* Any method uses `assert'.  */
   unsigned dummy_class:1;	/* Not a real class, just a placeholder.  */
+  unsigned enum_class:1;	/* Class is an enum type.  */
 };
 
 #define JCF_u4 unsigned long
@@ -1503,6 +1507,7 @@
 #define CLASS_PRIVATE(DECL)	(TYPE_PRIVATE_INNER_CLASS (TREE_TYPE (DECL)))
 #define CLASS_PROTECTED(DECL)	(TYPE_PROTECTED_INNER_CLASS (TREE_TYPE (DECL)))
 #define CLASS_STRICTFP(DECL)	(TYPE_STRICTFP (TREE_TYPE (DECL)))
+#define CLASS_ENUM(DECL)	(TYPE_ENUM (TREE_TYPE (DECL)))
 #define CLASS_USES_ASSERTIONS(DECL) (TYPE_USES_ASSERTIONS (TREE_TYPE (DECL)))
 
 /* @deprecated marker flag on methods, fields and classes */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]