aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main.cpp
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2016-11-22 16:16:58 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2016-11-22 18:15:21 +0100
commit0bf380ff110897d2b5db2e22ef6efe1e9ba9888d (patch)
tree038f9aaac800097a630564a7465f0255cbb19df0 /src/main.cpp
parentdd6410b2b35a76de75622660cae9c1444b7a1880 (diff)
downloadsciteco-0bf380ff110897d2b5db2e22ef6efe1e9ba9888d.tar.gz
fixed local Q-Register management on certain broken platforms
* on MSVCRT/MinGW, space allocated with alloca()/g_newa() was apparently freed once the first exception was caught. This prevented the proper destruction of local Q-Reg tables and broke the Windows port. * Since all alternatives to alloca() like VLAs are not practical, the default Q-Register initialization has been moved out of the QRegisterTable constructor into QRegisterTable::insert_defaults(). * The remaining QRegisterTable initialization and destruction is very cheap, so we simply reserve an empty QRegisterTable for local registers on every Execute::macro() call. The default registers are only initialized when required, though. * All of this has to change anyway once we replace the C++ call-stack approach to macro calls with our own macro call frame memory management.
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/main.cpp b/src/main.cpp
index bc82093..ce00c0a 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -384,6 +384,8 @@ main(int argc, char **argv)
*/
QRegisters::view.initialize();
+ /* the default registers (A-Z and 0-9) */
+ QRegisters::globals.insert_defaults();
/* search string and status register */
QRegisters::globals.insert("_");
/* replacement string register */
@@ -395,6 +397,8 @@ main(int argc, char **argv)
/* environment defaults and registers */
initialize_environment(argv[0]);
+ /* the default registers (A-Z and 0-9) */
+ local_qregs.insert_defaults();
QRegisters::locals = &local_qregs;
ring.edit((const gchar *)NULL);