VMClass* VMLoader::load(VMContext* ctx, const std::string& name, CGE::Reader& rdr){ VMClass* cls = new VMClass(ctx, this, rdr); cls->initClass(ctx, true); if (ctx->getException() != NULL){ delete cls; return NULL; } mClasses[name] = cls; return cls; }
VMClass* BootstrapLoader::find(VMContext* ctx, const std::string& name, bool initClass){ TR_USE(Java_Loader); std::map<std::string,VMClass*>::iterator iter = mUninitializedClasses.find(name); if (iter != mUninitializedClasses.end()){ VMClass* cls = iter->second; mUninitializedClasses.erase(iter); mClasses[name] = cls; //delayed class init unsigned idx = cls->findMethodIndex("<clinit>", "()V"); VMMethod* mthd = cls->getMethod(idx); if (mthd){ TR_INFO("Delayed execution of class init method"); mthd->execute(ctx, -1); } return cls; } VMClass* entry = mClasses[name]; if (entry == 0){ //array functions if (name[0] == '['){ entry = new VMArrayClass(this, name); mClasses[name] = entry; return entry; } else if (name.size() == 1){ //primitive types return getPrimitiveClass(ctx, name); } //Java::ClassFile* clfile = new Java::ClassFile(); CGE::Reader* rdr = filenameToReader(name); if (!rdr) return NULL; entry = new VMClass(ctx, this, *rdr); delete rdr; if (ctx->getException() != NULL){ delete entry; return NULL; } if (!initClass) mUninitializedClasses[name] = entry; else mClasses[name] = entry; entry->initClass(ctx, initClass); } return entry; }