UserClassArray* JnjvmClassLoader::constructArray(const UTF8* name) { ClassArray* res = (ClassArray*)lookupClass(name); if (res) return res; UserCommonClass* cl = loadBaseClass(name, 1, name->size - 1); assert(cl && "no base class for an array"); JnjvmClassLoader* ld = cl->classLoader; res = ld->constructArray(name, cl); ensureCached(res); return res; }
// 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; }
UserClassArray* JnjvmClassLoader::constructArray(const UTF8* name) { ClassArray* res = (ClassArray*)lookupClass(name); if (res) return res; UserCommonClass* cl = loadBaseClass(name, 1, name->size - 1); assert(cl && "no base class for an array"); JnjvmClassLoader* ld = cl->classLoader; res = ld->constructArray(name, cl); if (res && res->classLoader != this) { classes->lock.lock(); ClassMap::iterator End = classes->map.end(); ClassMap::iterator I = classes->map.find(res->name); if (I == End) classes->map.insert(std::make_pair(res->name, res)); classes->lock.unlock(); } return res; }
UserCommonClass* JnjvmClassLoader::loadBaseClass(const UTF8* name, uint32 start, uint32 len) { if (name->elements[start] == I_TAB) { UserCommonClass* baseClass = loadBaseClass(name, start + 1, len - 1); JnjvmClassLoader* loader = baseClass->classLoader; const UTF8* arrayName = name->extract(loader->hashUTF8, start, start + len); return loader->constructArray(arrayName, baseClass); } else if (name->elements[start] == I_REF) { const UTF8* componentName = name->extract(hashUTF8, start + 1, start + len - 1); UserCommonClass* cl = loadName(componentName, false, true, NULL); return cl; } else { Classpath* upcalls = bootstrapLoader->upcalls; UserClassPrimitive* prim = UserClassPrimitive::byteIdToPrimitive(name->elements[start], upcalls); assert(prim && "No primitive found"); return prim; } }