< prev index next >
src/share/vm/ci/ciInstanceKlass.cpp
Print this page
@@ -61,11 +61,10 @@
_nonstatic_field_size = ik->nonstatic_field_size();
_has_nonstatic_fields = ik->has_nonstatic_fields();
_has_nonstatic_concrete_methods = ik->has_nonstatic_concrete_methods();
_is_anonymous = ik->is_anonymous();
_nonstatic_fields = NULL; // initialized lazily by compute_nonstatic_fields
- _nof_declared_nonstatic_fields = -1; // initialized lazily by compute_nonstatic_fields
_has_injected_fields = -1;
_vcc_klass = NULL;
_implementor = NULL; // we will fill these lazily
Thread *thread = Thread::current();
@@ -104,11 +103,10 @@
assert(name->byte_at(0) != '[', "not an instance klass");
_init_state = (InstanceKlass::ClassState)0;
_nonstatic_field_size = -1;
_has_nonstatic_fields = false;
_nonstatic_fields = NULL; // initialized lazily by compute_nonstatic_fields
- _nof_declared_nonstatic_fields = -1; // initialized lazily by compute_nonstatic_fields
_has_injected_fields = -1;
_vcc_klass = NULL;
_is_anonymous = false;
_loader = loader;
_protection_domain = protection_domain;
@@ -455,11 +453,10 @@
return _nonstatic_fields->length();
if (!has_nonstatic_fields()) {
Arena* arena = CURRENT_ENV->arena();
_nonstatic_fields = new (arena) GrowableArray<ciField*>(arena, 0, 0, NULL);
- _nof_declared_nonstatic_fields = 0;
return 0;
}
assert(!is_java_lang_Object(), "bootstrap OK");
// Size in bytes of my fields, including inherited fields.
@@ -473,11 +470,10 @@
super_fields = super->_nonstatic_fields;
assert(super_flen == 0 || super_fields != NULL, "first get nof_fields");
// See if I am no larger than my super; if so, I can use his fields.
if (fsize == super_fsize) {
_nonstatic_fields = super_fields;
- _nof_declared_nonstatic_fields = super->nof_declared_nonstatic_fields();
return super_fields->length();
}
}
GrowableArray<ciField*>* fields = NULL;
@@ -487,30 +483,21 @@
if (fields == NULL) {
// This can happen if this class (java.lang.Class) has invisible fields.
if (super_fields != NULL) {
_nonstatic_fields = super_fields;
- _nof_declared_nonstatic_fields = super->nof_declared_nonstatic_fields();
return super_fields->length();
} else {
- _nof_declared_nonstatic_fields = 0;
return 0;
}
}
- int flen = fields->length();
-
- // Now sort them by offset, ascending.
- // (In principle, they could mix with superclass fields.)
- fields->sort(sort_field_by_offset);
_nonstatic_fields = fields;
- return flen;
+ return fields->length();
}
-GrowableArray<ciField*>*
-ciInstanceKlass::compute_nonstatic_fields_impl(GrowableArray<ciField*>*
- super_fields) {
+GrowableArray<ciField*>* ciInstanceKlass::compute_nonstatic_fields_impl(GrowableArray<ciField*>* super_fields, bool flatten) {
ASSERT_IN_VM;
Arena* arena = CURRENT_ENV->arena();
int flen = 0;
GrowableArray<ciField*>* fields = NULL;
InstanceKlass* k = get_instanceKlass();
@@ -519,32 +506,31 @@
flen += 1;
}
// allocate the array:
if (flen == 0) {
- _nof_declared_nonstatic_fields = flen;
return NULL; // return nothing if none are locally declared
}
if (super_fields != NULL) {
flen += super_fields->length();
}
- _nof_declared_nonstatic_fields = flen;
fields = new (arena) GrowableArray<ciField*>(arena, flen, 0, NULL);
if (super_fields != NULL) {
fields->appendAll(super_fields);
}
for (JavaFieldStream fs(k); !fs.done(); fs.next()) {
if (fs.access_flags().is_static()) continue;
fieldDescriptor& fd = fs.field_descriptor();
- if (fd.field_type() == T_VALUETYPE) {
+ if (fd.is_flatten() && flatten) {
+ assert(fd.field_type() == T_VALUETYPE, "flattening is only supported for value type fields");
// Value type fields are embedded
int field_offset = fd.offset();
// Get ValueKlass and adjust number of fields
ciValueKlass* vk = get_field_type_by_offset(field_offset)->as_value_klass();
- flen += vk->flattened_field_count() - 1;
+ flen += vk->nof_nonstatic_fields() - 1;
// Iterate over fields of the flattened value type and copy them to 'this'
for (int i = 0; i < vk->nof_nonstatic_fields(); ++i) {
ciField* flattened_field = vk->nonstatic_field_at(i);
// Adjust offset to account for missing oop header
int offset = field_offset + (flattened_field->offset() - vk->first_field_offset());
@@ -558,10 +544,13 @@
ciField* field = new (arena) ciField(&fd);
fields->append(field);
}
}
assert(fields->length() == flen, "sanity");
+ // Now sort them by offset, ascending.
+ // (In principle, they could mix with superclass fields.)
+ fields->sort(sort_field_by_offset);
return fields;
}
bool ciInstanceKlass::compute_injected_fields_helper() {
ASSERT_IN_VM;
< prev index next >