Validates the optimizer settings and returns them in a parsed object. On error returns the json-formatted error message.
| 621 | /// Validates the optimizer settings and returns them in a parsed object. |
| 622 | /// On error returns the json-formatted error message. |
| 623 | std::variant<OptimiserSettings, Json> parseOptimizerSettings(std::string_view const _language, Json const& _jsonInput) |
| 624 | { |
| 625 | if (auto result = checkOptimizerKeys(_jsonInput)) |
| 626 | return *result; |
| 627 | |
| 628 | OptimiserSettings settings = _language == "EVMAssembly" ? OptimiserSettings::none() : OptimiserSettings::minimal(); |
| 629 | |
| 630 | if (_jsonInput.contains("enabled")) |
| 631 | { |
| 632 | if (!_jsonInput["enabled"].is_boolean()) |
| 633 | return formatFatalError(Error::Type::JSONError, "The \"enabled\" setting must be a Boolean."); |
| 634 | |
| 635 | if (_jsonInput["enabled"].get<bool>()) |
| 636 | settings = OptimiserSettings::standard(); |
| 637 | } |
| 638 | |
| 639 | if (_jsonInput.contains("runs")) |
| 640 | { |
| 641 | if (!_jsonInput["runs"].is_number_unsigned()) |
| 642 | return formatFatalError(Error::Type::JSONError, "The \"runs\" setting must be an unsigned number."); |
| 643 | settings.expectedExecutionsPerDeployment = _jsonInput["runs"].get<size_t>(); |
| 644 | } |
| 645 | |
| 646 | if (_jsonInput.contains("details")) |
| 647 | { |
| 648 | Json const& details = _jsonInput["details"]; |
| 649 | if (auto result = checkOptimizerDetailsKeys(details)) |
| 650 | return *result; |
| 651 | |
| 652 | if (auto error = checkOptimizerDetail(details, "peephole", settings.runPeephole)) |
| 653 | return *error; |
| 654 | if (auto error = checkOptimizerDetail(details, "inliner", settings.runInliner)) |
| 655 | return *error; |
| 656 | if (auto error = checkOptimizerDetail(details, "jumpdestRemover", settings.runJumpdestRemover)) |
| 657 | return *error; |
| 658 | if (auto error = checkOptimizerDetail(details, "orderLiterals", settings.runOrderLiterals)) |
| 659 | return *error; |
| 660 | if (auto error = checkOptimizerDetail(details, "deduplicate", settings.runDeduplicate)) |
| 661 | return *error; |
| 662 | if (auto error = checkOptimizerDetail(details, "cse", settings.runCSE)) |
| 663 | return *error; |
| 664 | if (auto error = checkOptimizerDetail(details, "constantOptimizer", settings.runConstantOptimiser)) |
| 665 | return *error; |
| 666 | if (auto error = checkOptimizerDetail(details, "yul", settings.runYulOptimiser)) |
| 667 | return *error; |
| 668 | if (auto error = checkOptimizerDetail(details, "simpleCounterForLoopUncheckedIncrement", settings.simpleCounterForLoopUncheckedIncrement)) |
| 669 | return *error; |
| 670 | settings.optimizeStackAllocation = settings.runYulOptimiser; |
| 671 | if (details.contains("yulDetails")) |
| 672 | { |
| 673 | if (!settings.runYulOptimiser) |
| 674 | { |
| 675 | if (checkKeys(details["yulDetails"], {"optimizerSteps"}, "settings.optimizer.details.yulDetails")) |
| 676 | return formatFatalError(Error::Type::JSONError, "Only optimizerSteps can be set in yulDetails when Yul optimizer is disabled."); |
| 677 | if (auto error = checkOptimizerDetailSteps(details["yulDetails"], "optimizerSteps", settings.yulOptimiserSteps, settings.yulOptimiserCleanupSteps, settings.runYulOptimiser)) |
| 678 | return *error; |
| 679 | return {std::move(settings)}; |
| 680 | } |
no test coverage detected