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