< prev index next >
src/hotspot/share/c1/c1_LIR.cpp
Print this page
*** 1060,1084 ****
void LIR_OpJavaCall::emit_code(LIR_Assembler* masm) {
masm->emit_call(this);
}
! bool LIR_OpJavaCall::maybe_return_as_fields() const {
if (ValueTypeReturnedAsFields) {
if (method()->signature()->returns_never_null()) {
ciType* return_type = method()->return_type();
if (return_type->is_valuetype()) {
ciValueKlass* vk = return_type->as_value_klass();
if (vk->can_be_returned_as_fields()) {
return true;
}
}
} else if (is_method_handle_invoke()) {
BasicType bt = method()->return_type()->basic_type();
if (bt == T_OBJECT || bt == T_VALUETYPE) {
// A value type might be returned from the call but we don't know its
// type.
return true;
}
}
}
return false;
--- 1060,1095 ----
void LIR_OpJavaCall::emit_code(LIR_Assembler* masm) {
masm->emit_call(this);
}
! bool LIR_OpJavaCall::maybe_return_as_fields(ciValueKlass** vk_ret) const {
if (ValueTypeReturnedAsFields) {
if (method()->signature()->returns_never_null()) {
ciType* return_type = method()->return_type();
if (return_type->is_valuetype()) {
ciValueKlass* vk = return_type->as_value_klass();
if (vk->can_be_returned_as_fields()) {
+ if (vk_ret != NULL) {
+ *vk_ret = vk;
+ }
return true;
}
}
} else if (is_method_handle_invoke()) {
BasicType bt = method()->return_type()->basic_type();
if (bt == T_OBJECT || bt == T_VALUETYPE) {
// A value type might be returned from the call but we don't know its
+ // type. Either we get a buffered value (and nothing needs to be done)
+ // or one of the values being returned is the klass of the value type
+ // (RAX on x64, with LSB set to 1) and we need to allocate a value
+ // type instance of that type and initialize it with other values being
+ // returned (in other registers).
// type.
+ if (vk_ret != NULL) {
+ *vk_ret = NULL;
+ }
return true;
}
}
}
return false;
< prev index next >