void Option::Load(const IniSetting::Map& ini, Hdf &config) { LoadRootHdf(ini, config, "IncludeRoots", IncludeRoots); LoadRootHdf(ini, config, "AutoloadRoots", AutoloadRoots); Config::Bind(PackageFiles, ini, config, "PackageFiles", PackageFiles); Config::Bind(IncludeSearchPaths, ini, config, "IncludeSearchPaths"); Config::Bind(PackageDirectories, ini, config, "PackageDirectories"); Config::Bind(PackageExcludeDirs, ini, config, "PackageExcludeDirs"); Config::Bind(PackageExcludeFiles, ini, config, "PackageExcludeFiles"); Config::Bind(PackageExcludePatterns, ini, config, "PackageExcludePatterns"); Config::Bind(PackageExcludeStaticDirs, ini, config, "PackageExcludeStaticDirs"); Config::Bind(PackageExcludeStaticFiles, ini, config, "PackageExcludeStaticFiles"); Config::Bind(PackageExcludeStaticFiles, ini, config, "PackageExcludeStaticPatterns"); Config::Bind(CachePHPFile, ini, config, "CachePHPFile"); Config::Bind(ParseOnDemandDirs, ini, config, "ParseOnDemandDirs"); { std::string tmp; #define READ_CG_OPTION(name) \ tmp = Config::GetString(ini, config, "CodeGeneration."#name); \ if (!tmp.empty()) { \ name = OptionStrings.add(tmp.c_str()); \ } READ_CG_OPTION(IdPrefix); READ_CG_OPTION(LambdaPrefix); } Config::Bind(DynamicInvokeFunctions, ini, config, "DynamicInvokeFunctions"); Config::Bind(VolatileClasses, ini, config, "VolatileClasses"); // build map from function names to sections for (Hdf hdf = config["FunctionSections"].firstChild(); hdf.exists(); hdf = hdf.next()) { for (Hdf hdfFunc = hdf.firstChild(); hdfFunc.exists(); hdfFunc = hdfFunc.next()) { FunctionSections[Config::GetString(ini, hdfFunc, "", "", false)] = hdf.getName(); } } { // Repo { // Repo Central Config::Bind(RepoCentralPath, ini, config, "Repo.Central.Path"); } Config::Bind(RepoDebugInfo, ini, config, "Repo.DebugInfo", false); } { // AutoloadMap Config::Bind(AutoloadClassMap, ini, config, "AutoloadMap.class"); Config::Bind(AutoloadFuncMap, ini, config, "AutoloadMap.function"); Config::Bind(AutoloadConstMap, ini, config, "AutoloadMap.constant"); Config::Bind(AutoloadRoot, ini, config, "AutoloadMap.root"); } Config::Bind(HardTypeHints, ini, config, "HardTypeHints", true); Config::Bind(HardReturnTypeHints, ini, config, "HardReturnTypeHints", false); Config::Bind(HardConstProp, ini, config, "HardConstProp", true); Config::Bind(EnableHipHopSyntax, ini, config, "EnableHipHopSyntax"); Config::Bind(EnableZendCompat, ini, config, "EnableZendCompat"); Config::Bind(JitEnableRenameFunction, ini, config, "JitEnableRenameFunction"); Config::Bind(EnableHipHopExperimentalSyntax, ini, config, "EnableHipHopExperimentalSyntax"); Config::Bind(EnableShortTags, ini, config, "EnableShortTags", true); { // Hack Config::Bind(IntsOverflowToInts, ini, config, "Hack.Lang.IntsOverflowToInts", EnableHipHopSyntax); Config::Bind(StrictArrayFillKeys, ini, config, "Hack.Lang.StrictArrayFillKeys"); Config::Bind(DisallowDynamicVarEnvFuncs, ini, config, "Hack.Lang.DisallowDynamicVarEnvFuncs"); } Config::Bind(EnableAspTags, ini, config, "EnableAspTags"); Config::Bind(EnableXHP, ini, config, "EnableXHP", false); if (EnableHipHopSyntax) { // If EnableHipHopSyntax is true, it forces EnableXHP to true // regardless of how it was set in the config EnableXHP = true; } Config::Bind(ParserThreadCount, ini, config, "ParserThreadCount", 0); if (ParserThreadCount <= 0) { ParserThreadCount = Process::GetCPUCount(); } // Just to silence warnings until we remove them from various config files (void)Config::GetByte(ini, config, "EnableEval", 0); (void)Config::GetBool(ini, config, "AllDynamic", true); Config::Bind(AllVolatile, ini, config, "AllVolatile"); Config::Bind(GenerateDocComments, ini, config, "GenerateDocComments", true); Config::Bind(DumpAst, ini, config, "DumpAst", false); Config::Bind(WholeProgram, ini, config, "WholeProgram", true); Config::Bind(UseHHBBC, ini, config, "UseHHBBC", UseHHBBC); // Temporary, during file-cache migration. Config::Bind(FileCache::UseNewCache, ini, config, "UseNewCache", false); }
void Option::Load(const IniSetting::Map& ini, Hdf &config) { LoadRootHdf(ini, config, "IncludeRoots", IncludeRoots); LoadRootHdf(ini, config, "AutoloadRoots", AutoloadRoots); Config::Bind(PackageFiles, ini, config, "PackageFiles", PackageFiles); Config::Bind(IncludeSearchPaths, ini, config, "IncludeSearchPaths"); Config::Bind(PackageDirectories, ini, config, "PackageDirectories"); Config::Bind(PackageExcludeDirs, ini, config, "PackageExcludeDirs"); Config::Bind(PackageExcludeFiles, ini, config, "PackageExcludeFiles"); Config::Bind(PackageExcludePatterns, ini, config, "PackageExcludePatterns"); Config::Bind(PackageExcludeStaticDirs, ini, config, "PackageExcludeStaticDirs"); Config::Bind(PackageExcludeStaticFiles, ini, config, "PackageExcludeStaticFiles"); Config::Bind(PackageExcludeStaticFiles, ini, config, "PackageExcludeStaticPatterns"); Config::Bind(CachePHPFile, ini, config, "CachePHPFile"); Config::Bind(ParseOnDemandDirs, ini, config, "ParseOnDemandDirs"); { std::string tmp; #define READ_CG_OPTION(name) \ tmp = Config::GetString(ini, config, "CodeGeneration."#name); \ if (!tmp.empty()) { \ name = OptionStrings.add(tmp.c_str()); \ } READ_CG_OPTION(IdPrefix); READ_CG_OPTION(LambdaPrefix); } Config::Bind(RuntimeOption::DynamicInvokeFunctions, ini, config, "DynamicInvokeFunctions", RuntimeOption::DynamicInvokeFunctions); Config::Bind(VolatileClasses, ini, config, "VolatileClasses"); for (auto& str : Config::GetVector(ini, config, "ConstantFunctions")) { std::string func; std::string value; if (folly::split('|', str, func, value)) { ConstantFunctions[func] = value; } else { std::cerr << folly::format("Invalid ConstantFunction: '{}'\n", str); } } // build map from function names to sections auto function_sections_callback = [&] (const IniSetting::Map &ini_fs, const Hdf &hdf_fs, const std::string &ini_fs_key) { auto function_callback = [&] (const IniSetting::Map &ini_f, const Hdf &hdf_f, const std::string &ini_f_key) { FunctionSections[Config::GetString(ini_f, hdf_f, "", "", false)] = hdf_fs.exists() && !hdf_fs.isEmpty() ? hdf_fs.getName() : ini_fs_key; }; Config::Iterate(function_callback, ini_fs, hdf_fs, "", false); }; Config::Iterate(function_sections_callback, ini, config, "FunctionSections"); { // Repo { // Repo Central Config::Bind(RepoCentralPath, ini, config, "Repo.Central.Path"); } Config::Bind(RepoDebugInfo, ini, config, "Repo.DebugInfo", false); } { // AutoloadMap Config::Bind(AutoloadClassMap, ini, config, "AutoloadMap.class"); Config::Bind(AutoloadFuncMap, ini, config, "AutoloadMap.function"); Config::Bind(AutoloadConstMap, ini, config, "AutoloadMap.constant"); Config::Bind(AutoloadRoot, ini, config, "AutoloadMap.root"); } Config::Bind(HHBBC::options.HardTypeHints, ini, config, "HardTypeHints", true); Config::Bind(HHBBC::options.HardReturnTypeHints, ini, config, "HardReturnTypeHints", false); Config::Bind(HardConstProp, ini, config, "HardConstProp", true); Config::Bind(HHBBC::options.ElideAutoloadInvokes, ini, config, "ElideAutoloadInvokes", true); Config::Bind(APCProfile, ini, config, "APCProfile"); Config::Bind(RuntimeOption::EnableHipHopSyntax, ini, config, "EnableHipHopSyntax", RuntimeOption::EnableHipHopSyntax); Config::Bind(RuntimeOption::EvalPromoteEmptyObject, ini, config, "PromoteEmptyObject", RuntimeOption::EvalPromoteEmptyObject); Config::Bind(RuntimeOption::EnableZendCompat, ini, config, "EnableZendCompat", RuntimeOption::EnableZendCompat); Config::Bind(RuntimeOption::EvalJitEnableRenameFunction, ini, config, "JitEnableRenameFunction", RuntimeOption::EvalJitEnableRenameFunction); Config::Bind(EnableHipHopExperimentalSyntax, ini, config, "EnableHipHopExperimentalSyntax"); Config::Bind(EnableShortTags, ini, config, "EnableShortTags", true); { // Hack Config::Bind(RuntimeOption::IntsOverflowToInts, ini, config, "Hack.Lang.IntsOverflowToInts", RuntimeOption::IntsOverflowToInts); Config::Bind(RuntimeOption::StrictArrayFillKeys, ini, config, "Hack.Lang.StrictArrayFillKeys", RuntimeOption::StrictArrayFillKeys); Config::Bind(RuntimeOption::DisallowDynamicVarEnvFuncs, ini, config, "Hack.Lang.DisallowDynamicVarEnvFuncs", RuntimeOption::DisallowDynamicVarEnvFuncs); } Config::Bind(EnableAspTags, ini, config, "EnableAspTags"); Config::Bind(RuntimeOption::EnableXHP, ini, config, "EnableXHP", RuntimeOption::EnableXHP); if (RuntimeOption::EnableHipHopSyntax) { // If EnableHipHopSyntax is true, it forces EnableXHP to true // regardless of how it was set in the config RuntimeOption::EnableXHP = true; } Config::Bind(ParserThreadCount, ini, config, "ParserThreadCount", 0); if (ParserThreadCount <= 0) { ParserThreadCount = Process::GetCPUCount(); } // Just to silence warnings until we remove them from various config files (void)Config::GetByte(ini, config, "EnableEval", 0); (void)Config::GetBool(ini, config, "AllDynamic", true); Config::Bind(AllVolatile, ini, config, "AllVolatile"); Config::Bind(GenerateDocComments, ini, config, "GenerateDocComments", true); Config::Bind(DumpAst, ini, config, "DumpAst", false); Config::Bind(WholeProgram, ini, config, "WholeProgram", true); Config::Bind(UseHHBBC, ini, config, "UseHHBBC", UseHHBBC); // Temporary, during file-cache migration. Config::Bind(FileCache::UseNewCache, ini, config, "UseNewCache", false); }
void Option::Load(const IniSetting::Map& ini, Hdf &config) { LoadRootHdf(ini, config, "IncludeRoots", IncludeRoots); LoadRootHdf(ini, config, "AutoloadRoots", AutoloadRoots); Config::Bind(PackageFiles, ini, config, "PackageFiles", PackageFiles); Config::Bind(IncludeSearchPaths, ini, config, "IncludeSearchPaths"); Config::Bind(PackageDirectories, ini, config, "PackageDirectories"); Config::Bind(PackageExcludeDirs, ini, config, "PackageExcludeDirs"); Config::Bind(PackageExcludeFiles, ini, config, "PackageExcludeFiles"); Config::Bind(PackageExcludePatterns, ini, config, "PackageExcludePatterns"); Config::Bind(PackageExcludeStaticDirs, ini, config, "PackageExcludeStaticDirs"); Config::Bind(PackageExcludeStaticFiles, ini, config, "PackageExcludeStaticFiles"); Config::Bind(PackageExcludeStaticFiles, ini, config, "PackageExcludeStaticPatterns"); Config::Bind(CachePHPFile, ini, config, "CachePHPFile"); Config::Bind(ParseOnDemandDirs, ini, config, "ParseOnDemandDirs"); Config::Bind(IdPrefix, ini, config, "CodeGeneration.IdPrefix", IdPrefix); Config::Bind(LambdaPrefix, ini, config, "CodeGeneration.LambdaPrefix", LambdaPrefix); Config::Bind(RuntimeOption::DynamicInvokeFunctions, ini, config, "DynamicInvokeFunctions", RuntimeOption::DynamicInvokeFunctions); Config::Bind(VolatileClasses, ini, config, "VolatileClasses"); Config::Bind(FlattenTraits, ini, config, "FlattenTraits", true); for (auto& str : Config::GetVector(ini, config, "ConstantFunctions")) { std::string func; std::string value; if (folly::split('|', str, func, value)) { ConstantFunctions[func] = value; } else { std::cerr << folly::format("Invalid ConstantFunction: '{}'\n", str); } } // build map from function names to sections auto function_sections_callback = [&](const IniSetting::Map& ini_fs, const Hdf& hdf_fs, const std::string& ini_fs_key) { auto function_callback = [&](const IniSetting::Map& ini_f, const Hdf& hdf_f, const std::string& /*ini_f_key*/) { FunctionSections[Config::GetString(ini_f, hdf_f, "", "", false)] = hdf_fs.exists() && !hdf_fs.isEmpty() ? hdf_fs.getName() : ini_fs_key; }; Config::Iterate(function_callback, ini_fs, hdf_fs, "", false); }; Config::Iterate(function_sections_callback, ini, config, "FunctionSections"); { // Repo { // Repo Central Config::Bind(RepoCentralPath, ini, config, "Repo.Central.Path"); } Config::Bind(RepoDebugInfo, ini, config, "Repo.DebugInfo", false); } { // AutoloadMap Config::Bind(AutoloadClassMap, ini, config, "AutoloadMap.class"); Config::Bind(AutoloadFuncMap, ini, config, "AutoloadMap.function"); Config::Bind(AutoloadConstMap, ini, config, "AutoloadMap.constant"); Config::Bind(AutoloadRoot, ini, config, "AutoloadMap.root"); } Config::Bind(RuntimeOption::EvalHardTypeHints, ini, config, "HardTypeHints", RuntimeOption::EvalHardTypeHints); static bool HardReturnTypeHints; Config::Bind(HardReturnTypeHints, ini, config, "HardReturnTypeHints", true); // This option takes precedence over RuntimeOption. We test to see if the // option has been set (by the user) or not. auto is_set = [&](const std::string& key) { auto a = Config::GetBool(ini, config, key, true); auto b = Config::GetBool(ini, config, key, false); return a == b; }; if (!is_set("CheckReturnTypeHints") || is_set("HardReturnTypeHints")) { // Note that the actual value does not matter, since HHBBC only cares about // whether the value is 3 or not. RuntimeOption::EvalCheckReturnTypeHints = HardReturnTypeHints ? 3 : 2; } Config::Bind(HHBBC::options.HardConstProp, ini, config, "HardConstProp", HHBBC::options.HardConstProp); Config::Bind(HHBBC::options.ElideAutoloadInvokes, ini, config, "ElideAutoloadInvokes", HHBBC::options.ElideAutoloadInvokes); Config::Bind(APCProfile, ini, config, "APCProfile"); Config::Bind(RuntimeOption::EvalThisTypeHintLevel, ini, config, "ThisTypeHintLevel", RuntimeOption::EvalThisTypeHintLevel); Config::Bind(RuntimeOption::EnableHipHopSyntax, ini, config, "EnableHipHopSyntax", RuntimeOption::EnableHipHopSyntax); Config::Bind(RuntimeOption::EvalPromoteEmptyObject, ini, config, "PromoteEmptyObject", RuntimeOption::EvalPromoteEmptyObject); Config::Bind(RuntimeOption::EnableZendCompat, ini, config, "EnableZendCompat", RuntimeOption::EnableZendCompat); Config::Bind(RuntimeOption::EvalJitEnableRenameFunction, ini, config, "JitEnableRenameFunction", RuntimeOption::EvalJitEnableRenameFunction); Config::Bind(EnableHipHopExperimentalSyntax, ini, config, "EnableHipHopExperimentalSyntax"); Config::Bind(EnableShortTags, ini, config, "EnableShortTags", true); Config::Bind(RuntimeOption::EvalHackArrCompatNotices, ini, config, "HackArrCompatNotices", RuntimeOption::EvalHackArrCompatNotices); Config::Bind(RuntimeOption::EvalHackArrCompatIsArrayNotices, ini, config, "HackArrCompatIsArrayNotices", RuntimeOption::EvalHackArrCompatIsArrayNotices); Config::Bind(RuntimeOption::EvalHackArrCompatPromoteNotices, ini, config, "HackArrCompatPromoteNotices", RuntimeOption::EvalHackArrCompatPromoteNotices); Config::Bind(RuntimeOption::EvalHackArrCompatTypeHintNotices, ini, config, "HackArrCompatTypeHintNotices", RuntimeOption::EvalHackArrCompatTypeHintNotices); Config::Bind(RuntimeOption::EvalHackArrCompatDVCmpNotices, ini, config, "HackArrCompatDVCmpNotices", RuntimeOption::EvalHackArrCompatDVCmpNotices); Config::Bind(RuntimeOption::EvalNoticeOnAllDynamicCalls, ini, config, "NoticeOnAllDynamicCalls", RuntimeOption::EvalNoticeOnAllDynamicCalls); Config::Bind(RuntimeOption::EvalNoticeOnBuiltinDynamicCalls, ini, config, "NoticeOnBuiltinDynamicCalls", RuntimeOption::EvalNoticeOnBuiltinDynamicCalls); { // Hack Config::Bind(RuntimeOption::IntsOverflowToInts, ini, config, "Hack.Lang.IntsOverflowToInts", RuntimeOption::IntsOverflowToInts); Config::Bind(RuntimeOption::StrictArrayFillKeys, ini, config, "Hack.Lang.StrictArrayFillKeys", RuntimeOption::StrictArrayFillKeys); Config::Bind(RuntimeOption::DisallowDynamicVarEnvFuncs, ini, config, "Hack.Lang.DisallowDynamicVarEnvFuncs", RuntimeOption::DisallowDynamicVarEnvFuncs); } Config::Bind(EnableAspTags, ini, config, "EnableAspTags"); Config::Bind(RuntimeOption::EnableXHP, ini, config, "EnableXHP", RuntimeOption::EnableXHP); if (RuntimeOption::EnableHipHopSyntax) { // If EnableHipHopSyntax is true, it forces EnableXHP to true // regardless of how it was set in the config RuntimeOption::EnableXHP = true; } Config::Bind(ParserThreadCount, ini, config, "ParserThreadCount", 0); if (ParserThreadCount <= 0) { ParserThreadCount = Process::GetCPUCount(); } // Just to silence warnings until we remove them from various config files (void)Config::GetByte(ini, config, "EnableEval", 0); (void)Config::GetBool(ini, config, "AllDynamic", true); Config::Bind(AllVolatile, ini, config, "AllVolatile"); Config::Bind(GenerateDocComments, ini, config, "GenerateDocComments", true); Config::Bind(DumpAst, ini, config, "DumpAst", false); Config::Bind(WholeProgram, ini, config, "WholeProgram", true); Config::Bind(RuntimeOption::EvalUseHHBBC, ini, config, "UseHHBBC", RuntimeOption::EvalUseHHBBC); // Temporary, during file-cache migration. Config::Bind(FileCache::UseNewCache, ini, config, "UseNewCache", false); }