about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--038scheduler.cc25
-rw-r--r--081run_interactive.cc14
2 files changed, 35 insertions, 4 deletions
diff --git a/038scheduler.cc b/038scheduler.cc
index f6fc3a3c..ef0b335a 100644
--- a/038scheduler.cc
+++ b/038scheduler.cc
@@ -106,6 +106,7 @@ string current_routine_label() {
 for (long long int i = 0; i < SIZE(Routines); ++i)
   delete Routines.at(i);
 Routines.clear();
+Current_routine = NULL;
 
 //: special case for the very first routine
 :(replace{} "void run_main(int argc, char* argv[])")
@@ -261,6 +262,30 @@ recipe f1 [
 +schedule: f1
 -run: idle
 
+//:: Errors in a routine cause it to terminate.
+
+:(scenario scheduler_terminates_routines_after_errors)
+% Hide_warnings = true;
+% Scheduling_interval = 2;
+recipe f1 [
+  start-running f2:recipe
+  1:number <- copy 0
+  2:number <- copy 0
+]
+recipe f2 [
+  # divide by 0 twice
+  3:number <- divide-with-remainder 4, 0
+  4:number <- divide-with-remainder 4, 0
+]
+# f2 should stop after first divide by 0
++warn: f2: divide by zero in '3:number <- divide-with-remainder 4, 0'
+-warn: f2: divide by zero in '4:number <- divide-with-remainder 4, 0'
+
+:(after "operator<<(ostream& os, unused end)")
+  if (Trace_stream->curr_layer == "warn" && Current_routine) {
+    Current_routine->state = COMPLETED;
+  }
+
 //:: Routines are marked completed when their parent completes.
 
 :(scenario scheduler_kills_orphans)
diff --git a/081run_interactive.cc b/081run_interactive.cc
index c41a3f51..ec7f9206 100644
--- a/081run_interactive.cc
+++ b/081run_interactive.cc
@@ -78,6 +78,9 @@ bool run_interactive(long long int address) {
     Trace_stream->collect_layers.insert("warn");
     Trace_stream->collect_layers.insert("app");
   }
+  // don't kill the current routine on parse errors
+  routine* save_current_routine = Current_routine;
+  Current_routine = NULL;
   // call run(string) but without the scheduling
   load(string("recipe interactive [\n") +
           "local-scope\n" +
@@ -88,6 +91,7 @@ bool run_interactive(long long int address) {
           "reply screen\n" +
        "]\n");
   transform_all();
+  Current_routine = save_current_routine;
   if (trace_count("warn") > 0) return false;
   // now call 'sandbox' which will run 'interactive' in a separate routine,
   // and wait for it
@@ -209,9 +213,9 @@ recipe main [
 recipe main [
   # try to interactively add 2 and 2
   1:address:array:character <- new [
-    100:address:array:character <- new [a]
-    101:address:array:character <- new [b]
-    102:address:array:character <- string-append 100:address:array:character, 101:address:array:character
+    x:address:array:character <- new [a]
+    y:address:array:character <- new [b]
+    z:address:array:character <- string-append x:address:array:character, y:address:array:character
   ]
   2:address:array:character <- run-interactive 1:address:array:character
   10:array:character <- copy 2:address:array:character/lookup
@@ -223,7 +227,8 @@ recipe main [
 :(scenario "run_interactive_returns_warnings")
 recipe main [
   # run a command that generates a warning
-  1:address:array:character <- new [get 1234:number, foo:offset]
+  1:address:array:character <- new [x:number <- copy 34
+get x:number, foo:offset]
   2:address:array:character, 3:address:array:character <- run-interactive 1:address:array:character
   10:array:character <- copy 3:address:array:character/lookup
 ]
@@ -232,6 +237,7 @@ recipe main [
 +mem: storing 110 in location 12
 +mem: storing 107 in location 13
 +mem: storing 110 in location 14
+# ...
 
 :(before "End Globals")
 string Most_recent_products;