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 GET_GLUE(%ecx) 12 movzwl 4(rPC),%eax # eax<- GFED or CCCC 13 movl offGlue_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(%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 movzwl 2(rPC),%eax # eax<- BBBB 23 movl offClassObject_vtable(%ecx),%ecx # ecx<- vtable 24 EXPORT_PC() 25 movl (%ecx,%eax,4),%eax # eax<- super->vtable[BBBB] 26 jmp common_invokeMethod${routine} 27