mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #5989 from ethereum/moveAssemblyStack
[REF] Move assembly stack
This commit is contained in:
commit
10888b21d8
@ -80,8 +80,6 @@ set(sources
|
|||||||
formal/VariableUsage.h
|
formal/VariableUsage.h
|
||||||
interface/ABI.cpp
|
interface/ABI.cpp
|
||||||
interface/ABI.h
|
interface/ABI.h
|
||||||
interface/AssemblyStack.cpp
|
|
||||||
interface/AssemblyStack.h
|
|
||||||
interface/CompilerStack.cpp
|
interface/CompilerStack.cpp
|
||||||
interface/CompilerStack.h
|
interface/CompilerStack.h
|
||||||
interface/GasEstimator.cpp
|
interface/GasEstimator.cpp
|
||||||
|
@ -20,10 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <libsolidity/interface/AssemblyStack.h>
|
#include <libyul/AssemblyStack.h>
|
||||||
|
|
||||||
#include <libevmasm/Assembly.h>
|
|
||||||
#include <liblangutil/Scanner.h>
|
|
||||||
|
|
||||||
#include <libyul/AsmAnalysis.h>
|
#include <libyul/AsmAnalysis.h>
|
||||||
#include <libyul/AsmAnalysisInfo.h>
|
#include <libyul/AsmAnalysisInfo.h>
|
||||||
@ -37,26 +34,28 @@
|
|||||||
#include <libyul/ObjectParser.h>
|
#include <libyul/ObjectParser.h>
|
||||||
#include <libyul/optimiser/Suite.h>
|
#include <libyul/optimiser/Suite.h>
|
||||||
|
|
||||||
|
#include <libevmasm/Assembly.h>
|
||||||
|
#include <liblangutil/Scanner.h>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace dev;
|
|
||||||
using namespace langutil;
|
using namespace langutil;
|
||||||
using namespace dev::solidity;
|
using namespace yul;
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
shared_ptr<yul::Dialect> languageToDialect(AssemblyStack::Language _language)
|
shared_ptr<Dialect> languageToDialect(AssemblyStack::Language _language)
|
||||||
{
|
{
|
||||||
switch (_language)
|
switch (_language)
|
||||||
{
|
{
|
||||||
case AssemblyStack::Language::Assembly:
|
case AssemblyStack::Language::Assembly:
|
||||||
return yul::EVMDialect::looseAssemblyForEVM();
|
return EVMDialect::looseAssemblyForEVM();
|
||||||
case AssemblyStack::Language::StrictAssembly:
|
case AssemblyStack::Language::StrictAssembly:
|
||||||
return yul::EVMDialect::strictAssemblyForEVMObjects();
|
return EVMDialect::strictAssemblyForEVMObjects();
|
||||||
case AssemblyStack::Language::Yul:
|
case AssemblyStack::Language::Yul:
|
||||||
return yul::Dialect::yul();
|
return Dialect::yul();
|
||||||
}
|
}
|
||||||
solAssert(false, "");
|
solAssert(false, "");
|
||||||
return yul::Dialect::yul();
|
return Dialect::yul();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -73,7 +72,7 @@ bool AssemblyStack::parseAndAnalyze(std::string const& _sourceName, std::string
|
|||||||
m_errors.clear();
|
m_errors.clear();
|
||||||
m_analysisSuccessful = false;
|
m_analysisSuccessful = false;
|
||||||
m_scanner = make_shared<Scanner>(CharStream(_source, _sourceName));
|
m_scanner = make_shared<Scanner>(CharStream(_source, _sourceName));
|
||||||
m_parserResult = yul::ObjectParser(m_errorReporter, languageToDialect(m_language)).parse(m_scanner, false);
|
m_parserResult = ObjectParser(m_errorReporter, languageToDialect(m_language)).parse(m_scanner, false);
|
||||||
if (!m_errorReporter.errors().empty())
|
if (!m_errorReporter.errors().empty())
|
||||||
return false;
|
return false;
|
||||||
solAssert(m_parserResult, "");
|
solAssert(m_parserResult, "");
|
||||||
@ -99,43 +98,43 @@ bool AssemblyStack::analyzeParsed()
|
|||||||
return m_analysisSuccessful;
|
return m_analysisSuccessful;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AssemblyStack::analyzeParsed(yul::Object& _object)
|
bool AssemblyStack::analyzeParsed(Object& _object)
|
||||||
{
|
{
|
||||||
solAssert(_object.code, "");
|
solAssert(_object.code, "");
|
||||||
_object.analysisInfo = make_shared<yul::AsmAnalysisInfo>();
|
_object.analysisInfo = make_shared<AsmAnalysisInfo>();
|
||||||
yul::AsmAnalyzer analyzer(*_object.analysisInfo, m_errorReporter, m_evmVersion, boost::none, languageToDialect(m_language));
|
AsmAnalyzer analyzer(*_object.analysisInfo, m_errorReporter, m_evmVersion, boost::none, languageToDialect(m_language));
|
||||||
bool success = analyzer.analyze(*_object.code);
|
bool success = analyzer.analyze(*_object.code);
|
||||||
for (auto& subNode: _object.subObjects)
|
for (auto& subNode: _object.subObjects)
|
||||||
if (auto subObject = dynamic_cast<yul::Object*>(subNode.get()))
|
if (auto subObject = dynamic_cast<Object*>(subNode.get()))
|
||||||
if (!analyzeParsed(*subObject))
|
if (!analyzeParsed(*subObject))
|
||||||
success = false;
|
success = false;
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AssemblyStack::compileEVM(yul::AbstractAssembly& _assembly, bool _evm15, bool _optimize) const
|
void AssemblyStack::compileEVM(AbstractAssembly& _assembly, bool _evm15, bool _optimize) const
|
||||||
{
|
{
|
||||||
shared_ptr<yul::EVMDialect> dialect;
|
shared_ptr<EVMDialect> dialect;
|
||||||
|
|
||||||
if (m_language == Language::Assembly)
|
if (m_language == Language::Assembly)
|
||||||
dialect = yul::EVMDialect::looseAssemblyForEVM();
|
dialect = EVMDialect::looseAssemblyForEVM();
|
||||||
else if (m_language == AssemblyStack::Language::StrictAssembly)
|
else if (m_language == AssemblyStack::Language::StrictAssembly)
|
||||||
dialect = yul::EVMDialect::strictAssemblyForEVMObjects();
|
dialect = EVMDialect::strictAssemblyForEVMObjects();
|
||||||
else if (m_language == AssemblyStack::Language::Yul)
|
else if (m_language == AssemblyStack::Language::Yul)
|
||||||
dialect = yul::EVMDialect::yulForEVM();
|
dialect = EVMDialect::yulForEVM();
|
||||||
else
|
else
|
||||||
solAssert(false, "Invalid language.");
|
solAssert(false, "Invalid language.");
|
||||||
|
|
||||||
yul::EVMObjectCompiler::compile(*m_parserResult, _assembly, *dialect, _evm15, _optimize);
|
EVMObjectCompiler::compile(*m_parserResult, _assembly, *dialect, _evm15, _optimize);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AssemblyStack::optimize(yul::Object& _object)
|
void AssemblyStack::optimize(Object& _object)
|
||||||
{
|
{
|
||||||
solAssert(_object.code, "");
|
solAssert(_object.code, "");
|
||||||
solAssert(_object.analysisInfo, "");
|
solAssert(_object.analysisInfo, "");
|
||||||
for (auto& subNode: _object.subObjects)
|
for (auto& subNode: _object.subObjects)
|
||||||
if (auto subObject = dynamic_cast<yul::Object*>(subNode.get()))
|
if (auto subObject = dynamic_cast<Object*>(subNode.get()))
|
||||||
optimize(*subObject);
|
optimize(*subObject);
|
||||||
yul::OptimiserSuite::run(languageToDialect(m_language), *_object.code, *_object.analysisInfo);
|
OptimiserSuite::run(languageToDialect(m_language), *_object.code, *_object.analysisInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
MachineAssemblyObject AssemblyStack::assemble(Machine _machine, bool _optimize) const
|
MachineAssemblyObject AssemblyStack::assemble(Machine _machine, bool _optimize) const
|
||||||
@ -150,19 +149,19 @@ MachineAssemblyObject AssemblyStack::assemble(Machine _machine, bool _optimize)
|
|||||||
case Machine::EVM:
|
case Machine::EVM:
|
||||||
{
|
{
|
||||||
MachineAssemblyObject object;
|
MachineAssemblyObject object;
|
||||||
eth::Assembly assembly;
|
dev::eth::Assembly assembly;
|
||||||
yul::EthAssemblyAdapter adapter(assembly);
|
EthAssemblyAdapter adapter(assembly);
|
||||||
compileEVM(adapter, false, _optimize);
|
compileEVM(adapter, false, _optimize);
|
||||||
object.bytecode = make_shared<eth::LinkerObject>(assembly.assemble());
|
object.bytecode = make_shared<dev::eth::LinkerObject>(assembly.assemble());
|
||||||
object.assembly = assembly.assemblyString();
|
object.assembly = assembly.assemblyString();
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
case Machine::EVM15:
|
case Machine::EVM15:
|
||||||
{
|
{
|
||||||
MachineAssemblyObject object;
|
MachineAssemblyObject object;
|
||||||
yul::EVMAssembly assembly(true);
|
EVMAssembly assembly(true);
|
||||||
compileEVM(assembly, true, _optimize);
|
compileEVM(assembly, true, _optimize);
|
||||||
object.bytecode = make_shared<eth::LinkerObject>(assembly.finalize());
|
object.bytecode = make_shared<dev::eth::LinkerObject>(assembly.finalize());
|
||||||
/// TODO: fill out text representation
|
/// TODO: fill out text representation
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
@ -36,19 +36,15 @@ namespace langutil
|
|||||||
{
|
{
|
||||||
class Scanner;
|
class Scanner;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace yul
|
namespace yul
|
||||||
{
|
{
|
||||||
class AbstractAssembly;
|
class AbstractAssembly;
|
||||||
}
|
|
||||||
|
|
||||||
namespace dev
|
|
||||||
{
|
|
||||||
namespace solidity
|
|
||||||
{
|
|
||||||
|
|
||||||
struct MachineAssemblyObject
|
struct MachineAssemblyObject
|
||||||
{
|
{
|
||||||
std::shared_ptr<eth::LinkerObject> bytecode;
|
std::shared_ptr<dev::eth::LinkerObject> bytecode;
|
||||||
std::string assembly;
|
std::string assembly;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -62,7 +58,7 @@ public:
|
|||||||
enum class Language { Yul, Assembly, StrictAssembly };
|
enum class Language { Yul, Assembly, StrictAssembly };
|
||||||
enum class Machine { EVM, EVM15, eWasm };
|
enum class Machine { EVM, EVM15, eWasm };
|
||||||
|
|
||||||
explicit AssemblyStack(EVMVersion _evmVersion = EVMVersion(), Language _language = Language::Assembly):
|
explicit AssemblyStack(dev::solidity::EVMVersion _evmVersion = dev::solidity::EVMVersion(), Language _language = Language::Assembly):
|
||||||
m_language(_language), m_evmVersion(_evmVersion), m_errorReporter(m_errors)
|
m_language(_language), m_evmVersion(_evmVersion), m_errorReporter(m_errors)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
@ -95,7 +91,7 @@ private:
|
|||||||
void optimize(yul::Object& _object);
|
void optimize(yul::Object& _object);
|
||||||
|
|
||||||
Language m_language = Language::Assembly;
|
Language m_language = Language::Assembly;
|
||||||
EVMVersion m_evmVersion;
|
dev::solidity::EVMVersion m_evmVersion;
|
||||||
|
|
||||||
std::shared_ptr<langutil::Scanner> m_scanner;
|
std::shared_ptr<langutil::Scanner> m_scanner;
|
||||||
|
|
||||||
@ -106,4 +102,3 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
|
@ -13,6 +13,8 @@ add_library(yul
|
|||||||
AsmScope.h
|
AsmScope.h
|
||||||
AsmScopeFiller.cpp
|
AsmScopeFiller.cpp
|
||||||
AsmScopeFiller.h
|
AsmScopeFiller.h
|
||||||
|
AssemblyStack.h
|
||||||
|
AssemblyStack.cpp
|
||||||
CompilabilityChecker.cpp
|
CompilabilityChecker.cpp
|
||||||
CompilabilityChecker.h
|
CompilabilityChecker.h
|
||||||
Dialect.cpp
|
Dialect.cpp
|
||||||
|
@ -20,28 +20,30 @@
|
|||||||
* @date 2014
|
* @date 2014
|
||||||
* Solidity command line interface.
|
* Solidity command line interface.
|
||||||
*/
|
*/
|
||||||
#include "CommandLineInterface.h"
|
#include <solc/CommandLineInterface.h>
|
||||||
|
|
||||||
#include "solidity/BuildInfo.h"
|
#include "solidity/BuildInfo.h"
|
||||||
#include "license.h"
|
#include "license.h"
|
||||||
|
|
||||||
#include <libsolidity/interface/Version.h>
|
#include <libsolidity/interface/Version.h>
|
||||||
#include <liblangutil/Scanner.h>
|
|
||||||
#include <libsolidity/parsing/Parser.h>
|
#include <libsolidity/parsing/Parser.h>
|
||||||
#include <libsolidity/ast/ASTPrinter.h>
|
#include <libsolidity/ast/ASTPrinter.h>
|
||||||
#include <libsolidity/ast/ASTJsonConverter.h>
|
#include <libsolidity/ast/ASTJsonConverter.h>
|
||||||
#include <libsolidity/analysis/NameAndTypeResolver.h>
|
#include <libsolidity/analysis/NameAndTypeResolver.h>
|
||||||
#include <liblangutil/Exceptions.h>
|
|
||||||
#include <libsolidity/interface/CompilerStack.h>
|
#include <libsolidity/interface/CompilerStack.h>
|
||||||
#include <libsolidity/interface/StandardCompiler.h>
|
#include <libsolidity/interface/StandardCompiler.h>
|
||||||
#include <liblangutil/SourceReferenceFormatter.h>
|
|
||||||
#include <liblangutil/SourceReferenceFormatterHuman.h>
|
|
||||||
#include <libsolidity/interface/GasEstimator.h>
|
#include <libsolidity/interface/GasEstimator.h>
|
||||||
#include <libsolidity/interface/AssemblyStack.h>
|
|
||||||
|
#include <libyul/AssemblyStack.h>
|
||||||
|
|
||||||
#include <libevmasm/Instruction.h>
|
#include <libevmasm/Instruction.h>
|
||||||
#include <libevmasm/GasMeter.h>
|
#include <libevmasm/GasMeter.h>
|
||||||
|
|
||||||
|
#include <liblangutil/Exceptions.h>
|
||||||
|
#include <liblangutil/Scanner.h>
|
||||||
|
#include <liblangutil/SourceReferenceFormatter.h>
|
||||||
|
#include <liblangutil/SourceReferenceFormatterHuman.h>
|
||||||
|
|
||||||
#include <libdevcore/Common.h>
|
#include <libdevcore/Common.h>
|
||||||
#include <libdevcore/CommonData.h>
|
#include <libdevcore/CommonData.h>
|
||||||
#include <libdevcore/CommonIO.h>
|
#include <libdevcore/CommonIO.h>
|
||||||
@ -841,8 +843,8 @@ bool CommandLineInterface::processInput()
|
|||||||
{
|
{
|
||||||
// switch to assembly mode
|
// switch to assembly mode
|
||||||
m_onlyAssemble = true;
|
m_onlyAssemble = true;
|
||||||
using Input = AssemblyStack::Language;
|
using Input = yul::AssemblyStack::Language;
|
||||||
using Machine = AssemblyStack::Machine;
|
using Machine = yul::AssemblyStack::Machine;
|
||||||
Input inputLanguage = m_args.count(g_argYul) ? Input::Yul : (m_args.count(g_argStrictAssembly) ? Input::StrictAssembly : Input::Assembly);
|
Input inputLanguage = m_args.count(g_argYul) ? Input::Yul : (m_args.count(g_argStrictAssembly) ? Input::StrictAssembly : Input::Assembly);
|
||||||
Machine targetMachine = Machine::EVM;
|
Machine targetMachine = Machine::EVM;
|
||||||
bool optimize = m_args.count(g_argOptimize);
|
bool optimize = m_args.count(g_argOptimize);
|
||||||
@ -1216,16 +1218,16 @@ string CommandLineInterface::objectWithLinkRefsHex(eth::LinkerObject const& _obj
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool CommandLineInterface::assemble(
|
bool CommandLineInterface::assemble(
|
||||||
AssemblyStack::Language _language,
|
yul::AssemblyStack::Language _language,
|
||||||
AssemblyStack::Machine _targetMachine,
|
yul::AssemblyStack::Machine _targetMachine,
|
||||||
bool _optimize
|
bool _optimize
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
bool successful = true;
|
bool successful = true;
|
||||||
map<string, AssemblyStack> assemblyStacks;
|
map<string, yul::AssemblyStack> assemblyStacks;
|
||||||
for (auto const& src: m_sourceCodes)
|
for (auto const& src: m_sourceCodes)
|
||||||
{
|
{
|
||||||
auto& stack = assemblyStacks[src.first] = AssemblyStack(m_evmVersion, _language);
|
auto& stack = assemblyStacks[src.first] = yul::AssemblyStack(m_evmVersion, _language);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (!stack.parseAndAnalyze(src.first, src.second))
|
if (!stack.parseAndAnalyze(src.first, src.second))
|
||||||
@ -1272,16 +1274,16 @@ bool CommandLineInterface::assemble(
|
|||||||
for (auto const& src: m_sourceCodes)
|
for (auto const& src: m_sourceCodes)
|
||||||
{
|
{
|
||||||
string machine =
|
string machine =
|
||||||
_targetMachine == AssemblyStack::Machine::EVM ? "EVM" :
|
_targetMachine == yul::AssemblyStack::Machine::EVM ? "EVM" :
|
||||||
_targetMachine == AssemblyStack::Machine::EVM15 ? "EVM 1.5" :
|
_targetMachine == yul::AssemblyStack::Machine::EVM15 ? "EVM 1.5" :
|
||||||
"eWasm";
|
"eWasm";
|
||||||
sout() << endl << "======= " << src.first << " (" << machine << ") =======" << endl;
|
sout() << endl << "======= " << src.first << " (" << machine << ") =======" << endl;
|
||||||
AssemblyStack& stack = assemblyStacks[src.first];
|
yul::AssemblyStack& stack = assemblyStacks[src.first];
|
||||||
|
|
||||||
sout() << endl << "Pretty printed source:" << endl;
|
sout() << endl << "Pretty printed source:" << endl;
|
||||||
sout() << stack.print() << endl;
|
sout() << stack.print() << endl;
|
||||||
|
|
||||||
MachineAssemblyObject object;
|
yul::MachineAssemblyObject object;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
object = stack.assemble(_targetMachine);
|
object = stack.assemble(_targetMachine);
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <libsolidity/interface/CompilerStack.h>
|
#include <libsolidity/interface/CompilerStack.h>
|
||||||
#include <libsolidity/interface/AssemblyStack.h>
|
#include <libyul/AssemblyStack.h>
|
||||||
#include <liblangutil/EVMVersion.h>
|
#include <liblangutil/EVMVersion.h>
|
||||||
|
|
||||||
#include <boost/program_options.hpp>
|
#include <boost/program_options.hpp>
|
||||||
@ -57,7 +57,7 @@ private:
|
|||||||
/// @returns the full object with library placeholder hints in hex.
|
/// @returns the full object with library placeholder hints in hex.
|
||||||
static std::string objectWithLinkRefsHex(eth::LinkerObject const& _obj);
|
static std::string objectWithLinkRefsHex(eth::LinkerObject const& _obj);
|
||||||
|
|
||||||
bool assemble(AssemblyStack::Language _language, AssemblyStack::Machine _targetMachine, bool _optimize);
|
bool assemble(yul::AssemblyStack::Language _language, yul::AssemblyStack::Machine _targetMachine, bool _optimize);
|
||||||
|
|
||||||
void outputCompilationResults();
|
void outputCompilationResults();
|
||||||
|
|
||||||
|
@ -22,11 +22,15 @@
|
|||||||
|
|
||||||
#include <test/Options.h>
|
#include <test/Options.h>
|
||||||
|
|
||||||
#include <libsolidity/interface/AssemblyStack.h>
|
#include <test/libsolidity/ErrorCheck.h>
|
||||||
|
|
||||||
|
#include <libsolidity/ast/AST.h>
|
||||||
|
|
||||||
|
#include <libyul/AssemblyStack.h>
|
||||||
|
|
||||||
#include <liblangutil/Scanner.h>
|
#include <liblangutil/Scanner.h>
|
||||||
#include <liblangutil/Exceptions.h>
|
#include <liblangutil/Exceptions.h>
|
||||||
#include <libsolidity/ast/AST.h>
|
|
||||||
#include <test/libsolidity/ErrorCheck.h>
|
|
||||||
#include <libevmasm/Assembly.h>
|
#include <libevmasm/Assembly.h>
|
||||||
|
|
||||||
#include <boost/optional.hpp>
|
#include <boost/optional.hpp>
|
||||||
@ -37,6 +41,7 @@
|
|||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace langutil;
|
using namespace langutil;
|
||||||
|
using namespace yul;
|
||||||
|
|
||||||
namespace dev
|
namespace dev
|
||||||
{
|
{
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
#include <libdevcore/AnsiColorized.h>
|
#include <libdevcore/AnsiColorized.h>
|
||||||
|
|
||||||
#include <libsolidity/interface/AssemblyStack.h>
|
#include <libyul/AssemblyStack.h>
|
||||||
|
|
||||||
#include <libevmasm/Instruction.h>
|
#include <libevmasm/Instruction.h>
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
#include <test/libsolidity/ErrorCheck.h>
|
#include <test/libsolidity/ErrorCheck.h>
|
||||||
|
|
||||||
#include <libsolidity/interface/AssemblyStack.h>
|
#include <libyul/AssemblyStack.h>
|
||||||
|
|
||||||
#include <boost/optional.hpp>
|
#include <boost/optional.hpp>
|
||||||
#include <boost/algorithm/string/replace.hpp>
|
#include <boost/algorithm/string/replace.hpp>
|
||||||
@ -34,8 +34,6 @@
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace langutil;
|
using namespace langutil;
|
||||||
|
|
||||||
namespace dev
|
|
||||||
{
|
|
||||||
namespace yul
|
namespace yul
|
||||||
{
|
{
|
||||||
namespace test
|
namespace test
|
||||||
@ -48,9 +46,9 @@ std::pair<bool, ErrorList> parse(string const& _source)
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
solidity::AssemblyStack asmStack(
|
AssemblyStack asmStack(
|
||||||
dev::test::Options::get().evmVersion(),
|
dev::test::Options::get().evmVersion(),
|
||||||
solidity::AssemblyStack::Language::StrictAssembly
|
AssemblyStack::Language::StrictAssembly
|
||||||
);
|
);
|
||||||
bool success = asmStack.parseAndAnalyze("source", _source);
|
bool success = asmStack.parseAndAnalyze("source", _source);
|
||||||
return {success, asmStack.errors()};
|
return {success, asmStack.errors()};
|
||||||
@ -107,7 +105,7 @@ do \
|
|||||||
{ \
|
{ \
|
||||||
Error err = expectError((text), false); \
|
Error err = expectError((text), false); \
|
||||||
BOOST_CHECK(err.type() == (Error::Type::typ)); \
|
BOOST_CHECK(err.type() == (Error::Type::typ)); \
|
||||||
BOOST_CHECK(solidity::searchErrorMessage(err, (substring))); \
|
BOOST_CHECK(dev::solidity::searchErrorMessage(err, (substring))); \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE(YulObjectParser)
|
BOOST_AUTO_TEST_SUITE(YulObjectParser)
|
||||||
@ -242,9 +240,9 @@ BOOST_AUTO_TEST_CASE(to_string)
|
|||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
expectation = boost::replace_all_copy(expectation, "\t", " ");
|
expectation = boost::replace_all_copy(expectation, "\t", " ");
|
||||||
solidity::AssemblyStack asmStack(
|
AssemblyStack asmStack(
|
||||||
dev::test::Options::get().evmVersion(),
|
dev::test::Options::get().evmVersion(),
|
||||||
solidity::AssemblyStack::Language::StrictAssembly
|
AssemblyStack::Language::StrictAssembly
|
||||||
);
|
);
|
||||||
BOOST_REQUIRE(asmStack.parseAndAnalyze("source", code));
|
BOOST_REQUIRE(asmStack.parseAndAnalyze("source", code));
|
||||||
BOOST_CHECK_EQUAL(asmStack.print(), expectation);
|
BOOST_CHECK_EQUAL(asmStack.print(), expectation);
|
||||||
@ -284,4 +282,3 @@ BOOST_AUTO_TEST_SUITE_END()
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // end namespaces
|
|
||||||
|
@ -20,13 +20,11 @@
|
|||||||
|
|
||||||
#include <test/Options.h>
|
#include <test/Options.h>
|
||||||
|
|
||||||
#include <libsolidity/interface/AssemblyStack.h>
|
#include <libyul/AssemblyStack.h>
|
||||||
#include <libevmasm/Instruction.h>
|
#include <libevmasm/Instruction.h>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
namespace dev
|
|
||||||
{
|
|
||||||
namespace yul
|
namespace yul
|
||||||
{
|
{
|
||||||
namespace test
|
namespace test
|
||||||
@ -36,9 +34,9 @@ namespace
|
|||||||
{
|
{
|
||||||
string assemble(string const& _input)
|
string assemble(string const& _input)
|
||||||
{
|
{
|
||||||
solidity::AssemblyStack asmStack;
|
AssemblyStack asmStack;
|
||||||
BOOST_REQUIRE_MESSAGE(asmStack.parseAndAnalyze("", _input), "Source did not parse: " + _input);
|
BOOST_REQUIRE_MESSAGE(asmStack.parseAndAnalyze("", _input), "Source did not parse: " + _input);
|
||||||
return solidity::disassemble(asmStack.assemble(solidity::AssemblyStack::Machine::EVM, true).bytecode->bytecode);
|
return dev::solidity::disassemble(asmStack.assemble(AssemblyStack::Machine::EVM, true).bytecode->bytecode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -350,4 +348,3 @@ BOOST_AUTO_TEST_SUITE_END()
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user