aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/qregisters.cpp
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2013-03-28 17:37:49 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2014-02-15 15:21:52 +0100
commitd374448af8ab690c810757f73ba44f208db96f30 (patch)
tree48e15c42d7a01b10aaef51d0113572ea53fec797 /src/qregisters.cpp
parent6d4668bdaf393aa45d9adb640774f998c6b4aa58 (diff)
downloadsciteco-d374448af8ab690c810757f73ba44f208db96f30.tar.gz
added support for TECO stack tracing
* when an error is thrown, stack frames are collected on clean up, up to the toplevel macro * the toplevel macro decides how to display the error * now errors in interactive and batch mode are displayed differently * in batch mode, a backtrace is displayed as a sequence of messages * Execute::file() forwards errors correctly * the correct error in the file is displayed in interactive mode * necessary to build the stack trace
Diffstat (limited to 'src/qregisters.cpp')
-rw-r--r--src/qregisters.cpp10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/qregisters.cpp b/src/qregisters.cpp
index 02a779a..a0dc5f5 100644
--- a/src/qregisters.cpp
+++ b/src/qregisters.cpp
@@ -185,6 +185,11 @@ QRegister::execute(bool locals) throw (State::Error, ReplaceCmdline)
try {
Execute::macro(str, locals);
+ } catch (State::Error &error) {
+ error.add_frame(new State::Error::QRegFrame(name));
+
+ g_free(str);
+ throw; /* forward */
} catch (...) {
g_free(str);
throw; /* forward */
@@ -698,13 +703,12 @@ StateMacro::got_register(QRegister &reg) throw (Error, ReplaceCmdline)
* If <file> could not be read, the command yields an error.
*/
State *
-StateMacroFile::done(const gchar *str) throw (Error)
+StateMacroFile::done(const gchar *str) throw (Error, ReplaceCmdline)
{
BEGIN_EXEC(&States::start);
/* don't create new local Q-Registers if colon modifier is given */
- if (!Execute::file(str, !eval_colon()))
- throw Error("Cannot execute macro from file \"%s\"", str);
+ Execute::file(str, !eval_colon());
return &States::start;
}