UserClass* JnjvmClassLoader::internalLoad(const UTF8* name, bool doResolve, JavaString* strName) { llvm_gcroot(strName, 0); UserCommonClass* cl = lookupClass(name); if (!cl) { cl = internalLoadCreateClass(name, strName); } if (cl && doResolve && cl->isClass()) { cl->asClass()->resolveClass(); } return (UserClass*)cl; }
extern "C" void* j3InterfaceLookup(UserClass* caller, uint32 index) { void* res = 0; UserConstantPool* ctpInfo = caller->getConstantPool(); if (ctpInfo->ctpRes[index]) { res = ctpInfo->ctpRes[index]; } else { UserCommonClass* cl = 0; const UTF8* utf8 = 0; Signdef* sign = 0; ctpInfo->resolveMethod(index, cl, utf8, sign); assert(cl->isClass() && isInterface(cl->access) && "Wrong type of method"); res = cl->asClass()->lookupInterfaceMethod(utf8, sign->keyName); ctpInfo->ctpRes[index] = (void*)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; }
UserClass* JnjvmClassLoader::internalLoad(const UTF8* name, bool doResolve, JavaString* strName) { JavaObject* obj = 0; llvm_gcroot(strName, 0); llvm_gcroot(obj, 0); UserCommonClass* cl = lookupClass(name); if (!cl) { UserClass* forCtp = loadClass; if (strName == NULL) { strName = JavaString::internalToJava(name, isolate); } obj = loadClassMethod->invokeJavaObjectVirtual(isolate, forCtp, javaLoader, &strName); cl = JavaObjectClass::getClass(((JavaObjectClass*)obj)); } if (cl && doResolve && cl->isClass()) { cl->asClass()->resolveClass(); } return (UserClass*)cl; }