From e5efc86f2d2d71c948340dbe31094056deb6d002 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Sat, 15 Oct 2016 02:27:54 +0100 Subject: [PATCH 1/3] LLL: better error reporting --- liblll/Compiler.cpp | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/liblll/Compiler.cpp b/liblll/Compiler.cpp index f15387894..684991061 100644 --- a/liblll/Compiler.cpp +++ b/liblll/Compiler.cpp @@ -45,13 +45,21 @@ bytes dev::eth::compileLLL(string const& _src, bool _opt, vector* _error if (_errors) { _errors->push_back("Parse error."); - _errors->push_back(diagnostic_information(_e)); + _errors->push_back(boost::diagnostic_information(_e)); } } - catch (std::exception) + catch (std::exception const& _e) { if (_errors) - _errors->push_back("Parse error."); + { + _errors->push_back("Parse exception."); + _errors->push_back(boost::diagnostic_information(_e)); + } + } + catch (...) + { + if (_errors) + _errors->push_back("Internal parse exception."); } return bytes(); } @@ -70,12 +78,22 @@ std::string dev::eth::compileLLLToAsm(std::string const& _src, bool _opt, std::v catch (Exception const& _e) { if (_errors) - _errors->push_back(diagnostic_information(_e)); + { + _errors->push_back("Parse error."); + _errors->push_back(boost::diagnostic_information(_e)); + } } - catch (std::exception) + catch (std::exception const& _e) + { + if (_errors) { + _errors->push_back("Parse exception."); + _errors->push_back(boost::diagnostic_information(_e)); + } + } + catch (...) { if (_errors) - _errors->push_back("Parse error."); + _errors->push_back("Internal parse exception."); } return string(); } From 7c7a6de87b3c7b574a6bed25c7251df869532056 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Sat, 15 Oct 2016 12:58:57 +0100 Subject: [PATCH 2/3] LLL: fix the commented out debugging code --- liblll/CodeFragment.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/liblll/CodeFragment.cpp b/liblll/CodeFragment.cpp index e9f86ba05..9dcac845d 100644 --- a/liblll/CodeFragment.cpp +++ b/liblll/CodeFragment.cpp @@ -52,17 +52,18 @@ void CodeFragment::finalise(CompilerState const& _cs) CodeFragment::CodeFragment(sp::utree const& _t, CompilerState& _s, bool _allowASM) { -/* cdebug << "CodeFragment. Locals:"; +/* + std::cout << "CodeFragment. Locals:"; for (auto const& i: _s.defs) - cdebug << i.first << ":" << toHex(i.second.m_code); - cdebug << "Args:"; + std::cout << i.first << ":" << i.second.m_asm.out(); + std::cout << "Args:"; for (auto const& i: _s.args) - cdebug << i.first << ":" << toHex(i.second.m_code); - cdebug << "Outers:"; + std::cout << i.first << ":" << i.second.m_asm.out(); + std::cout << "Outers:"; for (auto const& i: _s.outers) - cdebug << i.first << ":" << toHex(i.second.m_code); - debugOutAST(cout, _t); - cout << endl << flush; + std::cout << i.first << ":" << i.second.m_asm.out(); + debugOutAST(std::cout, _t); + std::cout << endl << flush; */ switch (_t.which()) { From 8aa50a004fb320b927b96576f085cfbe5f845da6 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Sat, 15 Oct 2016 13:26:16 +0100 Subject: [PATCH 3/3] LLL: throw proper ParserException --- liblll/Exceptions.h | 1 + liblll/Parser.cpp | 5 +++-- liblll/Parser.h | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/liblll/Exceptions.h b/liblll/Exceptions.h index 1e9671b36..aa4bf4e82 100644 --- a/liblll/Exceptions.h +++ b/liblll/Exceptions.h @@ -39,6 +39,7 @@ class InvalidName: public CompilerException {}; class InvalidMacroArgs: public CompilerException {}; class InvalidLiteral: public CompilerException {}; class BareSymbol: public CompilerException {}; +class ParserException: public CompilerException {}; } } diff --git a/liblll/Parser.cpp b/liblll/Parser.cpp index aa4a4de24..daced13c1 100644 --- a/liblll/Parser.cpp +++ b/liblll/Parser.cpp @@ -143,7 +143,8 @@ void dev::eth::parseTreeLLL(string const& _s, sp::utree& o_out) auto ret = s.cbegin(); qi::phrase_parse(ret, s.cend(), element, space, qi::skip_flag::dont_postskip, o_out); for (auto i = ret; i != s.cend(); ++i) - if (!isspace(*i)) - BOOST_THROW_EXCEPTION(std::exception()); + if (!isspace(*i)) { + BOOST_THROW_EXCEPTION(ParserException() << errinfo_comment("Non-whitespace left in parser")); + } } diff --git a/liblll/Parser.h b/liblll/Parser.h index b21989f06..e45428882 100644 --- a/liblll/Parser.h +++ b/liblll/Parser.h @@ -24,6 +24,7 @@ #include #include #include +#include "Exceptions.h" namespace boost { namespace spirit { class utree; } } namespace sp = boost::spirit;