OP_NEW_INSTANCE.S revision a8b91c52fd8a90b784835dfe1f8898035266c4dd
1%verify "executed"
2%verify "class not resolved"
3%verify "class cannot be resolved"
4%verify "class not initialized"
5%verify "class fails to initialize"
6%verify "class already resolved/initialized"
7%verify "class is abstract or interface"
8%verify "allocation fails"
9    /*
10     * Create a new instance of a class.
11     */
12    # new-instance vAA, class              /* BBBB */
13    LOAD_rSELF_methodClassDex(a3)          #  a3 <- pDvmDex
14    FETCH(a1, 1)                           #  a1 <- BBBB
15    LOAD_base_offDvmDex_pResClasses(a3, a3) #  a3 <- pDvmDex->pResClasses
16    LOAD_eas2(a0, a3, a1)                  #  a0 <- resolved class
17#if defined(WITH_JIT)
18    EAS2(rBIX, a3, a1)                     #  rBIX <- &resolved_class
19#endif
20    EXPORT_PC()                            #  req'd for init, resolve, alloc
21    # already resolved?
22    beqz      a0, .L${opcode}_resolve      #  no, resolve it now
23.L${opcode}_resolved:                      #  a0=class
24    lbu       a1, offClassObject_status(a0) #  a1 <- ClassStatus enum
25    # has class been initialized?
26    li        t0, CLASS_INITIALIZED
27    move      rOBJ, a0                     #  save a0
28    bne       a1, t0, .L${opcode}_needinit #  no, init class now
29
30.L${opcode}_initialized:                   #  a0=class
31    LOAD_base_offClassObject_accessFlags(a3, a0) #  a3 <- clazz->accessFlags
32    li        a1, ALLOC_DONT_TRACK         #  flags for alloc call
33    # a0=class
34    JAL(dvmAllocObject)                    #  v0 <- new object
35    GET_OPA(a3)                            #  a3 <- AA
36#if defined(WITH_JIT)
37    /*
38     * The JIT needs the class to be fully resolved before it can
39     * include this instruction in a trace.
40     */
41    lhu       a1, offThread_subMode(rSELF)
42    beqz      v0, common_exceptionThrown   #  yes, handle the exception
43    and       a1, kSubModeJitTraceBuild    #  under construction?
44    bnez      a1, .L${opcode}_jitCheck
45#else
46    # failed?
47    beqz      v0, common_exceptionThrown   #  yes, handle the exception
48#endif
49    b         .L${opcode}_continue
50
51%break
52
53.L${opcode}_continue:
54    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
55    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
56    SET_VREG(v0, a3)                       #  vAA <- v0
57    GOTO_OPCODE(t0)                        #  jump to next instruction
58
59#if defined(WITH_JIT)
60    /*
61     * Check to see if we need to stop the trace building early.
62     * v0: new object
63     * a3: vAA
64     */
65.L${opcode}_jitCheck:
66    lw        a1, 0(rBIX)                  #  reload resolved class
67    # okay?
68    bnez      a1, .L${opcode}_continue     #  yes, finish
69    move      rOBJ, v0                     #  preserve new object
70    move      rBIX, a3                     #  preserve vAA
71    move      a0, rSELF
72    move      a1, rPC
73    JAL(dvmJitEndTraceSelect)              #  (self, pc)
74    FETCH_ADVANCE_INST(2)                  #  advance rPC, load rINST
75    GET_INST_OPCODE(t0)                    #  extract opcode from rINST
76    SET_VREG(rOBJ, rBIX)                   #  vAA <- new object
77    GOTO_OPCODE(t0)                        #  jump to next instruction
78#endif
79
80    /*
81     * Class initialization required.
82     *
83     *  a0 holds class object
84     */
85.L${opcode}_needinit:
86    JAL(dvmInitClass)                      #  initialize class
87    move      a0, rOBJ                     #  restore a0
88    # check boolean result
89    bnez      v0, .L${opcode}_initialized  #  success, continue
90    b         common_exceptionThrown       #  failed, deal with init exception
91
92
93    /*
94     * Resolution required.  This is the least-likely path.
95     *
96     *  a1 holds BBBB
97     */
98.L${opcode}_resolve:
99    LOAD_rSELF_method(a3)                  #  a3 <- self->method
100    li        a2, 0                        #  a2 <- false
101    LOAD_base_offMethod_clazz(a0, a3)      #  a0 <- method->clazz
102    JAL(dvmResolveClass)                   #  v0 <- resolved ClassObject ptr
103    move      a0, v0
104    # got null?
105    bnez      v0, .L${opcode}_resolved     #  no, continue
106    b         common_exceptionThrown       #  yes, handle exception
107