From 2c3199bc4a271157f3cdfb71b3de714004c21ee1 Mon Sep 17 00:00:00 2001 From: Per Bothner Date: Mon, 15 Mar 1999 05:09:44 -0800 Subject: [PATCH] class.c (make_class): Don't set CLASS_P here (because this function is also called by... d * class.c (make_class): Don't set CLASS_P here (because this function is also called by build_java_array_type). (push_class): Set CLASS_P here instead. * parse.h (TYPE_CLASS_P): Check for TYPE_ARRAY_P is redundant. * jcf-dump.c (print_access_flags): Take extra parameter to indicate context. If the context is class, perfer "super" over "synchronized". * jcf-write.c (generate_classfile): Don't add ACC_SUPER if interface. * parse.y (create_class): Don't call parser_check_super here; it is not robust. Always wait until later. * parse.y (method_header): For interfaces, set ACC_ABSTRACT (to match what JDK 1.2 does), but don't set ACC_PUBLIC. From-SVN: r25784 --- gcc/java/jcf-dump.c | 24 ++++++++++++++++-------- gcc/java/parse.c | 13 ++----------- gcc/java/parse.h | 3 +-- gcc/java/parse.y | 13 ++----------- 4 files changed, 21 insertions(+), 32 deletions(-) diff --git a/gcc/java/jcf-dump.c b/gcc/java/jcf-dump.c index b48c0b43c63..eaf07cdc91f 100644 --- a/gcc/java/jcf-dump.c +++ b/gcc/java/jcf-dump.c @@ -77,7 +77,7 @@ int class_access_flags = 0; /* Print in format similar to javap. VERY IMCOMPLETE. */ int flag_javap_compatible = 0; -static int print_access_flags PROTO ((FILE *, uint16)); +static int print_access_flags PROTO ((FILE *, uint16, char)); static void print_constant_terse PROTO ((FILE*, JCF*, int, int)); static void print_constant PROTO ((FILE *, JCF *, int, int)); static void print_constant_ref PROTO ((FILE *, JCF *, int)); @@ -127,7 +127,7 @@ DEFUN(utf8_equal_string, (jcf, index, value), class_access_flags = ACCESS_FLAGS; \ if (flag_print_class_info) \ { fprintf (out, "\nAccess flags: 0x%x", ACCESS_FLAGS); \ - print_access_flags (out, ACCESS_FLAGS); \ + print_access_flags (out, ACCESS_FLAGS, 'c'); \ fputc ('\n', out); \ fprintf (out, "This class: "); \ if (flag_print_constant_pool) \ @@ -163,7 +163,7 @@ DEFUN(utf8_equal_string, (jcf, index, value), if (flag_print_fields) \ { fprintf (out, "Field name:"); \ print_constant_terse (out, jcf, NAME, CONSTANT_Utf8); \ - print_access_flags (out, ACCESS_FLAGS); \ + print_access_flags (out, ACCESS_FLAGS, 'f'); \ fprintf (out, " Signature: "); \ if (flag_print_constant_pool) \ fprintf (out, "%d=", SIGNATURE); \ @@ -194,7 +194,7 @@ DEFUN(utf8_equal_string, (jcf, index, value), if (flag_javap_compatible) \ { \ fprintf (out, " "); \ - print_access_flags (out, ACCESS_FLAGS); \ + print_access_flags (out, ACCESS_FLAGS, 'm'); \ fputc (' ', out); \ print_signature (out, jcf, SIGNATURE, PRINT_SIGNATURE_RESULT_ONLY); \ fputc (' ', out); \ @@ -206,7 +206,7 @@ DEFUN(utf8_equal_string, (jcf, index, value), { \ fprintf (out, "\nMethod name:"); \ print_constant_terse (out, jcf, NAME, CONSTANT_Utf8); \ - print_access_flags (out, ACCESS_FLAGS); \ + print_access_flags (out, ACCESS_FLAGS, 'm'); \ fprintf (out, " Signature: "); \ if (flag_print_constant_pool) \ fprintf (out, "%d=", SIGNATURE); \ @@ -305,16 +305,24 @@ DEFUN(print_constant_ref, (stream, jcf, index), fprintf (stream, ">"); } +/* Print the access flags given by FLAGS. + The CONTEXT is one of 'c' (class flags), 'f' (field flags), + or 'm' (method flags). */ + static int -DEFUN (print_access_flags, (stream, flags), - FILE *stream AND uint16 flags) +DEFUN (print_access_flags, (stream, flags, context), + FILE *stream AND uint16 flags AND char context) { if (flags & ACC_PUBLIC) fprintf (stream, " public"); if (flags & ACC_PRIVATE) fprintf (stream, " private"); if (flags & ACC_PROTECTED) fprintf (stream, " protected"); if (flags & ACC_STATIC) fprintf (stream, " static"); if (flags & ACC_FINAL) fprintf (stream, " final"); - if (flags & ACC_SYNCHRONIZED) fprintf (stream, " synchronized"); + if (flags & ACC_SYNCHRONIZED) + if (context == 'c') + fprintf (stream, " super"); + else + fprintf (stream, " synchronized"); if (flags & ACC_VOLATILE) fprintf (stream, " volatile"); if (flags & ACC_TRANSIENT) fprintf (stream, " transient"); if (flags & ACC_NATIVE) fprintf (stream, " native"); diff --git a/gcc/java/parse.c b/gcc/java/parse.c index 30ecc5f95cf..63e666202ac 100644 --- a/gcc/java/parse.c +++ b/gcc/java/parse.c @@ -5593,17 +5593,8 @@ create_class (flags, id, super, interfaces) return NULL_TREE; } - /* The class is known and exists if there is a decl. Otherwise, - postpone the operation and do it later. */ - super_decl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (super)); - if (super_decl) - { - parser_check_super (super_decl, decl, id); - super_decl_type = TREE_TYPE (super_decl); - } - else - super_decl_type = - register_incomplete_type (JDEP_SUPER, super, decl, NULL_TREE); + super_decl_type = + register_incomplete_type (JDEP_SUPER, super, decl, NULL_TREE); } else if (TREE_TYPE (decl) != object_type_node) super_decl_type = object_type_node; diff --git a/gcc/java/parse.h b/gcc/java/parse.h index c78c5bb6807..f59c4ca4b42 100644 --- a/gcc/java/parse.h +++ b/gcc/java/parse.h @@ -208,8 +208,7 @@ extern tree stabilize_reference PROTO ((tree)); (CLASS_P (TYPE) && CLASS_INTERFACE (TYPE_NAME (TYPE))) #define TYPE_CLASS_P(TYPE) (CLASS_P (TYPE) \ - && !CLASS_INTERFACE (TYPE_NAME (TYPE)) \ - && !TYPE_ARRAY_P (TYPE)) + && !CLASS_INTERFACE (TYPE_NAME (TYPE))) /* Standard error messages */ #define ERROR_CANT_CONVERT_TO_BOOLEAN(OPERATOR, NODE, TYPE) \ diff --git a/gcc/java/parse.y b/gcc/java/parse.y index c4378dae51d..75ffbc3cc61 100644 --- a/gcc/java/parse.y +++ b/gcc/java/parse.y @@ -2991,17 +2991,8 @@ create_class (flags, id, super, interfaces) return NULL_TREE; } - /* The class is known and exists if there is a decl. Otherwise, - postpone the operation and do it later. */ - super_decl = IDENTIFIER_CLASS_VALUE (EXPR_WFL_NODE (super)); - if (super_decl) - { - parser_check_super (super_decl, decl, id); - super_decl_type = TREE_TYPE (super_decl); - } - else - super_decl_type = - register_incomplete_type (JDEP_SUPER, super, decl, NULL_TREE); + super_decl_type = + register_incomplete_type (JDEP_SUPER, super, decl, NULL_TREE); } else if (TREE_TYPE (decl) != object_type_node) super_decl_type = object_type_node; -- 2.30.2