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