< prev index next >
src/share/vm/opto/callGenerator.cpp
Print this page
*** 964,980 ****
// Cast reference arguments to its type.
for (int i = 0, j = 0; i < signature->count(); i++) {
ciType* t = signature->type_at(i);
if (t->is_klass()) {
Node* arg = kit.argument(receiver_skip + j);
! const TypeOopPtr* arg_type = arg->bottom_type()->isa_oopptr();
const Type* sig_type = TypeOopPtr::make_from_klass(t->as_klass());
! if (arg_type != NULL && !arg_type->higher_equal(sig_type)) {
Node* cast_obj = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type));
kit.set_argument(receiver_skip + j, cast_obj);
}
}
j += t->size(); // long and double take two slots
}
// Try to get the most accurate receiver type
const bool is_virtual = (iid == vmIntrinsics::_linkToVirtual);
--- 964,993 ----
// Cast reference arguments to its type.
for (int i = 0, j = 0; i < signature->count(); i++) {
ciType* t = signature->type_at(i);
if (t->is_klass()) {
Node* arg = kit.argument(receiver_skip + j);
! const Type* arg_type = arg->bottom_type()->isa_ptr();
const Type* sig_type = TypeOopPtr::make_from_klass(t->as_klass());
! if (t->is_valuetype()) {
! if (arg_type->isa_valuetype() && t == kit.C->env()->___Value_klass()) {
! assert(arg->is_ValueType(), "inconsistent");
! Node* vt = arg->as_ValueType()->store_to_memory(&kit);
! kit.set_argument(receiver_skip + j, vt);
! } else 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(receiver_skip + j, 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(receiver_skip + j, cast_obj);
}
}
+ }
j += t->size(); // long and double take two slots
}
// Try to get the most accurate receiver type
const bool is_virtual = (iid == vmIntrinsics::_linkToVirtual);
< prev index next >