void Extension::loadSystemlib() { std::string hhas, slib; if (m_dsoName.empty()) { std::string section("systemlib.ext."); section += m_name.data(); slib = get_systemlib(&hhas, section); } else { slib = get_systemlib(&hhas, "systemlib", m_dsoName); } if (!slib.empty()) { std::string phpname("systemlib.php."); phpname += m_name.data(); CompileSystemlib(slib, phpname); } if (!hhas.empty()) { std::string hhasname("systemlib.hhas."); hhasname += m_name.data(); CompileSystemlib(hhas, hhasname); } }
/** * Loads a named systemlib section from the main binary (or DSO) * using the label "ext.{hash(name)}" * * If {name} is not passed, then {m_name} is assumed for * builtin extensions. DSOs pull from the fixed "systemlib" label */ void Extension::loadSystemlib(const std::string& name /*= "" */) { std::string hhas, slib; if (m_dsoName.empty() || !name.empty()) { std::string section("ext."); section += f_md5(name.empty() ? m_name : name, false).substr(0, 12).data(); slib = get_systemlib(&hhas, section); } else { slib = get_systemlib(&hhas, "systemlib", m_dsoName); } if (!slib.empty()) { std::string phpname("systemlib.php."); phpname += m_name.data(); CompileSystemlib(slib, phpname); } if (!hhas.empty()) { std::string hhasname("systemlib.hhas."); hhasname += m_name.data(); CompileSystemlib(hhas, hhasname); } }
RepoWrapper::RepoWrapper(const char* repoSchema, const std::string& configFile) { if (setenv("HHVM_RUNTIME_REPO_SCHEMA", repoSchema, 1 /* overwrite */)) { fprintf(stderr, "Could not set repo schema"); exit(EXIT_FAILURE); } printf("# Config file: %s\n", configFile.c_str()); printf("# Repo schema: %s\n", repoSchemaId().begin()); register_process_init(); initialize_repo(); hphp_thread_init(); g_context.getCheck(); IniSetting::Map ini = IniSetting::Map::object; Hdf config; if (!configFile.empty()) { Config::ParseConfigFile(configFile, ini, config); // Disable logging to suppress harmless errors about setrlimit. config["Log"]["Level"] = "None"; } RuntimeOption::Load(ini, config); RuntimeOption::RepoCommit = false; compile_file(nullptr, 0, MD5(), nullptr); repo = &Repo::get(); RuntimeOption::AlwaysUseRelativePath = false; RuntimeOption::SafeFileAccess = false; RuntimeOption::EvalAllowHhas = true; Option::WholeProgram = false; LitstrTable::init(); LitstrTable::get().setWriting(); RuntimeOption::RepoAuthoritative = true; repo->loadGlobalData(true /* allowFailure */); std::string hhasLib; auto const phpLib = get_systemlib(&hhasLib); always_assert(!hhasLib.empty() && !phpLib.empty()); auto phpUnit = compile_string(phpLib.c_str(), phpLib.size(), "systemlib.php"); addUnit(phpUnit); auto hhasUnit = compile_string(hhasLib.c_str(), hhasLib.size(), "systemlib.hhas"); addUnit(hhasUnit); SystemLib::s_inited = true; LitstrTable::get().setReading(); }
/** * Loads a named systemlib section from the main binary (or DSO) * using the label "ext.{hash(name)}" * * If {name} is not passed, then {m_name} is assumed. */ void Extension::loadSystemlib(const std::string& name) { std::string n = name.empty() ? std::string(m_name.data(), m_name.size()) : name; std::string section("ext."); section += f_md5(n, false).substr(0, 12).data(); std::string hhas; std::string slib = get_systemlib(&hhas, section, m_dsoName); if (!slib.empty()) { std::string phpname = s_systemlibPhpName + n; CompileSystemlib(slib, phpname); } if (!hhas.empty()) { std::string hhasname = s_systemlibHhasName + n; CompileSystemlib(hhas, hhasname); } }
/** * Loads a named systemlib section from the main binary (or DSO) * using the label "ext.{hash(name)}" * * If {name} is not passed, then {m_name} is assumed. */ void Extension::loadSystemlib(const std::string& name) { std::string n = name.empty() ? std::string(m_name.data(), m_name.size()) : name; #if defined(__CYGWIN__) || defined(__MINGW__) || defined(_MSC_VER) std::string section("ext_"); #else std::string section("ext."); #endif section += HHVM_FN(md5)(n, false).substr(0, 12).data(); std::string hhas; std::string slib = get_systemlib(&hhas, section, m_dsoName); if (!slib.empty()) { std::string phpname = s_systemlibPhpName + n; CompileSystemlib(slib, phpname); } if (!hhas.empty()) { std::string hhasname = s_systemlibHhasName + n; CompileSystemlib(hhas, hhasname); } }
void ProcessInit() { // Install VM's ClassInfoHook ClassInfo::SetHook(&vm_class_info_hook); // ensure that nextTx64 and tx64 are set (void)Transl::Translator::Get(); // Save the current options, and set things up so that // systemlib.php can be read from and stored in the // normal repo. int db = RuntimeOption::EvalDumpBytecode; bool rp = RuntimeOption::AlwaysUseRelativePath; bool sf = RuntimeOption::SafeFileAccess; bool ah = RuntimeOption::EvalAllowHhas; RuntimeOption::EvalDumpBytecode &= ~1; RuntimeOption::AlwaysUseRelativePath = false; RuntimeOption::SafeFileAccess = false; RuntimeOption::EvalAllowHhas = true; Transl::TargetCache::requestInit(); string hhas; string slib = get_systemlib(&hhas); if (slib.empty()) { // Die a horrible death. Logger::Error("Unable to find/load systemlib.php"); _exit(1); } // Save this in case the debugger needs it. Once we know if this // process does not have debugger support, we'll clear it. SystemLib::s_source = slib; SystemLib::s_unit = compile_string(slib.c_str(), slib.size(), "systemlib.php"); if (!hhas.empty()) { SystemLib::s_hhas_unit = compile_string(hhas.c_str(), hhas.size(), "systemlib.hhas"); } // Load the systemlib unit to build the Class objects SystemLib::s_unit->merge(); if (SystemLib::s_hhas_unit) { SystemLib::s_hhas_unit->merge(); } SystemLib::s_nativeFuncUnit = build_native_func_unit(hhbc_ext_funcs, hhbc_ext_funcs_count); SystemLib::s_nativeFuncUnit->merge(); SystemLib::s_nullFunc = Unit::lookupFunc(makeStaticString("86null")); // We call a special bytecode emitter function to build the native // unit which will contain all of our cppext functions and classes. // Each function and method will have a bytecode body that will thunk // to the native implementation. Unit* nativeClassUnit = build_native_class_unit(hhbc_ext_classes, hhbc_ext_class_count); SystemLib::s_nativeClassUnit = nativeClassUnit; // Load the nativelib unit to build the Class objects SystemLib::s_nativeClassUnit->merge(); #define INIT_SYSTEMLIB_CLASS_FIELD(cls) \ { \ Class *cls = Unit::GetNamedEntity(s_##cls.get())->clsList(); \ assert(!hhbc_ext_class_count || cls); \ SystemLib::s_##cls##Class = cls; \ } // Stash a pointer to the VM Classes for stdclass, Exception, // pinitSentinel and resource SYSTEMLIB_CLASSES(INIT_SYSTEMLIB_CLASS_FIELD) #undef INIT_SYSTEMLIB_CLASS_FIELD // Retrieve all of the class pointers for (long long i = 0; i < hhbc_ext_class_count; ++i) { const HhbcExtClassInfo* info = hhbc_ext_classes + i; const StringData* name = makeStaticString(info->m_name); const NamedEntity* ne = Unit::GetNamedEntity(name); Class* cls = Unit::lookupClass(ne); assert(cls); *(info->m_clsPtr) = cls; } ClassInfo::InitializeSystemConstants(); Stack::ValidateStackSize(); SystemLib::s_inited = true; RuntimeOption::AlwaysUseRelativePath = rp; RuntimeOption::SafeFileAccess = sf; RuntimeOption::EvalDumpBytecode = db; RuntimeOption::EvalAllowHhas = ah; }
void ProcessInit() { // Create the global mcg object jit::mcg = new jit::MCGenerator(); jit::mcg->initUniqueStubs(); // Save the current options, and set things up so that // systemlib.php can be read from and stored in the // normal repo. int db = RuntimeOption::EvalDumpBytecode; bool rp = RuntimeOption::AlwaysUseRelativePath; bool sf = RuntimeOption::SafeFileAccess; bool ah = RuntimeOption::EvalAllowHhas; bool wp = Option::WholeProgram; RuntimeOption::EvalDumpBytecode &= ~1; RuntimeOption::AlwaysUseRelativePath = false; RuntimeOption::SafeFileAccess = false; RuntimeOption::EvalAllowHhas = true; Option::WholeProgram = false; RDS::requestInit(); string hhas; string slib = get_systemlib(&hhas); if (slib.empty()) { // Die a horrible death. Logger::Error("Unable to find/load systemlib.php"); _exit(1); } LitstrTable::init(); LitstrTable::get().setWriting(); Repo::get().loadGlobalData(); // Save this in case the debugger needs it. Once we know if this // process does not have debugger support, we'll clear it. SystemLib::s_source = slib; SystemLib::s_unit = compile_systemlib_string(slib.c_str(), slib.size(), "systemlib.php"); const StringData* msg; int line; if (SystemLib::s_unit->compileTimeFatal(msg, line)) { Logger::Error("An error has been introduced into the systemlib, " "but we cannot give you a file and line number right now."); Logger::Error("Check all of your changes to hphp/system/php"); Logger::Error("HipHop Parse Error: %s", msg->data()); _exit(1); } if (!hhas.empty()) { SystemLib::s_hhas_unit = compile_string(hhas.c_str(), hhas.size(), "systemlib.hhas"); if (SystemLib::s_hhas_unit->compileTimeFatal(msg, line)) { Logger::Error("An error has been introduced in the hhas portion of " "systemlib."); Logger::Error("Check all of your changes to hhas files in " "hphp/system/php"); Logger::Error("HipHop Parse Error: %s", msg->data()); _exit(1); } } // Load the systemlib unit to build the Class objects SystemLib::s_unit->merge(); if (SystemLib::s_hhas_unit) { SystemLib::s_hhas_unit->merge(); } SystemLib::s_nativeFuncUnit = build_native_func_unit(hhbc_ext_funcs, hhbc_ext_funcs_count); SystemLib::s_nativeFuncUnit->merge(); SystemLib::s_nullFunc = Unit::lookupFunc(makeStaticString("86null")); // We call a special bytecode emitter function to build the native // unit which will contain all of our cppext functions and classes. // Each function and method will have a bytecode body that will thunk // to the native implementation. Unit* nativeClassUnit = build_native_class_unit(hhbc_ext_classes, hhbc_ext_class_count); SystemLib::s_nativeClassUnit = nativeClassUnit; LitstrTable::get().setReading(); // Load the nativelib unit to build the Class objects SystemLib::s_nativeClassUnit->merge(); #define INIT_SYSTEMLIB_CLASS_FIELD(cls) \ { \ Class *cls = NamedEntity::get(s_##cls.get())->clsList(); \ assert(!hhbc_ext_class_count || cls); \ SystemLib::s_##cls##Class = cls; \ } // Stash a pointer to the VM Classes for stdclass, Exception, // pinitSentinel and resource SYSTEMLIB_CLASSES(INIT_SYSTEMLIB_CLASS_FIELD) #undef INIT_SYSTEMLIB_CLASS_FIELD // Retrieve all of the class pointers for (long long i = 0; i < hhbc_ext_class_count; ++i) { const HhbcExtClassInfo* info = hhbc_ext_classes + i; const StringData* name = makeStaticString(info->m_name); const NamedEntity* ne = NamedEntity::get(name); Class* cls = Unit::lookupClass(ne); assert(cls); *(info->m_clsPtr) = cls; } ClassInfo::InitializeSystemConstants(); Stack::ValidateStackSize(); SystemLib::s_inited = true; RuntimeOption::AlwaysUseRelativePath = rp; RuntimeOption::SafeFileAccess = sf; RuntimeOption::EvalDumpBytecode = db; RuntimeOption::EvalAllowHhas = ah; Option::WholeProgram = wp; folly::SingletonVault::singleton()->registrationComplete(); }