• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download

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