%def invoke(helper="UndefinedInvokeHandler"): /* * Generic invoke handler wrapper. */ /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ .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 3 movl rSELF, %eax cmpb LITERAL(0), THREAD_USE_MTERP_OFFSET(%eax) jz MterpFallback RESTORE_IBASE FETCH_INST GOTO_NEXT %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 movl rSELF, %eax cmpb LITERAL(0), THREAD_USE_MTERP_OFFSET(%eax) jz MterpFallback RESTORE_IBASE FETCH_INST GOTO_NEXT %def op_invoke_custom(): % invoke(helper="MterpInvokeCustom") %def op_invoke_custom_range(): % invoke(helper="MterpInvokeCustomRange") %def op_invoke_direct(): % invoke(helper="MterpInvokeDirect") %def op_invoke_direct_range(): % invoke(helper="MterpInvokeDirectRange") %def op_invoke_interface(): % invoke(helper="MterpInvokeInterface") /* * Handle an interface method call. * * for: invoke-interface, invoke-interface/range */ /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ %def op_invoke_interface_range(): % invoke(helper="MterpInvokeInterfaceRange") %def op_invoke_polymorphic(): % invoke_polymorphic(helper="MterpInvokePolymorphic") %def op_invoke_polymorphic_range(): % invoke_polymorphic(helper="MterpInvokePolymorphicRange") %def op_invoke_static(): % invoke(helper="MterpInvokeStatic") %def op_invoke_static_range(): % invoke(helper="MterpInvokeStaticRange") %def op_invoke_super(): % invoke(helper="MterpInvokeSuper") /* * Handle a "super" method call. * * for: invoke-super, invoke-super/range */ /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ %def op_invoke_super_range(): % invoke(helper="MterpInvokeSuperRange") %def op_invoke_virtual(): % invoke(helper="MterpInvokeVirtual") /* * Handle a virtual method call. * * for: invoke-virtual, invoke-virtual/range */ /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ %def op_invoke_virtual_quick(): % invoke(helper="MterpInvokeVirtualQuick") %def op_invoke_virtual_range(): % invoke(helper="MterpInvokeVirtualRange") %def op_invoke_virtual_range_quick(): % invoke(helper="MterpInvokeVirtualQuickRange")