13599cdd1b4e72f4cb047fc31bf7c579764fa93d2Elliott Hughes%default { "cccc":"2" } 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "executed" 36af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden%verify "finalizable class" 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 56af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden * Invoke Object.<init> on an object. In practice we know that 66af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden * Object's nullary constructor doesn't do anything, so we just 79a3147c7412f4794434b4c2604aa2ba784867774buzbee * skip it unless a debugger is active. 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 924bd4c50bb3ea13be4f049710967961f0546fb2cAndy McFadden FETCH(r1, ${cccc}) @ r1<- CCCC 106af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden GET_VREG(r0, r1) @ r0<- "this" ptr 116af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden cmp r0, #0 @ check for NULL 126af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden beq common_errNullObject @ export PC and throw NPE 136af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden ldr r1, [r0, #offObject_clazz] @ r1<- obj->clazz 146af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden ldr r2, [r1, #offClassObject_accessFlags] @ r2<- clazz->accessFlags 156af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden tst r2, #CLASS_ISFINALIZABLE @ is this class finalizable? 169a3147c7412f4794434b4c2604aa2ba784867774buzbee bne .L${opcode}_setFinal @ yes, go 179a3147c7412f4794434b4c2604aa2ba784867774buzbee.L${opcode}_finish: 18389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee ldrh r1, [rSELF, #offThread_subMode] 199a3147c7412f4794434b4c2604aa2ba784867774buzbee ands r1, #kSubModeDebuggerActive @ debugger active? 209a3147c7412f4794434b4c2604aa2ba784867774buzbee bne .L${opcode}_debugger @ Yes - skip optimization 219a3147c7412f4794434b4c2604aa2ba784867774buzbee FETCH_ADVANCE_INST(${cccc}+1) @ advance to next instr, load rINST 229a3147c7412f4794434b4c2604aa2ba784867774buzbee GET_INST_OPCODE(ip) @ ip<- opcode from rINST 239a3147c7412f4794434b4c2604aa2ba784867774buzbee GOTO_OPCODE(ip) @ execute it 249a3147c7412f4794434b4c2604aa2ba784867774buzbee%break 259a3147c7412f4794434b4c2604aa2ba784867774buzbee 269a3147c7412f4794434b4c2604aa2ba784867774buzbee.L${opcode}_setFinal: 273475f9cdb47a6d6f8ad2ce49bbc3af46bca92f09Carl Shapiro EXPORT_PC() @ can throw 286af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden bl dvmSetFinalizable @ call dvmSetFinalizable(obj) 298cd640b8327e2591c8dd8a69093fa1fc6c901c05Andy McFadden ldr r0, [rSELF, #offThread_exception] @ r0<- self->exception 308cd640b8327e2591c8dd8a69093fa1fc6c901c05Andy McFadden cmp r0, #0 @ exception pending? 318cd640b8327e2591c8dd8a69093fa1fc6c901c05Andy McFadden bne common_exceptionThrown @ yes, handle it 329a3147c7412f4794434b4c2604aa2ba784867774buzbee b .L${opcode}_finish 339a3147c7412f4794434b4c2604aa2ba784867774buzbee 349a3147c7412f4794434b4c2604aa2ba784867774buzbee /* 359a3147c7412f4794434b4c2604aa2ba784867774buzbee * A debugger is attached, so we need to go ahead and do 369a3147c7412f4794434b4c2604aa2ba784867774buzbee * this. For simplicity, we'll just jump directly to the 379a3147c7412f4794434b4c2604aa2ba784867774buzbee * corresponding handler. Note that we can't use 389a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE here because it may be in single-step mode. 399a3147c7412f4794434b4c2604aa2ba784867774buzbee * Load the primary table base directly. 409a3147c7412f4794434b4c2604aa2ba784867774buzbee */ 419a3147c7412f4794434b4c2604aa2ba784867774buzbee.L${opcode}_debugger: 429a3147c7412f4794434b4c2604aa2ba784867774buzbee ldr r1, [rSELF, #offThread_mainHandlerTable] 439a3147c7412f4794434b4c2604aa2ba784867774buzbee mov ip, #OP_INVOKE_DIRECT_RANGE 449a3147c7412f4794434b4c2604aa2ba784867774buzbee GOTO_OPCODE_BASE(r1,ip) @ execute it 45