ModuleClass
Jonathan Gibbons
Jonathan.Gibbons at Sun.COM
Tue Mar 3 11:54:16 PST 2009
NOOOOOOOOOOOOOO.
Please stop gratuitous changing of the spec like this!
I guess I distrust a spec that includes the words "For now".
-- Jon
On Mar 3, 2009, at 11:47 AM, Alex Buckley wrote:
> Being able to put flags in the main class attribute would probably
> be worthwhile if multiple main class attributes were allowed: "Main
> class M is flagged as an FX 1.1 app", "Main class N is flagged as a
> bundle activator and can be assumed to implement interface...".
>
> However, I think for now one ModuleClass attribute is enough,
> pointing to a CONSTANT_Class_info, and without flags.
>
> The ModuleClass attribute is defined as follows:
>
> ModuleClass_attribute {
> u2 attribute_name_index;
> u4 attribute_length;
> u2 main_class;
> }
>
> attribute_name_index
> The value of the attribute_name_index item must be a valid index
> into the constant_pool table. The constant_pool entry at that index
> must be a CONSTANT_Utf8_info structure representing the string
> "ModuleClass".
>
> attribute_length
> The value of the attribute_length item is the length of the
> attribute excluding the initial six bytes.
>
> main_class
> The value of the main_class item must be a valid index into the
> constant_pool table. The constant_pool entry at that index must be a
> CONSTANT_Class_info structure representing the name of the class
> which the host system should treat as the entrypoint to the module.
>
> Attached is an updated (+ tiny corrections) classfile spec.
>
> Alex
>
> Jonathan Gibbons wrote:
>> Alex suggested adding it when I asked him for a spec of the
>> ModuleClass
>> attribute. At the time, the thought was to be able to mark the
>> type of class,
>> main class, applet etc. A more topical example, from a separate
>> email
>> thread going on now, would be to be able to mark a JavaFX class.
>> [Kumar is working on changes to the launcher to make it capable of
>> starting FX programs, given an FX main class.] So the ability to give
>> simple attributes regarding the class appears somewhat reasonable.
>> I guess the updated classfile spec got pre-empted by FOSDEM ;-)
>> -- Jon
>> On Mar 3, 2009, at 9:21 AM, Mark Reinhold wrote:
>>>> Date: Tue, 03 Mar 2009 07:54:39 -0800
>>>> From: jonathan.gibbons at sun.com
>>>
>>>> Point noted about the incorrect use of CONSTANT_Utf8 instead of
>>>> CONSTANT_Class. I'll check that out.
>>>
>>> Okay, thanks.
>>>
>>>> Also, if I recall correctly,
>>>> that item is followed by an array of Utf8 strings representing an
>>>> open
>>>> ended set of flags/modifiers, similar to that used for the requires
>>>> entry. If nothing else, you might need to skip over them if there
>>>> is
>>>> any info to follow.
>>>
>>> Hmm, didn't know that, and neither does the ModuleInfoReader code.
>>>
>>> I don't recall having discussed the need for modifiers in the main-
>>> class
>>> declaration. Do we have use cases?
>>>
>>> - Mark
> ClassFile changes in v51.0 for Modules
>
> Access flags
>
> Module-private accessibility is expressed with a new access_flags
> flag, ACC_MODULE, value 0x8000, description: "Declared module; may
> not be accessed from outside its module. May only be set if the
> ClassFile has a Module attribute." The flag appears in JVMS 4.1
> (ClassFile.access_flags), 4.5 (field_info.access_flags), and 4.6
> (method_info.access_flags), which gain the following rules:
> 4.1
> At most one of the ACC_MODULE and ACC_PUBLIC flags may be set (JLS3
> §6.6.1).
> 4.5
> Fields of classes may set any of the flags in Table 4.4. However, a
> specific field of a class may have at most one of its ACC_PRIVATE,
> ACC_PROTECTED, ACC_MODULE, and ACC_PUBLIC flags set (JLS3 §8.3.1)
> and must not have both its ACC_FINAL and ACC_VOLATILE flags set
> (JLS3 §8.3.1.4).
> All fields of interfaces must have their ACC_STATIC and ACC_FINAL
> and either ACC_PUBLIC or ACC_MODULE flags set; they may have their
> ACC_SYNTHETIC flag set and must not have any of the other flags in
> Table 4.4 set (JLS3 §9.3).
> 4.6
> Methods of classes may set any of the flags in Table 4.5. However, a
> specific method of a class may have at most one of its ACC_PRIVATE,
> ACC_PROTECTED, ACC_MODULE, and ACC_PUBLIC flags set (JLS3 §8.4.3).
> All interface methods must have their ACC_ABSTRACT and either
> ACC_PUBLIC or ACC_MODULE flags set; they may have their ACC_VARARGS,
> ACC_BRIDGE and ACC_SYNTHETIC flags set and must not have any of the
> other flags in Table 4.5 set (JLS3 §9.4).
> A specific instance initialization method (§3.9) may have at most
> one of its ACC_PRIVATE, ACC_PROTECTED, ACC_MODULE, and ACC_PUBLIC
> flags set, and may also have its ACC_STRICT, ACC_VARARGS and
> ACC_SYNTHETIC flags set, but must not have any of the other flags in
> Table 4.5 set.
> In the InnerClasses attribute's inner_class_access_flags table,
> ACC_MODULE means "Marked module in source. May only be set if the
> ClassFile has a Module attribute."
> The ACC_PUBLIC flag in all access_flags is now defined as "Declared
> public; may be accessed from outside its package or module."
>
> 4.8.21 The Module attribute
>
> The Module attribute is a fixed-length attribute in the attributes
> table of a ClassFile (JVMS 4.1) structure. The Module attribute
> records the named module (JLS 7.4.5) to which the class belongs. A
> ClassFile structure without a Module attribute is considered to be a
> member of the unnamed module (JLS 7.4.6).
> There can be no more than one Module attribute in the attributes
> table of a given ClassFile structure. A Module attribute may only
> appear in a ClassFile structure that represents a class whose binary
> name in internal form (as given by the constant pool entry
> referenced by the name_index item of the CONSTANT_Class_info
> structure referenced by ClassFile.this_class) is qualified, i.e.
> contains at least one /.
>
> The Module attribute has the following format:
>
> Module_attribute {
> u2 attribute_name_index;
> u4 attribute_length;
> u2 module_id_index;
> }
> The items of the Module_attribute structure are as follows:
> attribute_name_index
> The value of the attribute_name_index item must be a valid index
> into the constant_pool table. The constant_pool entry at that index
> must be a CONSTANT_Utf8_info structure representing the string
> "Module".
> attribute_length
> The value of the attribute_length item must be 2.
> module_id_index
> The value of the module_id_index item must be a valid index into the
> constant_pool table. The constant_pool entry at that index must be a
> CONSTANT_ModuleId_info structure representing the name and version
> of the named module of which this ClassFile is a member. The module
> name must be encoded in internal form (4.2.1). If the version_index
> item of the CONSTANT_ModuleId_info structure is 0, then this
> ClassFile is a member of any version of the module named by the
> name_index item.
> The CONSTANT_ModuleId_info structure has the following format:
> CONSTANT_ModuleId_info {
> u1 tag;
> // 13
> u2 name_index;
> // Points to a CONSTANT_Utf8_info representing module name
> u2 version_index;
> // Points to a CONSTANT_Utf8_info representing module version
> }
> The module-info.class file
>
> A module compilation unit (module-info.java) is compiled to a
> ClassFile structure like any other compilation unit. It follows the
> precedent set by compiling a package compilation unit (package-
> info.java) which has been possible since Java 5.0. Since neither
> compilation unit describes a class as such, the following
> conventions are adopted for their ClassFile structures.
> package-info.class
>
> major_version, minor_version: >=49.0
> this_class: [Package name in internal form (4.2.1)]/package-info
> access_flags: v49: ACC_INTERFACE ACC_ABSTRACT >=v50: ACC_INTERFACE
> ACC_ABSTRACT ACC_SYNTHETIC
> super_class, interfaces_count, fields_count, methods_count: 0
> attributes: except for Module, SourceFile, RuntimeVisibleAnnotations
> and RuntimeInvisibleAnnotations, none of the pre-defined attributes
> in JVMS 4.7 may appear.
> module-info.class
>
> major_version, minor_version: >=51.0
> this_class: [Module name in internal form (4.2.1)]/module-info
> access_flags: ACC_INTERFACE ACC_ABSTRACT ACC_SYNTHETIC
> attributes: One Module attribute must be present, for the module
> name given in the this_class item.
> super_class, interfaces_count, fields_count, methods_count: 0
> attributes: One Module attribute must be present, for the module
> name given in the this_class item. At most one of each of the
> ModuleRequires, ModulePermits, ModuleProvides, and ModuleClass
> attributes must be present if the module has metadata. Except for
> these attributes and SourceFile, RuntimeVisibleAnnotations, and
> RuntimeInvisibleAnnotations, none of the pre-defined attributes in
> JVMS 4.7 may appear.
> A module name may be referenced by at most one entry in the
> requires_table of a ModuleRequires attribute and at most one entry
> in the permits_table of a ModulePermits attribute and at most one
> entry in the provides_table of a ModuleProvides attribute of a
> ClassFile.
> Attributes for the module-info.class file
>
> The ModuleRequires attribute is defined as follows:
> ModuleRequires_attribute {
> u2 attribute_name_index;
> u4 attribute_length;
> u2 requires_length;
> { u2 requires_index; u1 flags; } requires_table[requires_length];
> }
> attribute_name_index
> The value of the attribute_name_index item must be a valid index
> into the constant_pool table. The constant_pool entry at that index
> must be a CONSTANT_Utf8_info structure representing the string
> "ModuleRequires".
> attribute_length
> The value of the attribute_length item is the length of the
> attribute excluding the initial six bytes.
> requires_length
> The value of the requires_length indicates the number of entries in
> the requires_table.
> requires_table
> Each requires_index must be a valid index into the constant_pool
> table. The constant_pool entry at that index must be a
> CONSTANT_ModuleId_info structure representing the target module on
> which this module depends.
> flags: 0x01 if this dependency on the target module is optional
> flags: 0x02 if the target module's types must be loaded by the
> same defining classloader as the
> types of the module represented by this ClassFile
> flags: 0x04 if the target module's public types are NOT observable to
> types of the module represented by this ClassFile
> The ModulePermits attribute is defined as follows:
> ModulePermits_attribute {
> u2 attribute_name_index;
> u4 attribute_length;
> u2 permits_length;
> { u2 permits_index } permits_table[permits_length];
> }
> attribute_name_index
> The value of the attribute_name_index item must be a valid index
> into the constant_pool table. The constant_pool entry at that index
> must be a CONSTANT_Utf8_info structure representing the string
> "ModulePermits".
> attribute_length
> The value of the attribute_length item is the length of the
> attribute excluding the initial six bytes.
> permits_length
> The value of the permits_length indicates the number of entries in
> the permits_table.
> permits_table
> The value of each permits_index in this item must be a valid index
> into the constant_pool table. The constant_pool entry at that index
> must be a CONSTANT_Utf8_info structure representing the name of a
> module which is permitted by the host system to have a dependency on
> the module represented by this ClassFile.
> The ModuleProvides attribute is defined as follows:
> ModuleProvides_attribute {
> u2 attribute_name_index;
> u4 attribute_length;
> u2 provides_length;
> { u2 provides_index; } provides_table[provides_length];
> }
> attribute_name_index
> The value of the attribute_name_index item must be a valid index
> into the constant_pool table. The constant_pool entry at that index
> must be a CONSTANT_Utf8_info structure representing the string
> "ModuleProvides".
> attribute_length
> The value of the attribute_length item is the length of the
> attribute excluding the initial six bytes.
> provides_length
> The value of the provides_length indicates the number of entries in
> the provides_table.
> provides_table
> The value of each provides_index in this item must be a valid index
> into the constant_pool table. The constant_pool entry at that index
> must be a CONSTANT_ModuleId_info structure representing a module
> identity that is an alias for the module represented by this
> ClassFile.
> The ModuleClass attribute is defined as follows:
> ModuleClass_attribute {
> u2 attribute_name_index;
> u4 attribute_length;
> u2 main_class;
> }
> attribute_name_index
> The value of the attribute_name_index item must be a valid index
> into the constant_pool table. The constant_pool entry at that index
> must be a CONSTANT_Utf8_info structure representing the string
> "ModuleClass".
> attribute_length
> The value of the attribute_length item is the length of the
> attribute excluding the initial six bytes.
> main_class
> The value of the main_class item must be a valid index into the
> constant_pool table. The constant_pool entry at that index must be a
> CONSTANT_Class_info structure representing the name of the class
> which the host system should treat as the entrypoint to the module.
More information about the jigsaw-dev
mailing list