< prev index next >
src/hotspot/share/opto/type.cpp
Print this page
*** 1934,1949 ****
}
}
//------------------------------make-------------------------------------------
// Make a TypeTuple from the range of a method signature
! const TypeTuple *TypeTuple::make_range(ciSignature* sig, bool ret_vt_fields) {
ciType* return_type = sig->return_type();
! return make_range(return_type, ret_vt_fields);
}
! const TypeTuple *TypeTuple::make_range(ciType* return_type, bool ret_vt_fields) {
uint arg_cnt = 0;
if (ret_vt_fields) {
ret_vt_fields = return_type->is_valuetype() && ((ciValueKlass*)return_type)->can_be_returned_as_fields();
}
if (ret_vt_fields) {
--- 1934,1950 ----
}
}
//------------------------------make-------------------------------------------
// Make a TypeTuple from the range of a method signature
! const TypeTuple *TypeTuple::make_range(ciMethod* method, bool ret_vt_fields) {
! ciSignature* sig = method->signature();
ciType* return_type = sig->return_type();
! return make_range(method, return_type, ret_vt_fields);
}
! const TypeTuple *TypeTuple::make_range(ciMethod* method, ciType* return_type, bool ret_vt_fields) {
uint arg_cnt = 0;
if (ret_vt_fields) {
ret_vt_fields = return_type->is_valuetype() && ((ciValueKlass*)return_type)->can_be_returned_as_fields();
}
if (ret_vt_fields) {
*** 1979,1992 ****
uint pos = TypeFunc::Parms;
field_array[pos] = TypePtr::BOTTOM;
pos++;
collect_value_fields(vk, field_array, pos);
} else {
! // Value type returns cannot be NULL
! //field_array[TypeFunc::Parms] = get_const_type(return_type)->join_speculative(TypePtr::NOTNULL);
field_array[TypeFunc::Parms] = get_const_type(return_type);
}
break;
case T_VOID:
break;
default:
ShouldNotReachHere();
--- 1980,1999 ----
uint pos = TypeFunc::Parms;
field_array[pos] = TypePtr::BOTTOM;
pos++;
collect_value_fields(vk, field_array, pos);
} else {
! if (method->get_Method()->is_returning_vt()) {
! // A NULL ValueType cannot be returned to compiled code. The 'areturn' bytecode
! // handler will deoptimize its caller if it is about to return a NULL ValueType.
! field_array[TypeFunc::Parms] = get_const_type(return_type)->join_speculative(TypePtr::NOTNULL);
! } else {
! // We're calling a legacy class's method that is returning a VT but doesn't know about it, so
! // it won't do the deoptimization at 'areturn'.
field_array[TypeFunc::Parms] = get_const_type(return_type);
}
+ }
break;
case T_VOID:
break;
default:
ShouldNotReachHere();
*** 5609,5620 ****
domain_cc = TypeTuple::make_domain(NULL, method->signature(), ValueTypePassFieldsAsArgs);
} else {
domain_sig = TypeTuple::make_domain(method->holder(), method->signature(), false);
domain_cc = TypeTuple::make_domain(method->holder(), method->signature(), ValueTypePassFieldsAsArgs);
}
! const TypeTuple *range_sig = TypeTuple::make_range(method->signature(), false);
! const TypeTuple *range_cc = TypeTuple::make_range(method->signature(), ValueTypeReturnedAsFields);
tf = TypeFunc::make(domain_sig, domain_cc, range_sig, range_cc);
C->set_last_tf(method, tf); // fill cache
return tf;
}
--- 5616,5627 ----
domain_cc = TypeTuple::make_domain(NULL, method->signature(), ValueTypePassFieldsAsArgs);
} else {
domain_sig = TypeTuple::make_domain(method->holder(), method->signature(), false);
domain_cc = TypeTuple::make_domain(method->holder(), method->signature(), ValueTypePassFieldsAsArgs);
}
! const TypeTuple *range_sig = TypeTuple::make_range(method, false);
! const TypeTuple *range_cc = TypeTuple::make_range(method, ValueTypeReturnedAsFields);
tf = TypeFunc::make(domain_sig, domain_cc, range_sig, range_cc);
C->set_last_tf(method, tf); // fill cache
return tf;
}
< prev index next >