< prev index next >

src/share/vm/opto/type.cpp

Print this page

        

*** 1926,1975 **** field_array[pos++] = Type::HALF; } } } - // Can a value type instance of this type be returned as multiple - // returned values? - static bool vt_can_be_returned_as_fields(ciValueKlass* vk) { - if (vk == ciEnv::current()->___Value_klass()) { - return false; - } - - ResourceMark rm; - uint args = vk->value_arg_slots() + 1 /* return vk as well */; - - BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, args); - VMRegPair* regs = NEW_RESOURCE_ARRAY(VMRegPair, args); - - sig_bt[0] = T_METADATA; - for (uint i = 0, j = 1; i < (uint)vk->nof_nonstatic_fields(); i++) { - BasicType bt = vk->nonstatic_field_at(i)->layout_type(); - assert(i+j < args, "out of bounds access"); - sig_bt[i+j] = bt; - if (bt == T_LONG || bt == T_DOUBLE) { - j++; - assert(i+j < args, "out of bounds access"); - sig_bt[i+j] = T_VOID; - } - } - - if (SharedRuntime::java_return_convention(sig_bt, regs, args) <= 0) { - return false; - } - - return true; - } - - //------------------------------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(); uint arg_cnt = 0; if (ret_vt_fields) { ! ret_vt_fields = return_type->is_valuetype() && vt_can_be_returned_as_fields((ciValueKlass*)return_type); } if (ret_vt_fields) { ciValueKlass* vk = (ciValueKlass*)return_type; arg_cnt = vk->value_arg_slots()+1; } else { --- 1926,1942 ---- field_array[pos++] = Type::HALF; } } } //------------------------------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(); 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) { ciValueKlass* vk = (ciValueKlass*)return_type; arg_cnt = vk->value_arg_slots()+1; } else {
< prev index next >