< prev index next >
src/share/vm/classfile/classFileParser.cpp
Print this page
@@ -3962,10 +3962,11 @@
int static_value_type_count = 0;
int nonstatic_value_type_count = 0;
int* nonstatic_value_type_indexes = NULL;
Klass** nonstatic_value_type_klasses = NULL;
unsigned int value_type_oop_map_count = 0;
+ int not_flattened_value_types = 0;
int max_nonstatic_value_type = fac->count[NONSTATIC_VALUETYPE] + 1;
nonstatic_value_type_indexes = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, int,
max_nonstatic_value_type);
@@ -3983,21 +3984,33 @@
Klass* klass = SystemDictionary::resolve_or_fail(signature,
Handle(THREAD, _loader_data->class_loader()),
_protection_domain, true, CHECK);
assert(klass != NULL, "Sanity check");
assert(klass->access_flags().is_value_type(), "Value type expected");
+ ValueKlass* vk = ValueKlass::cast(klass);
+ // Conditions to apply flattening or not should be defined
+ //in a single place
+ if (vk->size_helper() <= ValueArrayElemMaxFlatSize) {
nonstatic_value_type_indexes[nonstatic_value_type_count] = fs.index();
nonstatic_value_type_klasses[nonstatic_value_type_count] = klass;
nonstatic_value_type_count++;
ValueKlass* vklass = ValueKlass::cast(klass);
if (vklass->contains_oops()) {
value_type_oop_map_count += vklass->nonstatic_oop_map_count();
}
+ fs.set_flattening(true);
+ } else {
+ not_flattened_value_types++;
+ fs.set_flattening(false);
+ }
}
}
+ // Adjusting non_static_oop_count to take into account not flattened value types;
+ nonstatic_oop_count += not_flattened_value_types;
+
// Total non-static fields count, including every contended field
unsigned int nonstatic_fields_count = fac->count[NONSTATIC_DOUBLE] + fac->count[NONSTATIC_WORD] +
fac->count[NONSTATIC_SHORT] + fac->count[NONSTATIC_BYTE] +
fac->count[NONSTATIC_OOP] + fac->count[NONSTATIC_VALUETYPE];
@@ -4024,11 +4037,12 @@
//
int super_oop_map_count = (_super_klass == NULL) ? 0 :_super_klass->nonstatic_oop_map_count();
int max_oop_map_count =
super_oop_map_count +
fac->count[NONSTATIC_OOP] +
- value_type_oop_map_count;
+ value_type_oop_map_count +
+ not_flattened_value_types;
OopMapBlocksBuilder* nonstatic_oop_maps = new OopMapBlocksBuilder(max_oop_map_count, THREAD);
if (super_oop_map_count > 0) {
nonstatic_oop_maps->initialize_inherited_blocks(_super_klass->start_of_nonstatic_oop_maps(),
_super_klass->nonstatic_oop_map_count());
@@ -4212,11 +4226,11 @@
case STATIC_DOUBLE:
real_offset = next_static_double_offset;
next_static_double_offset += BytesPerLong;
break;
case NONSTATIC_VALUETYPE:
- {
+ if (fs.is_flatten()) {
Klass* klass = nonstatic_value_type_klasses[next_value_type_index];
assert(klass != NULL, "Klass should have been loaded and resolved earlier");
assert(klass->access_flags().is_value_type(),"Must be a value type");
ValueKlass* vklass = ValueKlass::cast(klass);
real_offset = next_nonstatic_valuetype_offset;
@@ -4232,12 +4246,14 @@
while (map < last_map) {
nonstatic_oop_maps->add(map->offset() + diff, map->count());
map++;
}
}
- }
break;
+ } else {
+ // Fall through
+ }
case NONSTATIC_OOP:
if( nonstatic_oop_space_count > 0 ) {
real_offset = nonstatic_oop_space_offset;
nonstatic_oop_space_offset += heapOopSize;
nonstatic_oop_space_count -= 1;
< prev index next >