HANDLE_OPCODE(OP_NEW_INSTANCE)1 HANDLE_OPCODE(OP_NEW_INSTANCE /*vAA, class@BBBB*/)
2 {
3 ClassObject* clazz;
4 Object* newObj;
5
6 EXPORT_PC();
7
8 vdst = INST_AA(inst);
9 ref = FETCH(1);
10 ILOGV("|new-instance v%d,class@0x%04x", vdst, ref);
11 clazz = dvmDexGetResolvedClass(methodClassDex, ref);
12 if (clazz == NULL) {
13 clazz = dvmResolveClass(curMethod->clazz, ref, false);
14 if (clazz == NULL)
15 GOTO_exceptionThrown();
16 }
17
18 if (!dvmIsClassInitialized(clazz) && !dvmInitClass(clazz))
19 GOTO_exceptionThrown();
20
21 #if defined(WITH_JIT)
22 /*
23 * The JIT needs dvmDexGetResolvedClass() to return non-null.
24 * Since we use the portable interpreter to build the trace, this extra
25 * check is not needed for mterp.
26 */
27 if ((self->interpBreak.ctl.subMode & kSubModeJitTraceBuild) &&
28 (!dvmDexGetResolvedClass(methodClassDex, ref))) {
29 /* Class initialization is still ongoing - end the trace */
30 dvmJitEndTraceSelect(self,pc);
31 }
32 #endif
33
34 /*
35 * Verifier now tests for interface/abstract class.
36 */
37 //if (dvmIsInterfaceClass(clazz) || dvmIsAbstractClass(clazz)) {
38 // dvmThrowExceptionWithClassMessage(gDvm.exInstantiationError,
39 // clazz->descriptor);
40 // GOTO_exceptionThrown();
41 //}
42 newObj = dvmAllocObject(clazz, ALLOC_DONT_TRACK);
43 if (newObj == NULL)
44 GOTO_exceptionThrown();
45 SET_REGISTER(vdst, (u4) newObj);
46 }
47 FINISH(2);
48 OP_END
49