Mercurial > hg > truffle
comparison src/cpu/x86/vm/methodHandles_x86.cpp @ 3781:d83ac25d0304
7055355: JSR 292: crash while throwing WrongMethodTypeException
Reviewed-by: jrose, twisti, bdelsart
author | never |
---|---|
date | Thu, 16 Jun 2011 13:46:55 -0700 |
parents | f8c9417e3571 |
children | 341a57af9b0a |
comparison
equal
deleted
inserted
replaced
3759:cfcf2ba8f3eb | 3781:d83ac25d0304 |
---|---|
600 | 600 |
601 __ jump_to_method_handle_entry(rcx_recv, rdi_temp); | 601 __ jump_to_method_handle_entry(rcx_recv, rdi_temp); |
602 | 602 |
603 // error path for invokeExact (only) | 603 // error path for invokeExact (only) |
604 __ bind(invoke_exact_error_path); | 604 __ bind(invoke_exact_error_path); |
605 // jump(ExternalAddress(Interpreter::throw_WrongMethodType_entry())); | 605 // Stub wants expected type in rax and the actual type in rcx |
606 Register rdx_last_Java_sp = rdx_temp; | 606 __ jump(ExternalAddress(StubRoutines::throw_WrongMethodTypeException_entry())); |
607 __ lea(rdx_last_Java_sp, __ argument_address(constant(0))); | |
608 __ super_call_VM(noreg, | |
609 rdx_last_Java_sp, | |
610 CAST_FROM_FN_PTR(address, | |
611 InterpreterRuntime::throw_WrongMethodTypeException), | |
612 // pass required type, then failing mh object | |
613 rax_mtype, rcx_recv); | |
614 | 607 |
615 // for invokeGeneric (only), apply argument and result conversions on the fly | 608 // for invokeGeneric (only), apply argument and result conversions on the fly |
616 __ bind(invoke_generic_slow_path); | 609 __ bind(invoke_generic_slow_path); |
617 #ifdef ASSERT | 610 #ifdef ASSERT |
618 if (VerifyMethodHandles) { | 611 if (VerifyMethodHandles) { |
1173 const Register rdi_pc = rax; | 1166 const Register rdi_pc = rax; |
1174 __ pop(rdi_pc); // caller PC | 1167 __ pop(rdi_pc); // caller PC |
1175 __ mov(rsp, saved_last_sp); // cut the stack back to where the caller started | 1168 __ mov(rsp, saved_last_sp); // cut the stack back to where the caller started |
1176 | 1169 |
1177 Register rbx_method = rbx_temp; | 1170 Register rbx_method = rbx_temp; |
1178 Label L_no_method; | |
1179 // FIXME: fill in _raise_exception_method with a suitable java.lang.invoke method | |
1180 __ movptr(rbx_method, ExternalAddress((address) &_raise_exception_method)); | 1171 __ movptr(rbx_method, ExternalAddress((address) &_raise_exception_method)); |
1181 __ testptr(rbx_method, rbx_method); | |
1182 __ jccb(Assembler::zero, L_no_method); | |
1183 | 1172 |
1184 const int jobject_oop_offset = 0; | 1173 const int jobject_oop_offset = 0; |
1185 __ movptr(rbx_method, Address(rbx_method, jobject_oop_offset)); // dereference the jobject | 1174 __ movptr(rbx_method, Address(rbx_method, jobject_oop_offset)); // dereference the jobject |
1186 __ testptr(rbx_method, rbx_method); | |
1187 __ jccb(Assembler::zero, L_no_method); | |
1188 __ verify_oop(rbx_method); | 1175 __ verify_oop(rbx_method); |
1189 | 1176 |
1190 NOT_LP64(__ push(rarg2_required)); | 1177 NOT_LP64(__ push(rarg2_required)); |
1191 __ push(rdi_pc); // restore caller PC | 1178 __ push(rdi_pc); // restore caller PC |
1192 __ jmp(rbx_method_fce); // jump to compiled entry | 1179 __ jmp(rbx_method_fce); // jump to compiled entry |
1193 | |
1194 // Do something that is at least causes a valid throw from the interpreter. | |
1195 __ bind(L_no_method); | |
1196 __ push(rarg2_required); | |
1197 __ push(rarg1_actual); | |
1198 __ jump(ExternalAddress(Interpreter::throw_WrongMethodType_entry())); | |
1199 } | 1180 } |
1200 break; | 1181 break; |
1201 | 1182 |
1202 case _invokestatic_mh: | 1183 case _invokestatic_mh: |
1203 case _invokespecial_mh: | 1184 case _invokespecial_mh: |