< 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 >