comparison src/cpu/x86/vm/methodHandles_x86.cpp @ 6847:65d07d9ee446

8000263: JSR 292: signature types may appear to be unloaded Reviewed-by: kvn, jrose
author twisti
date Mon, 08 Oct 2012 17:04:00 -0700
parents 2cb2f30450c7
children cd3d6a6b95d9
comparison
equal deleted inserted replaced
6846:377508648226 6847:65d07d9ee446
207 Register rdx_argp = rdx; // argument list ptr, live on error paths 207 Register rdx_argp = rdx; // argument list ptr, live on error paths
208 Register rax_temp = rax; 208 Register rax_temp = rax;
209 Register rcx_mh = rcx; // MH receiver; dies quickly and is recycled 209 Register rcx_mh = rcx; // MH receiver; dies quickly and is recycled
210 Register rbx_method = rbx; // eventual target of this invocation 210 Register rbx_method = rbx; // eventual target of this invocation
211 211
212 address code_start = __ pc();
213
214 // here's where control starts out: 212 // here's where control starts out:
215 __ align(CodeEntryAlignment); 213 __ align(CodeEntryAlignment);
216 address entry_point = __ pc(); 214 address entry_point = __ pc();
217 215
218 if (VerifyMethodHandles) { 216 if (VerifyMethodHandles) {
249 DEBUG_ONLY(rdx_argp = noreg); 247 DEBUG_ONLY(rdx_argp = noreg);
250 } 248 }
251 249
252 // rdx_first_arg_addr is live! 250 // rdx_first_arg_addr is live!
253 251
254 if (TraceMethodHandles) { 252 trace_method_handle_interpreter_entry(_masm, iid);
255 const char* name = vmIntrinsics::name_at(iid);
256 if (*name == '_') name += 1;
257 const size_t len = strlen(name) + 50;
258 char* qname = NEW_C_HEAP_ARRAY(char, len, mtInternal);
259 const char* suffix = "";
260 if (vmIntrinsics::method_for(iid) == NULL ||
261 !vmIntrinsics::method_for(iid)->access_flags().is_public()) {
262 if (is_signature_polymorphic_static(iid))
263 suffix = "/static";
264 else
265 suffix = "/private";
266 }
267 jio_snprintf(qname, len, "MethodHandle::interpreter_entry::%s%s", name, suffix);
268 // note: stub look for mh in rcx
269 trace_method_handle(_masm, qname);
270 }
271 253
272 if (iid == vmIntrinsics::_invokeBasic) { 254 if (iid == vmIntrinsics::_invokeBasic) {
273 generate_method_handle_dispatch(_masm, iid, rcx_mh, noreg, not_for_compiler_entry); 255 generate_method_handle_dispatch(_masm, iid, rcx_mh, noreg, not_for_compiler_entry);
274 256
275 } else { 257 } else {
283 Register rbx_member = rbx_method; // MemberName ptr; incoming method ptr is dead now 265 Register rbx_member = rbx_method; // MemberName ptr; incoming method ptr is dead now
284 __ pop(rax_temp); // return address 266 __ pop(rax_temp); // return address
285 __ pop(rbx_member); // extract last argument 267 __ pop(rbx_member); // extract last argument
286 __ push(rax_temp); // re-push return address 268 __ push(rax_temp); // re-push return address
287 generate_method_handle_dispatch(_masm, iid, rcx_recv, rbx_member, not_for_compiler_entry); 269 generate_method_handle_dispatch(_masm, iid, rcx_recv, rbx_member, not_for_compiler_entry);
288 }
289
290 if (PrintMethodHandleStubs) {
291 address code_end = __ pc();
292 tty->print_cr("--------");
293 tty->print_cr("method handle interpreter entry for %s", vmIntrinsics::name_at(iid));
294 Disassembler::decode(code_start, code_end);
295 tty->cr();
296 } 270 }
297 271
298 return entry_point; 272 return entry_point;
299 } 273 }
300 274