Wed, 28 Dec 2011 12:15:57 -0500
7123315: instanceKlass::_static_oop_field_count and instanceKlass::_java_fields_count should be u2 type.
Summary: Change instanceKlass::_static_oop_field_count and instanceKlass::_java_fields_count to u2 type.
Reviewed-by: never, bdelsart, dholmes
Contributed-by: Jiangli Zhou <jiangli.zhou@oracle.com>
1.1 --- a/src/share/vm/classfile/classFileParser.cpp Tue Dec 20 12:33:05 2011 +0100 1.2 +++ b/src/share/vm/classfile/classFileParser.cpp Wed Dec 28 12:15:57 2011 -0500 1.3 @@ -1050,7 +1050,7 @@ 1.4 1.5 class FieldAllocationCount: public ResourceObj { 1.6 public: 1.7 - unsigned int count[MAX_FIELD_ALLOCATION_TYPE]; 1.8 + u2 count[MAX_FIELD_ALLOCATION_TYPE]; 1.9 1.10 FieldAllocationCount() { 1.11 for (int i = 0; i < MAX_FIELD_ALLOCATION_TYPE; i++) { 1.12 @@ -1060,6 +1060,8 @@ 1.13 1.14 FieldAllocationType update(bool is_static, BasicType type) { 1.15 FieldAllocationType atype = basic_type_to_atype(is_static, type); 1.16 + // Make sure there is no overflow with injected fields. 1.17 + assert(count[atype] < 0xFFFF, "More than 65535 fields"); 1.18 count[atype]++; 1.19 return atype; 1.20 } 1.21 @@ -1070,7 +1072,7 @@ 1.22 constantPoolHandle cp, bool is_interface, 1.23 FieldAllocationCount *fac, 1.24 objArrayHandle* fields_annotations, 1.25 - int* java_fields_count_ptr, TRAPS) { 1.26 + u2* java_fields_count_ptr, TRAPS) { 1.27 ClassFileStream* cfs = stream(); 1.28 typeArrayHandle nullHandle; 1.29 cfs->guarantee_more(2, CHECK_(nullHandle)); // length 1.30 @@ -2843,7 +2845,7 @@ 1.31 local_interfaces = parse_interfaces(cp, itfs_len, class_loader, protection_domain, _class_name, CHECK_(nullHandle)); 1.32 } 1.33 1.34 - int java_fields_count = 0; 1.35 + u2 java_fields_count = 0; 1.36 // Fields (offsets are filled in later) 1.37 FieldAllocationCount fac; 1.38 objArrayHandle fields_annotations;
2.1 --- a/src/share/vm/classfile/classFileParser.hpp Tue Dec 20 12:33:05 2011 +0100 2.2 +++ b/src/share/vm/classfile/classFileParser.hpp Wed Dec 28 12:15:57 2011 -0500 2.3 @@ -91,7 +91,7 @@ 2.4 constantPoolHandle cp, bool is_interface, 2.5 FieldAllocationCount *fac, 2.6 objArrayHandle* fields_annotations, 2.7 - int* java_fields_count_ptr, TRAPS); 2.8 + u2* java_fields_count_ptr, TRAPS); 2.9 2.10 // Method parsing 2.11 methodHandle parse_method(constantPoolHandle cp, bool is_interface,
3.1 --- a/src/share/vm/oops/instanceKlass.hpp Tue Dec 20 12:33:05 2011 +0100 3.2 +++ b/src/share/vm/oops/instanceKlass.hpp Wed Dec 28 12:15:57 2011 -0500 3.3 @@ -227,9 +227,9 @@ 3.4 // (including inherited fields but after header_size()). 3.5 int _nonstatic_field_size; 3.6 int _static_field_size; // number words used by static fields (oop and non-oop) in this klass 3.7 - int _static_oop_field_count;// number of static oop fields in this klass 3.8 + u2 _static_oop_field_count;// number of static oop fields in this klass 3.9 + u2 _java_fields_count; // The number of declared Java fields 3.10 int _nonstatic_oop_map_size;// size in words of nonstatic oop map blocks 3.11 - int _java_fields_count; // The number of declared Java fields 3.12 3.13 u2 _minor_version; // minor version number of class file 3.14 u2 _major_version; // major version number of class file 3.15 @@ -299,8 +299,8 @@ 3.16 int static_field_size() const { return _static_field_size; } 3.17 void set_static_field_size(int size) { _static_field_size = size; } 3.18 3.19 - int static_oop_field_count() const { return _static_oop_field_count; } 3.20 - void set_static_oop_field_count(int size) { _static_oop_field_count = size; } 3.21 + int static_oop_field_count() const { return (int)_static_oop_field_count; } 3.22 + void set_static_oop_field_count(u2 size) { _static_oop_field_count = size; } 3.23 3.24 // Java vtable 3.25 int vtable_length() const { return _vtable_len; } 3.26 @@ -340,14 +340,14 @@ 3.27 Symbol* field_signature (int index) const { return field(index)->signature(constants()); } 3.28 3.29 // Number of Java declared fields 3.30 - int java_fields_count() const { return _java_fields_count; } 3.31 + int java_fields_count() const { return (int)_java_fields_count; } 3.32 3.33 // Number of fields including any injected fields 3.34 int all_fields_count() const { return _fields->length() / sizeof(FieldInfo::field_slots); } 3.35 3.36 typeArrayOop fields() const { return _fields; } 3.37 3.38 - void set_fields(typeArrayOop f, int java_fields_count) { 3.39 + void set_fields(typeArrayOop f, u2 java_fields_count) { 3.40 oop_store_without_check((oop*) &_fields, (oop) f); 3.41 _java_fields_count = java_fields_count; 3.42 }
4.1 --- a/src/share/vm/runtime/vmStructs.cpp Tue Dec 20 12:33:05 2011 +0100 4.2 +++ b/src/share/vm/runtime/vmStructs.cpp Wed Dec 28 12:15:57 2011 -0500 4.3 @@ -295,7 +295,7 @@ 4.4 nonstatic_field(instanceKlass, _nof_implementors, int) \ 4.5 nonstatic_field(instanceKlass, _implementors[0], klassOop) \ 4.6 nonstatic_field(instanceKlass, _fields, typeArrayOop) \ 4.7 - nonstatic_field(instanceKlass, _java_fields_count, int) \ 4.8 + nonstatic_field(instanceKlass, _java_fields_count, u2) \ 4.9 nonstatic_field(instanceKlass, _constants, constantPoolOop) \ 4.10 nonstatic_field(instanceKlass, _class_loader, oop) \ 4.11 nonstatic_field(instanceKlass, _protection_domain, oop) \ 4.12 @@ -305,7 +305,7 @@ 4.13 nonstatic_field(instanceKlass, _inner_classes, typeArrayOop) \ 4.14 nonstatic_field(instanceKlass, _nonstatic_field_size, int) \ 4.15 nonstatic_field(instanceKlass, _static_field_size, int) \ 4.16 - nonstatic_field(instanceKlass, _static_oop_field_count, int) \ 4.17 + nonstatic_field(instanceKlass, _static_oop_field_count, u2) \ 4.18 nonstatic_field(instanceKlass, _nonstatic_oop_map_size, int) \ 4.19 nonstatic_field(instanceKlass, _misc_flags, u1) \ 4.20 nonstatic_field(instanceKlass, _minor_version, u2) \