Unit* UnitRepoProxy::load(const std::string& name, const MD5& md5) { UnitEmitter ue(md5); ue.setFilepath(StringData::GetStaticString(name)); // Look for a repo that contains a unit with matching MD5. int repoId; for (repoId = RepoIdCount - 1; repoId >= 0; --repoId) { if (!getUnit(repoId).get(ue, md5)) { break; } } if (repoId < 0) { TRACE(3, "No repo contains '%s' (0x%016llx%016llx)\n", name.c_str(), md5.q[0], md5.q[1]); return NULL; } try { getUnitLitstrs(repoId).get(ue); getUnitArrays(repoId).get(ue); getUnitPreConsts(repoId).get(ue); m_repo.pcrp().getPreClasses(repoId).get(ue); m_repo.frp().getFuncs(repoId).get(ue); } catch (RepoExc& re) { TRACE(0, "Repo error loading '%s' (0x%016llx%016llx) from '%s': %s\n", name.c_str(), md5.q[0], md5.q[1], m_repo.repoName(repoId).c_str(), re.msg().c_str()); return NULL; } TRACE(3, "Repo loaded '%s' (0x%016llx%016llx) from '%s'\n", name.c_str(), md5.q[0], md5.q[1], m_repo.repoName(repoId).c_str()); return ue.create(); }
bool UnitRepoProxy::loadHelper(UnitEmitter& ue, const std::string& name, const MD5& md5) { ue.m_filepath = makeStaticString(name); // Look for a repo that contains a unit with matching MD5. int repoId; for (repoId = RepoIdCount - 1; repoId >= 0; --repoId) { if (!getUnit(repoId).get(ue, md5)) { break; } } if (repoId < 0) { TRACE(3, "No repo contains '%s' (0x%016" PRIx64 "%016" PRIx64 ")\n", name.c_str(), md5.q[0], md5.q[1]); return false; } try { getUnitLitstrs(repoId).get(ue); getUnitArrays(repoId).get(ue); m_repo.pcrp().getPreClasses(repoId).get(ue); getUnitMergeables(repoId).get(ue); m_repo.frp().getFuncs(repoId).get(ue); } catch (RepoExc& re) { TRACE(0, "Repo error loading '%s' (0x%016" PRIx64 "%016" PRIx64 ") from '%s': %s\n", name.c_str(), md5.q[0], md5.q[1], m_repo.repoName(repoId).c_str(), re.msg().c_str()); return false; } TRACE(3, "Repo loaded '%s' (0x%016" PRIx64 "%016" PRIx64 ") from '%s'\n", name.c_str(), md5.q[0], md5.q[1], m_repo.repoName(repoId).c_str()); return true; }