1 %default { "isrange":"0", "routine":"NoRange" } 2 %verify "executed" 3 %verify "unknown method" 4 /* 5 * Handle an optimized "super" method call. 6 * 7 * for: [opt] invoke-super-quick, invoke-super-quick/range 8 */ 9 /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */ 10 /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */ 11 movl rSELF,%ecx 12 movzwl 4(rPC),%eax # eax<- GFED or CCCC 13 movl offThread_method(%ecx),%ecx # ecx<- current method 14 .if (!$isrange) 15 andl $$0xf,%eax # eax<- D (or stays CCCC) 16 .endif 17 movl offMethod_clazz(%ecx),%ecx # ecx<- method->clazz 18 GET_VREG_R %eax %eax # eax<- "this" 19 movl offClassObject_super(%ecx),%ecx # ecx<- method->clazz->super 20 testl %eax,%eax # null "this"? 21 je common_errNullObject # "this" is null, throw exception 22 movl %eax, TMP_SPILL1(%ebp) 23 movzwl 2(rPC),%eax # eax<- BBBB 24 movl offClassObject_vtable(%ecx),%ecx # ecx<- vtable 25 EXPORT_PC 26 movl (%ecx,%eax,4),%eax # eax<- super->vtable[BBBB] 27 movl TMP_SPILL1(%ebp), %ecx 28 jmp common_invokeMethod${routine} 29