diff options
author | Bryce McKinlay <mckinlay@redhat.com> | 2004-06-27 15:30:06 +0000 |
---|---|---|
committer | Bryce McKinlay <bryce@gcc.gnu.org> | 2004-06-27 16:30:06 +0100 |
commit | 0f6cd83f96821808017f3b2318da521a9c29ed62 (patch) | |
tree | 011e3f2b332966ef19bafd54bb8b7f8351779679 /gcc/java/jcf-write.c | |
parent | 64b663f8bd8abd190e9f2f2aa47dddf60769b8e3 (diff) | |
download | gcc-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.c | 31 |
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) |