< prev index next >
src/share/vm/classfile/classFileParser.cpp
Print this page
*** 3983,4000 ****
--- 3983,4009 ----
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 {
+ value_type_oop_map_count++;
+ fs.set_flattening(false);
+ }
}
}
// Total non-static fields count, including every contended field
unsigned int nonstatic_fields_count = fac->count[NONSTATIC_DOUBLE] + fac->count[NONSTATIC_WORD] +
*** 4212,4222 ****
case STATIC_DOUBLE:
real_offset = next_static_double_offset;
next_static_double_offset += BytesPerLong;
break;
case NONSTATIC_VALUETYPE:
! {
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;
--- 4221,4231 ----
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,4243 ****
while (map < last_map) {
nonstatic_oop_maps->add(map->offset() + diff, map->count());
map++;
}
}
- }
break;
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;
--- 4241,4254 ----
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 >