CachedUnit createUnitFromString(const char* path, const String& contents) { auto const md5 = MD5 { mangleUnitMd5(string_md5(contents.data(), contents.size())).c_str() }; // Try the repo; if it's not already there, invoke the compiler. if (auto const unit = Repo::get().loadUnit(path, md5)) { return CachedUnit { unit, RDS::allocBit() }; } auto const unit = compile_file(contents.data(), contents.size(), md5, path); return CachedUnit { unit, RDS::allocBit() }; }
Unit* compile_string(const char* s, size_t sz, const char* fname, Unit** releaseUnit) { auto const md5 = MD5{mangleUnitMd5(string_md5(folly::StringPiece{s, sz}))}; if (auto u = Repo::get().loadUnit(fname ? fname : "", md5).release()) { return u; } // NB: fname needs to be long-lived if generating a bytecode repo because it // can be cached via a Location ultimately contained by ErrorInfo for printing // code errors. return g_hphp_compiler_parse(s, sz, md5, fname, releaseUnit); }
Unit* compile_systemlib_string(const char* s, size_t sz, const char* fname) { if (RuntimeOption::RepoAuthoritative) { String systemName = String("/:") + fname; auto md5 = MD5{mangleUnitMd5(string_md5(folly::StringPiece{s,sz}))}; if (Repo::get().findFile(systemName.data(), SourceRootInfo::GetCurrentSourceRoot(), md5) == RepoStatus::success) { if (auto u = Repo::get().loadUnit(fname, md5)) { return u.release(); } } } return compile_string(s, sz, fname); }