aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp40
1 files changed, 26 insertions, 14 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index 0b11721..35b6add 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -146,25 +146,37 @@ Execute::macro(const gchar *macro, bool locals)
try {
step(macro, strlen(macro));
- if (Goto::skip_label) {
- Error error("Label \"%s\" not found",
- Goto::skip_label);
- error.pos = strlen(macro);
- String::get_coord(macro, error.pos,
- error.line, error.column);
- throw error;
- }
+ /*
+ * Subsequent errors must still be
+ * attached to this macro invocation.
+ */
+ try {
+ if (Goto::skip_label)
+ throw Error("Label \"%s\" not found",
+ Goto::skip_label);
+
+ if (States::current != &States::start)
+ /*
+ * can only happen if we returned because
+ * of macro end
+ */
+ throw Error("Unterminated command");
- if (States::current != &States::start) {
- Error error("Unterminated command");
/*
- * can only happen if we returned because
- * of macro end
+ * This handles the problem of Q-Registers
+ * local to the macro invocation being edited
+ * when the macro terminates.
+ * QRegisterTable::clear() throws an error
+ * if this happens and the Q-Reg editing
+ * is undone.
*/
+ if (locals)
+ QRegisters::locals->clear();
+ } catch (Error &error) {
error.pos = strlen(macro);
String::get_coord(macro, error.pos,
- error.line, error.column);
- throw error;
+ error.line, error.column);
+ throw; /* forward */
}
} catch (...) {
g_free(Goto::skip_label);