< prev index next >

src/hotspot/share/opto/doCall.cpp

Print this page

        

*** 658,679 **** push(cast_obj); } } } else if (rt == T_VALUETYPE) { assert(ct == T_VALUETYPE, "value type expected but got rt=%s, ct=%s", type2name(rt), type2name(ct)); ! if (rtype == C->env()->___Value_klass()) { const Type* sig_type = TypeOopPtr::make_from_klass(ctype->as_klass()); Node* retnode = pop(); Node* cast = _gvn.transform(new CheckCastPPNode(control(), retnode, sig_type)); ! Node* vt = ValueTypeNode::make(_gvn, merged_memory(), cast); push(vt); } else { ! assert(ctype == C->env()->___Value_klass(), "unexpected value type klass"); Node* retnode = pop(); assert(retnode->is_ValueType(), "inconsistent"); ValueTypeNode* vt = retnode->as_ValueType(); ! Node* alloc = vt->allocate(this); Node* vtptr = _gvn.transform(new ValueTypePtrNode(vt, alloc, C)); push(vtptr); } } else { assert(rt == ct, "unexpected mismatch: rt=%s, ct=%s", type2name(rt), type2name(ct)); --- 658,679 ---- push(cast_obj); } } } else if (rt == T_VALUETYPE) { assert(ct == T_VALUETYPE, "value type expected but got rt=%s, ct=%s", type2name(rt), type2name(ct)); ! if (rtype->is__Value()) { const Type* sig_type = TypeOopPtr::make_from_klass(ctype->as_klass()); Node* retnode = pop(); Node* cast = _gvn.transform(new CheckCastPPNode(control(), retnode, sig_type)); ! Node* vt = ValueTypeNode::make(this, cast); push(vt); } else { ! assert(ctype->is__Value(), "unexpected value type klass"); Node* retnode = pop(); assert(retnode->is_ValueType(), "inconsistent"); ValueTypeNode* vt = retnode->as_ValueType(); ! Node* alloc = vt->allocate(this)->get_oop(); Node* vtptr = _gvn.transform(new ValueTypePtrNode(vt, alloc, C)); push(vtptr); } } else { assert(rt == ct, "unexpected mismatch: rt=%s, ct=%s", type2name(rt), type2name(ct));
< prev index next >