648 // Nothing. These cases are handled in lambda form bytecode.
649 assert(ct == T_INT || is_subword_type(ct), "must match: rt=%s, ct=%s", type2name(rt), type2name(ct));
650 } else if (rt == T_OBJECT || rt == T_ARRAY) {
651 assert(ct == T_OBJECT || ct == T_ARRAY, "rt=%s, ct=%s", type2name(rt), type2name(ct));
652 if (ctype->is_loaded()) {
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->is__Value()) {
664 const Type* sig_type = TypeOopPtr::make_from_klass(ctype->as_klass());
665 sig_type = sig_type->join_speculative(TypePtr::NOTNULL);
666 Node* retnode = pop();
667 Node* cast = _gvn.transform(new CheckCastPPNode(control(), retnode, sig_type));
668 ValueTypeNode* vt = ValueTypeNode::make_from_oop(this, cast);
669 push(vt);
670 } else {
671 assert(ctype->is__Value(), "unexpected value type klass");
672 ValueTypeNode* vt = pop()->as_ValueType();
673 vt = vt->allocate(this)->as_ValueType();
674 Node* vtptr = ValueTypePtrNode::make_from_value_type(_gvn, vt);
675 push(vtptr);
676 }
677 } else {
678 assert(rt == ct, "unexpected mismatch: rt=%s, ct=%s", type2name(rt), type2name(ct));
679 // push a zero; it's better than getting an oop/int mismatch
680 pop_node(rt);
681 Node* retnode = zerocon(ct);
682 push_node(ct, retnode);
683 }
684 // Now that the value is well-behaved, continue with the call-site type.
685 rtype = ctype;
686 }
687 } else {
688 // Symbolic resolution enforces the types to be the same.
|
648 // Nothing. These cases are handled in lambda form bytecode.
649 assert(ct == T_INT || is_subword_type(ct), "must match: rt=%s, ct=%s", type2name(rt), type2name(ct));
650 } else if (rt == T_OBJECT || rt == T_ARRAY) {
651 assert(ct == T_OBJECT || ct == T_ARRAY, "rt=%s, ct=%s", type2name(rt), type2name(ct));
652 if (ctype->is_loaded()) {
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->is__Value()) {
664 const Type* sig_type = TypeOopPtr::make_from_klass(ctype->as_klass());
665 sig_type = sig_type->join_speculative(TypePtr::NOTNULL);
666 Node* retnode = pop();
667 Node* cast = _gvn.transform(new CheckCastPPNode(control(), retnode, sig_type));
668 ValueTypeNode* vt = ValueTypeNode::make_from_oop(this, cast, ctype->as_value_klass());
669 push(vt);
670 } else {
671 assert(ctype->is__Value(), "unexpected value type klass");
672 ValueTypeNode* vt = pop()->as_ValueType();
673 vt = vt->allocate(this)->as_ValueType();
674 Node* vtptr = ValueTypePtrNode::make_from_value_type(_gvn, vt);
675 push(vtptr);
676 }
677 } else {
678 assert(rt == ct, "unexpected mismatch: rt=%s, ct=%s", type2name(rt), type2name(ct));
679 // push a zero; it's better than getting an oop/int mismatch
680 pop_node(rt);
681 Node* retnode = zerocon(ct);
682 push_node(ct, retnode);
683 }
684 // Now that the value is well-behaved, continue with the call-site type.
685 rtype = ctype;
686 }
687 } else {
688 // Symbolic resolution enforces the types to be the same.
|