Mercurial > hg > truffle
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 |