< prev index next >
src/hotspot/share/interpreter/interpreterRuntime.cpp
Print this page
*** 353,379 ****
new_value_h()->obj_field_put(field_offset, aoop);
} else {
new_value_h()->obj_field_put_raw(field_offset, aoop);
}
} else if (field_type == T_OBJECT) {
- // Logic below is optimized
- // Null checks for non flattenable fields have already be performed in the assembly template
- // of the interpreter, which reduces the number of possible cases:
- // 1 - flattened or not flattened
- // 2 - if not flattened: argument is buffered (value) or in heap (value and objects)
if (cp_entry->is_flattened()) {
- Klass* field_k = vklass->get_value_field_klass(field_index);
- ValueKlass* field_vk = ValueKlass::cast(field_k);
oop vt_oop = *(oop*)f.interpreter_frame_expression_stack_at(tos_idx);
assert(vt_oop != NULL && oopDesc::is_oop(vt_oop) && vt_oop->is_value(),"argument must be a value type");
assert(field_vk == vt_oop->klass(), "Must match");
field_vk->value_store(field_vk->data_for_oop(vt_oop),
((char*)(oopDesc*)new_value_h()) + field_offset, in_heap, false);
} else { // not flattened
oop voop = *(oop*)f.interpreter_frame_expression_stack_at(tos_idx);
! assert(voop != NULL || !cp_entry->is_flattenable(),
! "NULL checks for non flattenable fields must have been performed in interpreter assembly template");
assert(voop == NULL || oopDesc::is_oop(voop),"checking argument");
if (VTBuffer::is_in_vt_buffer(voop)) {
// new value field is currently allocated in a TLVB, a heap allocated
// copy must be created because a field must never point to a TLVB allocated value
Handle voop_h = Handle(THREAD, voop);
--- 353,380 ----
new_value_h()->obj_field_put(field_offset, aoop);
} else {
new_value_h()->obj_field_put_raw(field_offset, aoop);
}
} else if (field_type == T_OBJECT) {
if (cp_entry->is_flattened()) {
oop vt_oop = *(oop*)f.interpreter_frame_expression_stack_at(tos_idx);
+ if (vt_oop == NULL) {
+ THROW_(vmSymbols::java_lang_NullPointerException(),
+ (type2size[field_type] * AbstractInterpreter::stackElementSize));
+ }
assert(vt_oop != NULL && oopDesc::is_oop(vt_oop) && vt_oop->is_value(),"argument must be a value type");
+ Klass* field_k = vklass->get_value_field_klass(field_index);
+ ValueKlass* field_vk = ValueKlass::cast(field_k);
assert(field_vk == vt_oop->klass(), "Must match");
field_vk->value_store(field_vk->data_for_oop(vt_oop),
((char*)(oopDesc*)new_value_h()) + field_offset, in_heap, false);
} else { // not flattened
oop voop = *(oop*)f.interpreter_frame_expression_stack_at(tos_idx);
! if (voop == NULL && cp_entry->is_flattenable()) {
! THROW_(vmSymbols::java_lang_NullPointerException(),
! (type2size[field_type] * AbstractInterpreter::stackElementSize));
! }
assert(voop == NULL || oopDesc::is_oop(voop),"checking argument");
if (VTBuffer::is_in_vt_buffer(voop)) {
// new value field is currently allocated in a TLVB, a heap allocated
// copy must be created because a field must never point to a TLVB allocated value
Handle voop_h = Handle(THREAD, voop);
< prev index next >