aboutsummaryrefslogtreecommitdiff
path: root/gcc/java/jcf-write.c
diff options
context:
space:
mode:
authorBryce McKinlay <mckinlay@redhat.com>2004-06-27 15:30:06 +0000
committerBryce McKinlay <bryce@gcc.gnu.org>2004-06-27 16:30:06 +0100
commit0f6cd83f96821808017f3b2318da521a9c29ed62 (patch)
tree011e3f2b332966ef19bafd54bb8b7f8351779679 /gcc/java/jcf-write.c
parent64b663f8bd8abd190e9f2f2aa47dddf60769b8e3 (diff)
downloadgcc-0f6cd83f96821808017f3b2318da521a9c29ed62.zip
gcc-0f6cd83f96821808017f3b2318da521a9c29ed62.tar.gz
gcc-0f6cd83f96821808017f3b2318da521a9c29ed62.tar.bz2
re PR java/15715 (member interfaces are always static)
2004-06-26 Bryce McKinlay <mckinlay@redhat.com> PR java/15715. * parse.y (create_interface): Set correct access modifiers for interfaces. * jcf-write.c (get_classfile_modifiers): New function. (generate_classfile): Use get_classfile_modifiers, not get_access_flags. 2004-06-26 Bryce McKinlay <mckinlay@redhat.com> * parse.y (register_incomplete_type): Set JDEP_ENCLOSING for "super" dependency to current parser context, not NULL_TREE, for top-level classes. (jdep_resolve_class): Enable member access check for all inner class dependencies. From-SVN: r83734
Diffstat (limited to 'gcc/java/jcf-write.c')
-rw-r--r--gcc/java/jcf-write.c31
1 files changed, 28 insertions, 3 deletions
diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c
index b04d559..8ead886 100644
--- a/gcc/java/jcf-write.c
+++ b/gcc/java/jcf-write.c
@@ -304,6 +304,7 @@ static void perform_relocations (struct jcf_partial *);
static void init_jcf_state (struct jcf_partial *, struct obstack *);
static void init_jcf_method (struct jcf_partial *, tree);
static void release_jcf_state (struct jcf_partial *);
+static int get_classfile_modifiers (tree class);
static struct chunk * generate_classfile (tree, struct jcf_partial *);
static struct jcf_handler *alloc_handler (struct jcf_block *,
struct jcf_block *,
@@ -2886,6 +2887,32 @@ release_jcf_state (struct jcf_partial *state)
obstack_free (state->chunk_obstack, state->first);
}
+/* Get the access flags (modifiers) of a class (TYPE_DECL) to be used in the
+ access_flags field of the class file header. */
+
+static int get_classfile_modifiers (tree class)
+{
+ /* These are the flags which are valid class file modifiers.
+ See JVMS2 S4.1. */
+ int valid_toplevel_class_flags = ACC_PUBLIC | ACC_FINAL | ACC_SUPER |
+ ACC_INTERFACE | ACC_ABSTRACT;
+ int flags = get_access_flags (class);
+
+ /* ACC_SUPER should always be set, except for interfaces. */
+ if (! (flags & ACC_INTERFACE))
+ flags |= ACC_SUPER;
+
+ /* A protected member class becomes public at the top level. */
+ if (flags & ACC_PROTECTED)
+ flags |= ACC_PUBLIC;
+
+ /* Filter out flags that are not valid for a class or interface in the
+ top-level access_flags field. */
+ flags &= valid_toplevel_class_flags;
+
+ return flags;
+}
+
/* Generate and return a list of chunks containing the class CLAS
in the .class file representation. The list can be written to a
.class file using write_chunks. Allocate chunks from obstack WORK. */
@@ -2921,9 +2948,7 @@ generate_classfile (tree clas, struct jcf_partial *state)
else
i = 8 + 2 * total_supers;
ptr = append_chunk (NULL, i, state);
- i = get_access_flags (TYPE_NAME (clas));
- if (! (i & ACC_INTERFACE))
- i |= ACC_SUPER;
+ i = get_classfile_modifiers (TYPE_NAME (clas));
PUT2 (i); /* access_flags */
i = find_class_constant (&state->cpool, clas); PUT2 (i); /* this_class */
if (clas == object_type_node)