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