< prev index next >
src/hotspot/share/classfile/classFileParser.cpp
Print this page
*** 1544,1554 ****
int num_injected = 0;
const InjectedField* const injected = JavaClasses::get_injected(_class_name,
&num_injected);
! const int total_fields = length + num_injected + (is_value_type ? 1 : 0);
// The field array starts with tuples of shorts
// [access, name index, sig index, initial value index, byte offset].
// A generic signature slot only exists for field with generic
// signature attribute. And the access flag is set with
--- 1544,1554 ----
int num_injected = 0;
const InjectedField* const injected = JavaClasses::get_injected(_class_name,
&num_injected);
! const int total_fields = length + num_injected + (is_value_type ? 2 : 0);
// The field array starts with tuples of shorts
// [access, name index, sig index, initial value index, byte offset].
// A generic signature slot only exists for field with generic
// signature attribute. And the access flag is set with
*** 1574,1583 ****
--- 1574,1584 ----
total_fields * (FieldInfo::field_slots + 1));
// The generic signature slots start after all other fields' data.
int generic_signature_slot = total_fields * FieldInfo::field_slots;
int num_generic_signature = 0;
+ int instance_fields_count = 0;
for (int n = 0; n < length; n++) {
// access_flags, name_index, descriptor_index, attributes_count
cfs->guarantee_more(8, CHECK);
jint recognized_modifiers = JVM_RECOGNIZED_FIELD_MODIFIERS;
*** 1614,1623 ****
--- 1615,1625 ----
" ACC_FLATTENABLE cannot be specified for an array",
name->as_C_string(), sig->as_klass_external_name(), CHECK);
}
_has_flattenable_fields = true;
}
+ if (!access_flags.is_static()) instance_fields_count++;
u2 constantvalue_index = 0;
bool is_synthetic = false;
u2 generic_signature_index = 0;
const bool is_static = access_flags.is_static();
*** 1721,1731 ****
index++;
}
}
if (is_value_type) {
- index = length + num_injected;
FieldInfo* const field = FieldInfo::from_field_array(fa, index);
field->initialize(JVM_ACC_FIELD_INTERNAL | JVM_ACC_STATIC,
vmSymbols::default_value_name_enum,
vmSymbols::java_lang_Object_enum,
0);
--- 1723,1732 ----
*** 1733,1742 ****
--- 1734,1756 ----
const FieldAllocationType atype = fac->update(true, type, false);
field->set_allocation_type(atype);
index++;
}
+ if (is_value_type && instance_fields_count == 0) {
+ _is_empty_value = true;
+ FieldInfo* const field = FieldInfo::from_field_array(fa, index);
+ field->initialize(JVM_ACC_FIELD_INTERNAL,
+ vmSymbols::empty_marker_name_enum,
+ vmSymbols::byte_signature_enum,
+ 0);
+ const BasicType type = FieldType::basic_type(vmSymbols::byte_signature());
+ const FieldAllocationType atype = fac->update(false, type, false);
+ field->set_allocation_type(atype);
+ index++;
+ }
+
assert(NULL == _fields, "invariant");
_fields =
MetadataFactory::new_array<u2>(_loader_data,
index * FieldInfo::field_slots + num_generic_signature,
*** 5791,5800 ****
--- 5805,5817 ----
ik->set_should_verify_class(_need_verify);
// Not yet: supers are done below to support the new subtype-checking fields
ik->set_nonstatic_field_size(_field_info->nonstatic_field_size);
ik->set_has_nonstatic_fields(_field_info->has_nonstatic_fields);
+ if (_is_empty_value) {
+ ik->set_is_empty_value();
+ }
assert(_fac != NULL, "invariant");
ik->set_static_oop_field_count(_fac->count[STATIC_OOP] + _fac->count[STATIC_FLATTENABLE]);
// this transfers ownership of a lot of arrays from
// the parser onto the InstanceKlass*
*** 5959,5971 ****
ValueKlass::cast(ik)->set_default_value_offset(ik->field_offset(i));
}
}
if (is_value_type()) {
! ValueKlass::cast(ik)->set_alignment(_alignment);
! ValueKlass::cast(ik)->set_first_field_offset(_first_field_offset);
! ValueKlass::cast(ik)->set_exact_size_in_bytes(_exact_size_in_bytes);
ValueKlass::cast(ik)->initialize_calling_convention(CHECK);
}
ClassLoadingService::notify_class_loaded(ik, false /* not shared class */);
--- 5976,5993 ----
ValueKlass::cast(ik)->set_default_value_offset(ik->field_offset(i));
}
}
if (is_value_type()) {
! ValueKlass* vk = ValueKlass::cast(ik);
! if (UseNewLayout) {
! vk->set_alignment(_alignment);
! vk->set_first_field_offset(_first_field_offset);
! vk->set_exact_size_in_bytes(_exact_size_in_bytes);
! } else {
! vk->set_first_field_offset(vk->first_field_offset_old());
! }
ValueKlass::cast(ik)->initialize_calling_convention(CHECK);
}
ClassLoadingService::notify_class_loaded(ik, false /* not shared class */);
*** 6155,6164 ****
--- 6177,6187 ----
_relax_verify(false),
_has_nonstatic_concrete_methods(false),
_declares_nonstatic_concrete_methods(false),
_has_final_method(false),
_has_flattenable_fields(false),
+ _is_empty_value(false),
_has_finalizer(false),
_has_empty_finalizer(false),
_has_vanilla_constructor(false),
_max_bootstrap_specifier_index(-1) {
< prev index next >