--- old/src/hotspot/share/classfile/classFileParser.hpp 2019-03-11 14:25:35.726355576 +0100 +++ new/src/hotspot/share/classfile/classFileParser.hpp 2019-03-11 14:25:35.526355579 +0100 @@ -28,6 +28,7 @@ #include "memory/referenceType.hpp" #include "oops/annotations.hpp" #include "oops/constantPool.hpp" +#include "oops/instanceKlass.hpp" #include "oops/typeArrayOop.hpp" #include "utilities/accessFlags.hpp" @@ -55,6 +56,7 @@ class FieldAllocationCount; class FieldAnnotationCollector; class FieldLayoutInfo; + class OopMapBlocksBuilder; public: // The ClassFileParser has an associated "publicity" level @@ -160,6 +162,7 @@ bool _has_nonstatic_concrete_methods; bool _declares_nonstatic_concrete_methods; bool _has_final_method; + bool _has_flattenable_fields; // precomputed flags bool _has_finalizer; @@ -227,6 +230,7 @@ void parse_fields(const ClassFileStream* const cfs, bool is_interface, + bool is_value_type, FieldAllocationCount* const fac, ConstantPool* cp, const int cp_size, @@ -236,12 +240,14 @@ // Method parsing Method* parse_method(const ClassFileStream* const cfs, bool is_interface, + bool is_value_type, const ConstantPool* cp, AccessFlags* const promoted_flags, TRAPS); void parse_methods(const ClassFileStream* const cfs, bool is_interface, + bool is_value_type, AccessFlags* const promoted_flags, bool* const has_final_method, bool* const declares_nonstatic_concrete_methods, @@ -315,7 +321,7 @@ int runtime_invisible_annotations_length, TRAPS); - void set_precomputed_flags(InstanceKlass* k); + void set_precomputed_flags(InstanceKlass* k, TRAPS); // Format checker methods void classfile_parse_error(const char* msg, TRAPS) const; @@ -399,6 +405,11 @@ const Symbol* sig, TRAPS) const; + void throwValueTypeLimitation(THREAD_AND_LOCATION_DECL, + const char* msg, + const Symbol* name = NULL, + const Symbol* sig = NULL) const; + void verify_constantvalue(const ConstantPool* const cp, int constantvalue_index, int signature_index, @@ -417,9 +428,13 @@ TRAPS) const; void verify_legal_class_modifiers(jint flags, TRAPS) const; - void verify_legal_field_modifiers(jint flags, bool is_interface, TRAPS) const; + void verify_legal_field_modifiers(jint flags, + bool is_interface, + bool is_value_type, + TRAPS) const; void verify_legal_method_modifiers(jint flags, bool is_interface, + bool is_value_type, const Symbol* name, TRAPS) const; @@ -498,6 +513,9 @@ void update_class_name(Symbol* new_name); + // Check if the class file supports value types + bool supports_value_types() const; + public: ClassFileParser(ClassFileStream* stream, Symbol* name, @@ -528,6 +546,11 @@ bool is_unsafe_anonymous() const { return _unsafe_anonymous_host != NULL; } bool is_interface() const { return _access_flags.is_interface(); } + bool is_value_type() const { return _access_flags.is_value_type(); } + bool is_value_capable_class() const; + bool has_flattenable_fields() const { return _has_flattenable_fields; } + + u2 java_fields_count() const { return _java_fields_count; } const InstanceKlass* unsafe_anonymous_host() const { return _unsafe_anonymous_host; } const GrowableArray* cp_patches() const { return _cp_patches; }