< 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 >