void Extension::CompileSystemlib(const std::string &slib, const std::string &name) { Unit *unit = compile_systemlib_string(slib.c_str(), slib.size(), name.c_str()); assert(unit); unit->merge(); s_systemlib_units.push_back(unit); }
void Extension::CompileSystemlib(const std::string &slib, const std::string &name) { // TODO (t3443556) Bytecode repo compilation expects that any errors // encountered during systemlib compilation have valid filename pointers // which won't be the case for now unless these pointers are long-lived. auto const moduleName = makeStaticString(name.c_str()); auto const unit = compile_systemlib_string(slib.c_str(), slib.size(), moduleName->data()); always_assert_flog(unit, "No unit created for systemlib `{}'", name); const StringData* msg; int line; if (unit->compileTimeFatal(msg, line) || unit->parseFatal(msg, line)) { std::fprintf(stderr, "Systemlib `%s' contains a fataling unit: %s, %d\n", name.c_str(), msg->data(), line); _Exit(0); } unit->merge(); s_systemlib_units.push_back(unit); }
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(); }