< prev index next >

src/hotspot/share/prims/unsafe.cpp

Print this page

        

@@ -301,21 +301,37 @@
   oop p = JNIHandles::resolve(obj);
   Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(c));
   ValueKlass* vk = ValueKlass::cast(k);
 
 #ifdef ASSERT
+  Klass* ok = p->klass();
+  if (ok->is_instance_klass()) {
   assert_field_offset_sane(p, offset);
   fieldDescriptor fd;
   bool found = get_field_descriptor(p, offset, &fd);
   assert(found, "value field not found");
   assert(fd.is_flattened(), "field not flat");
+  } else if (ok->is_valueArray_klass()) {
+    ValueArrayKlass* vak = ValueArrayKlass::cast(ok);
+    int index = (offset - vak->array_header_in_bytes()) / vak->element_byte_size();
+    address dest = (address)((valueArrayOop)p)->value_at_addr(index, vak->layout_helper());
+    assert(dest == ((address)p) + offset, "invalid offset");
+  }
 #endif // ASSERT
 
   if (log_is_enabled(Trace, valuetypes)) {
+    if (p->klass()->is_valueArray_klass()) {
+      ValueArrayKlass* vak = ValueArrayKlass::cast(p->klass());
+      int index = (offset - vak->array_header_in_bytes()) / vak->element_byte_size();
+      address dest = (address)((valueArrayOop)p)->value_at_addr(index, vak->layout_helper());
+      log_trace(valuetypes)("getValue: array type %s index %d element size %d offset " SIZE_FORMAT_HEX " at " INTPTR_FORMAT,
+                            vak->external_name(), index, vak->element_byte_size(), offset, p2i(dest));
+    } else {
     log_trace(valuetypes)("getValue: field type %s at offset " SIZE_FORMAT_HEX,
                           vk->external_name(), offset);
   }
+  }
 
   Handle p_h(THREAD, p);
   bool in_heap;
   oop v = vk->allocate_buffered_or_heap_instance(&in_heap, CHECK_NULL); // allocate instance
   vk->initialize(CHECK_NULL); // If field is a default value, value class might not be initialized yet

@@ -330,21 +346,37 @@
   oop p = JNIHandles::resolve(obj);
   Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(c));
   ValueKlass* vk = ValueKlass::cast(k);
 
 #ifdef ASSERT
+  Klass* ok = p->klass();
+  if (ok->is_instance_klass()) {
   assert_field_offset_sane(p, offset);
   fieldDescriptor fd;
   bool found = get_field_descriptor(p, offset, &fd);
   assert(found, "value field not found");
   assert(fd.is_flattened(), "field not flat");
+  } else if (ok->is_valueArray_klass()) {
+    ValueArrayKlass* vak = ValueArrayKlass::cast(ok);
+    int index = (offset - vak->array_header_in_bytes()) / vak->element_byte_size();
+    address dest = (address)((valueArrayOop)p)->value_at_addr(index, vak->layout_helper());
+    assert(dest == ((address)p) + offset, "invalid offset");
+  }
 #endif  // ASSERT
 
   if (log_is_enabled(Trace, valuetypes)) {
+    if (p->klass()->is_valueArray_klass()) {
+      ValueArrayKlass* vak = ValueArrayKlass::cast(p->klass());
+      int index = (offset - vak->array_header_in_bytes()) / vak->element_byte_size();
+      address dest = (address)((valueArrayOop)p)->value_at_addr(index, vak->layout_helper());
+      log_trace(valuetypes)("putValue: array type %s index %d element size %d offset " SIZE_FORMAT_HEX " at " INTPTR_FORMAT,
+                            vak->external_name(), index, vak->element_byte_size(), offset, p2i(dest));
+    } else {
     log_trace(valuetypes)("putValue: field type %s at offset " SIZE_FORMAT_HEX,
                           vk->external_name(), offset);
   }
+  }
   vk->value_store(vk->data_for_oop(v),
                  ((char*)(oopDesc*)p) + offset, true, true);
 } UNSAFE_END
 
 UNSAFE_ENTRY(jobject, Unsafe_GetObjectVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset)) {

@@ -646,10 +678,15 @@
   } else if (k->is_typeArray_klass()) {
     TypeArrayKlass* tak = TypeArrayKlass::cast(k);
     base  = tak->array_header_in_bytes();
     assert(base == arrayOopDesc::base_offset_in_bytes(tak->element_type()), "array_header_size semantics ok");
     scale = (1 << tak->log2_element_size());
+  } else if (k->is_valueArray_klass()) {
+    ValueArrayKlass* vak = ValueArrayKlass::cast(k);
+    ValueKlass* vklass = vak->element_klass();
+    base = vak->array_header_in_bytes();
+    scale = vak->element_byte_size();
   } else {
     ShouldNotReachHere();
   }
 }
 
< prev index next >