13599cdd1b4e72f4cb047fc31bf7c579764fa93d2Elliott Hughes%default { "cccc":"2" } 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "executed" 30c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen%verify "finalizable class" 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 50c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen * Invoke Object.<init> on an object. In practice we know that 60c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen * Object's nullary constructor doesn't do anything, so we just 70c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen * skip it unless a debugger is active. 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 93599cdd1b4e72f4cb047fc31bf7c579764fa93d2Elliott Hughes movzwl 4(rPC),%eax # eax<- CCCC, offset = 2 * cccc 100c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen GET_VREG_R %ecx, %eax # ecx<- "this" ptr 110c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen testl %ecx,%ecx # null this? 120c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen je common_errNullObject # yes, fail 130c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen movl offObject_clazz(%ecx), %eax # eax<- obj->clazz 140c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen SPILL_TMP1(rIBASE) # save %edx 150c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen movl offClassObject_accessFlags(%eax), %edx # edx<- clazz->accessFlags 160c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen andl $$CLASS_ISFINALIZABLE, %edx # is this class finalizable? 170c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen jnz .L${opcode}_setFinal # yes, go 180c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen.L${opcode}_finish: 190c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen movl rSELF, %ecx 200c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen movl offThread_subMode(%ecx), %eax 210c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen andl $$kSubModeDebuggerActive, %eax # debugger active? 220c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen jnz .L${opcode}_debugger # Yes - skip optimization 230c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen UNSPILL_TMP1(rIBASE) 240c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen FETCH_INST_OPCODE 3 %ecx # 3 = cccc + 1 250c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen ADVANCE_PC 3 260c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen GOTO_NEXT_R %ecx 270c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen%break 280c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen 290c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen.L${opcode}_setFinal: 300c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen EXPORT_PC # can throw 310c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen movl %ecx, OUT_ARG0(%esp) # arg1<- obj 320c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen call dvmSetFinalizable # call dvmSetFinalizable(obj) 330c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen movl rSELF, %ecx 340c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen movl offThread_exception(%ecx), %eax # eax<- self->exception 350c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen cmpl $$0, %eax # exception pending? 360c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen jne common_exceptionThrown # yes, handle it 370c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen jmp .L${opcode}_finish 380c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen 390c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen /* 400c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen * A debugger is attached, so we need to go ahead and do 410c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen * this. For simplicity, we'll just jump directly to the 420c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen * corresponding handler. Note that we can't use 430c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen * rIBASE here because it may be in single-step mode. 440c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen * Load the primary table base directly. 450c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen */ 460c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen.L${opcode}_debugger: 470c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen movl offThread_mainHandlerTable(%ecx), %ecx # load main handler table 480c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen movl $$OP_INVOKE_DIRECT_RANGE, %eax 490c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen /* 500c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen * We can't use GOTO_NEXT here since we want to jump directly to 510c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen * handler without touching rIBASE. 520c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen */ 530c2dc522d0e120f346cf0a40c8cf0c93346131c2Dong-Yuan Chen jmp *(%ecx,%eax,4) 54