< prev index next >
src/share/vm/opto/callGenerator.cpp
Print this page
*** 894,907 ****
const Type* arg_type = arg->bottom_type();
const Type* sig_type = TypeOopPtr::make_from_klass(t->as_klass());
if (t->is_valuetype()) {
assert(!(arg_type->isa_valuetype() && t == kit.C->env()->___Value_klass()), "need a pointer to the value type");
if (arg_type->isa_valuetypeptr() && t != kit.C->env()->___Value_klass()) {
- const Type* sig_type = TypeOopPtr::make_from_klass(t->as_klass());
Node* cast = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type));
Node* vt = ValueTypeNode::make(gvn, kit.merged_memory(), cast);
kit.set_argument(arg_nb, vt);
}
} else {
if (arg_type->isa_oopptr() && !arg_type->higher_equal(sig_type)) {
Node* cast_obj = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type));
kit.set_argument(arg_nb, cast_obj);
--- 894,908 ----
const Type* arg_type = arg->bottom_type();
const Type* sig_type = TypeOopPtr::make_from_klass(t->as_klass());
if (t->is_valuetype()) {
assert(!(arg_type->isa_valuetype() && t == kit.C->env()->___Value_klass()), "need a pointer to the value type");
if (arg_type->isa_valuetypeptr() && t != kit.C->env()->___Value_klass()) {
Node* cast = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type));
Node* vt = ValueTypeNode::make(gvn, kit.merged_memory(), cast);
kit.set_argument(arg_nb, vt);
+ } else {
+ assert(t == kit.C->env()->___Value_klass() || arg->is_ValueType(), "inconsistent argument");
}
} else {
if (arg_type->isa_oopptr() && !arg_type->higher_equal(sig_type)) {
Node* cast_obj = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type));
kit.set_argument(arg_nb, cast_obj);
< prev index next >