--- old/src/hotspot/share/classfile/classFileParser.cpp 2017-10-19 16:23:17.777323105 -0400 +++ new/src/hotspot/share/classfile/classFileParser.cpp 2017-10-19 16:23:17.625322351 -0400 @@ -4584,10 +4584,9 @@ } } - for (FieldStream st((InstanceKlass*)defined_klass, false, false); !st.eos(); st.next()) { - Symbol* signature = st.signature(); - if (signature->starts_with("Q")) { - Klass* klass = SystemDictionary::resolve_or_fail(signature, + for(int i = 0; i < defined_klass->java_fields_count(); i++) { + if (defined_klass->field_signature(i)->starts_with("Q") && (((defined_klass->field_access_flags(i) & JVM_ACC_STATIC)) == 0)) { + Klass* klass = SystemDictionary::resolve_or_fail(defined_klass->field_signature(i), Handle(THREAD, defined_klass->class_loader()), Handle(THREAD, defined_klass->protection_domain()), true, CHECK); assert(klass != NULL, "Sanity check"); @@ -5744,7 +5743,7 @@ record_defined_class_dependencies(ik, CHECK); for(int i = 0; i < ik->java_fields_count(); i++) { - if (ik->field_signature(i)->starts_with("Q")) { + if (ik->field_signature(i)->starts_with("Q") && (((ik->field_access_flags(i) & JVM_ACC_STATIC)) == 0)) { Klass* klass = SystemDictionary::resolve_or_fail(ik->field_signature(i), Handle(THREAD, ik->class_loader()), Handle(THREAD, ik->protection_domain()), true, CHECK); --- old/src/hotspot/share/interpreter/interpreterRuntime.cpp 2017-10-19 16:23:18.185325128 -0400 +++ new/src/hotspot/share/interpreter/interpreterRuntime.cpp 2017-10-19 16:23:18.033324374 -0400 @@ -369,7 +369,15 @@ int offset = klass->field_offset(index); assert(mirror->obj_field(offset) == NULL,"Field must not be initialized twice"); - Klass* field_k = klass->get_value_field_klass(index); + Klass* field_k = klass->get_value_field_klass_or_null(index); + if (field_k == NULL) { + field_k = SystemDictionary::resolve_or_fail(klass->field_signature(index), + Handle(THREAD, klass->class_loader()), + Handle(THREAD, klass->protection_domain()), true, CHECK); + assert(field_k != NULL, "Sanity check"); + assert(field_k->access_flags().is_value_type(), "Value type expected"); + klass->set_value_field_klass(index, field_k); + } ValueKlass* field_vklass = ValueKlass::cast(field_k); // allocate instance, because it is going to be assigned to a static field // it must not be a buffered value --- old/src/hotspot/share/oops/instanceKlass.hpp 2017-10-19 16:23:18.553326953 -0400 +++ new/src/hotspot/share/oops/instanceKlass.hpp 2017-10-19 16:23:18.401326199 -0400 @@ -1247,6 +1247,13 @@ return k; } + Klass* get_value_field_klass_or_null(int idx) { + assert(has_value_fields(), "Sanity checking"); + Klass* k = ((Klass**)adr_value_fields_klasses())[idx]; + assert(k == NULL || k->is_value(), "Must be a value type"); + return k; + } + void set_value_field_klass(int idx, Klass* k) { assert(has_value_fields(), "Sanity checking"); assert(k != NULL, "Should not be set to NULL");