< prev index next >

src/hotspot/share/interpreter/interpreterRuntime.cpp

Print this page

        

@@ -367,11 +367,19 @@
   instanceHandle mirror_h(THREAD, (instanceOop)mirror);
   InstanceKlass* klass = InstanceKlass::cast(java_lang_Class::as_Klass(mirror));
   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
   instanceOop res = field_vklass->allocate_instance(CHECK);
   instanceHandle res_h(THREAD, res);
< prev index next >