comparison src/share/vm/opto/doCall.cpp @ 3852:fdb992d83a87

7071653: JSR 292: call site change notification should be pushed not pulled Reviewed-by: kvn, never, bdelsart
author twisti
date Tue, 16 Aug 2011 04:14:05 -0700
parents aabf25fa3f05
children aa67216400d3
comparison
equal deleted inserted replaced
3851:95134e034042 3852:fdb992d83a87
112 if (allow_inline) { 112 if (allow_inline) {
113 cg = find_intrinsic(call_method, call_is_virtual); 113 cg = find_intrinsic(call_method, call_is_virtual);
114 if (cg != NULL) return cg; 114 if (cg != NULL) return cg;
115 } 115 }
116 116
117 // Do MethodHandle calls. 117 // Do method handle calls.
118 // NOTE: This must happen before normal inlining logic below since 118 // NOTE: This must happen before normal inlining logic below since
119 // MethodHandle.invoke* are native methods which obviously don't 119 // MethodHandle.invoke* are native methods which obviously don't
120 // have bytecodes and so normal inlining fails. 120 // have bytecodes and so normal inlining fails.
121 if (call_method->is_method_handle_invoke()) { 121 if (call_method->is_method_handle_invoke()) {
122 if (bytecode != Bytecodes::_invokedynamic) { 122 if (bytecode != Bytecodes::_invokedynamic) {
125 125
126 CallGenerator* cg = CallGenerator::for_method_handle_inline(n, jvms, caller, call_method, profile); 126 CallGenerator* cg = CallGenerator::for_method_handle_inline(n, jvms, caller, call_method, profile);
127 if (cg != NULL) { 127 if (cg != NULL) {
128 return cg; 128 return cg;
129 } 129 }
130
131 return CallGenerator::for_direct_call(call_method); 130 return CallGenerator::for_direct_call(call_method);
132 } 131 }
133 else { 132 else {
134 // Get the MethodHandle from the CallSite. 133 // Get the CallSite object.
135 ciMethod* caller_method = jvms->method(); 134 ciMethod* caller_method = jvms->method();
136 ciBytecodeStream str(caller_method); 135 ciBytecodeStream str(caller_method);
137 str.force_bci(jvms->bci()); // Set the stream to the invokedynamic bci. 136 str.force_bci(jvms->bci()); // Set the stream to the invokedynamic bci.
138 ciCallSite* call_site = str.get_call_site(); 137 ciCallSite* call_site = str.get_call_site();
139 ciMethodHandle* method_handle = call_site->get_target(); 138
140 139 // Inline constant and mutable call sites. We don't inline
141 // Set the callee to have access to the class and signature in 140 // volatile call sites optimistically since they are specified
142 // the MethodHandleCompiler. 141 // to change their value often and that would result in a lot of
143 method_handle->set_callee(call_method); 142 // deoptimizations and recompiles.
144 method_handle->set_caller(caller); 143 if (call_site->is_constant_call_site() || call_site->is_mutable_call_site()) {
145 method_handle->set_call_profile(profile); 144 CallGenerator* cg = CallGenerator::for_invokedynamic_inline(call_site, jvms, caller, call_method, profile);
146 145 if (cg != NULL) {
147 // Get an adapter for the MethodHandle. 146 return cg;
148 ciMethod* target_method = method_handle->get_invokedynamic_adapter();
149 if (target_method != NULL) {
150 CallGenerator* hit_cg = this->call_generator(target_method, vtable_index, false, jvms, true, prof_factor);
151 if (hit_cg != NULL && hit_cg->is_inline()) {
152 CallGenerator* miss_cg = CallGenerator::for_dynamic_call(call_method);
153 return CallGenerator::for_predicted_dynamic_call(method_handle, miss_cg, hit_cg, prof_factor);
154 } 147 }
155 } 148 }
156
157 // If something failed, generate a normal dynamic call. 149 // If something failed, generate a normal dynamic call.
158 return CallGenerator::for_dynamic_call(call_method); 150 return CallGenerator::for_dynamic_call(call_method);
159 } 151 }
160 } 152 }
161 153