4047 }
4048 } else {
4049 print_inlining(target, "not static or statically bindable", /*success*/ false);
4050 }
4051 } else {
4052 print_inlining(callee, "receiver not constant", /*success*/ false);
4053 }
4054 }
4055 break;
4056
4057 case vmIntrinsics::_linkToVirtual:
4058 case vmIntrinsics::_linkToStatic:
4059 case vmIntrinsics::_linkToSpecial:
4060 case vmIntrinsics::_linkToInterface:
4061 {
4062 // pop MemberName argument
4063 const int args_base = state()->stack_size() - callee->arg_size();
4064 ValueType* type = apop()->type();
4065 if (type->is_constant()) {
4066 ciMethod* target = type->as_ObjectType()->constant_value()->as_member_name()->get_vmtarget();
4067 // If the target is another method handle invoke try recursivly to get
4068 // a better target.
4069 if (target->is_method_handle_intrinsic()) {
4070 if (try_method_handle_inline(target)) {
4071 return true;
4072 }
4073 } else {
4074 ciSignature* signature = target->signature();
4075 const int receiver_skip = target->is_static() ? 0 : 1;
4076 // Cast receiver to its type.
4077 if (!target->is_static()) {
4078 ciKlass* tk = signature->accessing_klass();
4079 Value obj = state()->stack_at(args_base);
4080 if (obj->exact_type() == NULL &&
4081 obj->declared_type() != tk && tk != compilation()->env()->Object_klass()) {
4082 TypeCast* c = new TypeCast(tk, obj, state_before);
4083 append(c);
4084 state()->stack_at_put(args_base, c);
4085 }
4086 }
4087 // Cast reference arguments to its type.
|
4047 }
4048 } else {
4049 print_inlining(target, "not static or statically bindable", /*success*/ false);
4050 }
4051 } else {
4052 print_inlining(callee, "receiver not constant", /*success*/ false);
4053 }
4054 }
4055 break;
4056
4057 case vmIntrinsics::_linkToVirtual:
4058 case vmIntrinsics::_linkToStatic:
4059 case vmIntrinsics::_linkToSpecial:
4060 case vmIntrinsics::_linkToInterface:
4061 {
4062 // pop MemberName argument
4063 const int args_base = state()->stack_size() - callee->arg_size();
4064 ValueType* type = apop()->type();
4065 if (type->is_constant()) {
4066 ciMethod* target = type->as_ObjectType()->constant_value()->as_member_name()->get_vmtarget();
4067 // If the target is another method handle invoke, try to recursively get
4068 // a better target.
4069 if (target->is_method_handle_intrinsic()) {
4070 if (try_method_handle_inline(target)) {
4071 return true;
4072 }
4073 } else {
4074 ciSignature* signature = target->signature();
4075 const int receiver_skip = target->is_static() ? 0 : 1;
4076 // Cast receiver to its type.
4077 if (!target->is_static()) {
4078 ciKlass* tk = signature->accessing_klass();
4079 Value obj = state()->stack_at(args_base);
4080 if (obj->exact_type() == NULL &&
4081 obj->declared_type() != tk && tk != compilation()->env()->Object_klass()) {
4082 TypeCast* c = new TypeCast(tk, obj, state_before);
4083 append(c);
4084 state()->stack_at_put(args_base, c);
4085 }
4086 }
4087 // Cast reference arguments to its type.
|