diff --git a/include/chaiscript/language/chaiscript_eval.hpp b/include/chaiscript/language/chaiscript_eval.hpp index 76706ff4..bc80b79b 100644 --- a/include/chaiscript/language/chaiscript_eval.hpp +++ b/include/chaiscript/language/chaiscript_eval.hpp @@ -1311,11 +1311,8 @@ namespace chaiscript try { retval = this->children[0]->eval(t_ss); } - catch (exception::eval_error &) { - if (this->children.back()->identifier == AST_Node_Type::Finally) { - this->children.back()->children[0]->eval(t_ss); - } - throw; + catch (const exception::eval_error &e) { + retval = handle_exception(t_ss, Boxed_Value(std::ref(e))); } catch (const std::runtime_error &e) { retval = handle_exception(t_ss, Boxed_Value(std::ref(e))); diff --git a/include/chaiscript/language/chaiscript_parser.hpp b/include/chaiscript/language/chaiscript_parser.hpp index 7c694efb..3859c29b 100644 --- a/include/chaiscript/language/chaiscript_parser.hpp +++ b/include/chaiscript/language/chaiscript_parser.hpp @@ -1735,12 +1735,16 @@ namespace chaiscript } /// Reads a class block from input - bool Class() { + bool Class(const bool t_class_allowed) { bool retval = false; size_t prev_stack_top = m_match_stack.size(); if (Keyword("class")) { + if (!t_class_allowed) { + throw exception::eval_error("Class definitions only allowed at top scope", File_Position(m_position.line, m_position.col), *m_filename); + } + retval = true; if (!Id(true)) { @@ -2421,7 +2425,7 @@ namespace chaiscript } /// Top level parser, starts parsing of all known parses - bool Statements() { + bool Statements(const bool t_class_allowed = false) { bool retval = false; bool has_more = true; @@ -2429,7 +2433,7 @@ namespace chaiscript while (has_more) { const auto start = m_position; - if (Def() || Try() || If() || While() || Class() || For() || Switch()) { + if (Def() || Try() || If() || While() || Class(t_class_allowed) || For() || Switch()) { if (!saw_eol) { throw exception::eval_error("Two function definitions missing line separator", File_Position(start.line, start.col), *m_filename); } @@ -2492,7 +2496,7 @@ namespace chaiscript /// \todo respect // -*- coding: utf-8 -*- on line 1 or 2 see: http://evanjones.ca/python-utf8.html) } - if (Statements()) { + if (Statements(true)) { if (m_position.has_more()) { throw exception::eval_error("Unparsed input", File_Position(m_position.line, m_position.col), t_fname); } else { diff --git a/unittests/class_inside_scope.chai b/unittests/class_inside_scope.chai new file mode 100644 index 00000000..27fe8060 --- /dev/null +++ b/unittests/class_inside_scope.chai @@ -0,0 +1,8 @@ + + +try { + parse("{ class C { var data; def C() {} } }") + assert_false(true) +} catch (e) { + assert_true(true) +}