// Throws if the class can not be resolved. extern "C" JavaVirtualTable* j3GetArrayClass(UserClass* caller, uint32 index, JavaVirtualTable** VT) { JavaVirtualTable* res = 0; assert(VT && "Incorrect call to j3GetArrayClass"); UserConstantPool* ctpInfo = caller->getConstantPool(); UserCommonClass* cl = ctpInfo->loadClass(index); JnjvmClassLoader* JCL = cl->classLoader; if (cl->asClass()) cl->asClass()->resolveClass(); const UTF8* arrayName = JCL->constructArrayName(1, cl->getName()); res = JCL->constructArray(arrayName)->virtualVT; *VT = res; return res; }
// Throws if the class is not found. extern "C" void* j3ClassLookup(UserClass* caller, uint32 index) { void* res = 0; UserConstantPool* ctpInfo = caller->getConstantPool(); UserCommonClass* cl = ctpInfo->loadClass(index); // We can not initialize here, because bytecodes such as CHECKCAST // or classes used in catch clauses do not trigger class initialization. // This is really sad, because we need to insert class initialization checks // in the LLVM code. assert(cl && "No cl after class lookup"); res = (void*)cl; // Create the array class, in case we come from a ANEWARRAY. if (cl->isClass() && !cl->virtualVT->baseClassVT) { const UTF8* arrayName = cl->classLoader->constructArrayName(1, cl->getName()); cl->virtualVT->baseClassVT = cl->classLoader->constructArray(arrayName)->virtualVT; } return res; }