%def invoke_polymorphic(helper="UndefinedInvokeHandler"): | |
/* | |
* invoke-polymorphic handler wrapper. | |
*/ | |
/* op {vC, vD, vE, vF, vG}, meth@BBBB, proto@HHHH */ | |
/* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB, proto@HHHH */ | |
.extern $helper | |
EXPORT_PC | |
movl rSELF, %ecx | |
movl %ecx, OUT_ARG0(%esp) | |
leal OFF_FP_SHADOWFRAME(rFP), %eax | |
movl %eax, OUT_ARG1(%esp) | |
movl rPC, OUT_ARG2(%esp) | |
REFRESH_INST ${opnum} | |
movl rINST, OUT_ARG3(%esp) | |
call SYMBOL($helper) | |
testb %al, %al | |
jz MterpException | |
ADVANCE_PC 4 | |
call SYMBOL(MterpShouldSwitchInterpreters) | |
testb %al, %al | |
jnz MterpFallback | |
RESTORE_IBASE | |
FETCH_INST | |
GOTO_NEXT |