< prev index next >

src/share/vm/opto/callGenerator.cpp

Print this page

        

*** 865,885 **** Node* cast_obj = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type)); kit.set_argument(0, cast_obj); } } // Cast reference arguments to its type. ! for (int i = 0; i < signature->count(); i++) { ciType* t = signature->type_at(i); if (t->is_klass()) { ! Node* arg = kit.argument(receiver_skip + i); 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 + i, cast_obj); } } } // Try to get the most accurate receiver type const bool is_virtual = (iid == vmIntrinsics::_linkToVirtual); const bool is_virtual_or_interface = (is_virtual || iid == vmIntrinsics::_linkToInterface); --- 865,886 ---- Node* cast_obj = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type)); kit.set_argument(0, cast_obj); } } // 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); const bool is_virtual_or_interface = (is_virtual || iid == vmIntrinsics::_linkToInterface);
< prev index next >