aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/inlineasm/AsmStack.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libsolidity/inlineasm/AsmStack.cpp')
-rw-r--r--libsolidity/inlineasm/AsmStack.cpp22
1 files changed, 21 insertions, 1 deletions
diff --git a/libsolidity/inlineasm/AsmStack.cpp b/libsolidity/inlineasm/AsmStack.cpp
index c891678b..11c6e28f 100644
--- a/libsolidity/inlineasm/AsmStack.cpp
+++ b/libsolidity/inlineasm/AsmStack.cpp
@@ -24,6 +24,7 @@
#include <memory>
#include <libevmasm/Assembly.h>
#include <libevmasm/SourceLocation.h>
+#include <libsolidity/parsing/Scanner.h>
#include <libsolidity/inlineasm/AsmParser.h>
#include <libsolidity/inlineasm/AsmCodeGen.h>
@@ -32,7 +33,7 @@ using namespace dev;
using namespace dev::solidity;
using namespace dev::solidity::assembly;
-bool InlineAssemblyStack::parse(const std::shared_ptr<Scanner>& _scanner)
+bool InlineAssemblyStack::parse(shared_ptr<Scanner> const& _scanner)
{
m_parserResult = make_shared<Block>();
Parser parser(m_errors);
@@ -49,3 +50,22 @@ eth::Assembly InlineAssemblyStack::assemble()
return codeGen.assemble();
}
+bool InlineAssemblyStack::parseAndAssemble(
+ string const& _input,
+ eth::Assembly& _assembly,
+ CodeGenerator::IdentifierAccess const& _identifierAccess
+)
+{
+ ErrorList errors;
+ auto scanner = make_shared<Scanner>(CharStream(_input), "--CODEGEN--");
+ auto parserResult = Parser(errors).parse(scanner);
+ if (!errors.empty())
+ return false;
+
+ CodeGenerator(*parserResult, errors).assemble(_assembly, _identifierAccess);
+
+ // At this point, the assembly might be messed up, but we should throw an
+ // internal compiler error anyway.
+ return errors.empty();
+}
+