653 const TypeOopPtr* arg_type = TypeOopPtr::make_from_klass(rtype->as_klass());
654 const Type* sig_type = TypeOopPtr::make_from_klass(ctype->as_klass());
655 if (arg_type != NULL && !arg_type->higher_equal(sig_type)) {
656 Node* retnode = pop();
657 Node* cast_obj = _gvn.transform(new CheckCastPPNode(control(), retnode, sig_type));
658 push(cast_obj);
659 }
660 }
661 } else if (rt == T_VALUETYPE) {
662 assert(ct == T_VALUETYPE, "value type expected but got rt=%s, ct=%s", type2name(rt), type2name(ct));
663 if (rtype == C->env()->___Value_klass()) {
664 const Type* sig_type = TypeOopPtr::make_from_klass(ctype->as_klass());
665 Node* retnode = pop();
666 Node* cast = _gvn.transform(new CheckCastPPNode(control(), retnode, sig_type));
667 Node* vt = ValueTypeNode::make(_gvn, merged_memory(), cast);
668 push(vt);
669 } else {
670 assert(ctype == C->env()->___Value_klass(), "unexpected value type klass");
671 Node* retnode = pop();
672 assert(retnode->is_ValueType(), "inconsistent");
673 retnode = retnode->as_ValueType()->store_to_memory(this);
674 push(retnode);
675 }
676 } else {
677 assert(rt == ct, "unexpected mismatch: rt=%s, ct=%s", type2name(rt), type2name(ct));
678 // push a zero; it's better than getting an oop/int mismatch
679 pop_node(rt);
680 Node* retnode = zerocon(ct);
681 push_node(ct, retnode);
682 }
683 // Now that the value is well-behaved, continue with the call-site type.
684 rtype = ctype;
685 }
686 } else {
687 // Symbolic resolution enforces the types to be the same.
688 // NOTE: We must relax the assert for unloaded types because two
689 // different ciType instances of the same unloaded class type
690 // can appear to be "loaded" by different loaders (depending on
691 // the accessing class).
692 assert(!rtype->is_loaded() || !ctype->is_loaded() || rtype == ctype,
693 "mismatched return types: rtype=%s, ctype=%s", rtype->name(), ctype->name());
|
653 const TypeOopPtr* arg_type = TypeOopPtr::make_from_klass(rtype->as_klass());
654 const Type* sig_type = TypeOopPtr::make_from_klass(ctype->as_klass());
655 if (arg_type != NULL && !arg_type->higher_equal(sig_type)) {
656 Node* retnode = pop();
657 Node* cast_obj = _gvn.transform(new CheckCastPPNode(control(), retnode, sig_type));
658 push(cast_obj);
659 }
660 }
661 } else if (rt == T_VALUETYPE) {
662 assert(ct == T_VALUETYPE, "value type expected but got rt=%s, ct=%s", type2name(rt), type2name(ct));
663 if (rtype == C->env()->___Value_klass()) {
664 const Type* sig_type = TypeOopPtr::make_from_klass(ctype->as_klass());
665 Node* retnode = pop();
666 Node* cast = _gvn.transform(new CheckCastPPNode(control(), retnode, sig_type));
667 Node* vt = ValueTypeNode::make(_gvn, merged_memory(), cast);
668 push(vt);
669 } else {
670 assert(ctype == C->env()->___Value_klass(), "unexpected value type klass");
671 Node* retnode = pop();
672 assert(retnode->is_ValueType(), "inconsistent");
673 retnode = retnode->as_ValueType()->allocate(this);
674 push(retnode);
675 }
676 } else {
677 assert(rt == ct, "unexpected mismatch: rt=%s, ct=%s", type2name(rt), type2name(ct));
678 // push a zero; it's better than getting an oop/int mismatch
679 pop_node(rt);
680 Node* retnode = zerocon(ct);
681 push_node(ct, retnode);
682 }
683 // Now that the value is well-behaved, continue with the call-site type.
684 rtype = ctype;
685 }
686 } else {
687 // Symbolic resolution enforces the types to be the same.
688 // NOTE: We must relax the assert for unloaded types because two
689 // different ciType instances of the same unloaded class type
690 // can appear to be "loaded" by different loaders (depending on
691 // the accessing class).
692 assert(!rtype->is_loaded() || !ctype->is_loaded() || rtype == ctype,
693 "mismatched return types: rtype=%s, ctype=%s", rtype->name(), ctype->name());
|