about summary refs log tree commit diff stats
path: root/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp')
-rw-r--r--cpp/.traces/brace_conversion2
-rw-r--r--cpp/.traces/brace_conversion_and_run4
-rw-r--r--cpp/.traces/break_cascading4
-rw-r--r--cpp/.traces/break_cascading24
-rw-r--r--cpp/.traces/break_empty_block2
-rw-r--r--cpp/.traces/break_if4
-rw-r--r--cpp/.traces/break_label2
-rw-r--r--cpp/.traces/break_nested2
-rw-r--r--cpp/.traces/break_nested_degenerate2
-rw-r--r--cpp/.traces/break_nested_degenerate22
-rw-r--r--cpp/.traces/break_unless2
-rw-r--r--cpp/.traces/buffer-append-works2
-rw-r--r--cpp/.traces/closure6
-rw-r--r--cpp/.traces/interpolate-at-end4
-rw-r--r--cpp/.traces/interpolate-at-start4
-rw-r--r--cpp/.traces/interpolate-works4
-rw-r--r--cpp/.traces/loop2
-rw-r--r--cpp/.traces/loop_nested2
-rw-r--r--cpp/.traces/loop_unless2
-rw-r--r--cpp/.traces/new4
-rw-r--r--cpp/.traces/new_array4
-rw-r--r--cpp/.traces/new_concurrent4
-rw-r--r--cpp/.traces/new_overflow4
-rw-r--r--cpp/.traces/new_string2
-rw-r--r--cpp/.traces/stalled_routine40
-rw-r--r--cpp/.traces/string-append-14
-rw-r--r--cpp/.traces/string-equal-common-lengths-but-distinct6
-rw-r--r--cpp/.traces/string-equal-distinct-lengths6
-rw-r--r--cpp/.traces/string-equal-identical6
-rw-r--r--cpp/.traces/string-equal-reflexive4
-rw-r--r--cpp/.traces/string-equal-with-empty6
-rw-r--r--cpp/.traces/string_literal2
-rw-r--r--cpp/.traces/string_literal_nested2
-rw-r--r--cpp/.traces/string_literal_with_colons2
-rw-r--r--cpp/038scheduler.cc4
-rw-r--r--cpp/039wait.cc57
36 files changed, 155 insertions, 58 deletions
diff --git a/cpp/.traces/brace_conversion b/cpp/.traces/brace_conversion
index 580f334f..e1852440 100644
--- a/cpp/.traces/brace_conversion
+++ b/cpp/.traces/brace_conversion
@@ -1,5 +1,5 @@
 parse/0: label: {
-parse/0: instruction: 30
+parse/0: instruction: 31
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/brace_conversion_and_run b/cpp/.traces/brace_conversion_and_run
index 8250e7a4..78844009 100644
--- a/cpp/.traces/brace_conversion_and_run
+++ b/cpp/.traces/brace_conversion_and_run
@@ -9,7 +9,7 @@ parse/0: instruction: 13
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 3, properties: ["3": "boolean"]}
-parse/0: instruction: 31
+parse/0: instruction: 32
 parse/0:   ingredient: {name: "3", value: 0, type: 3, properties: ["3": "boolean"]}
 parse/0: instruction: 4
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
@@ -19,7 +19,7 @@ parse/0: instruction: 3
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 33
+parse/0: instruction: 34
 parse/0: label: }
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
diff --git a/cpp/.traces/break_cascading b/cpp/.traces/break_cascading
index c21cda61..be0dcb75 100644
--- a/cpp/.traces/break_cascading
+++ b/cpp/.traces/break_cascading
@@ -2,10 +2,10 @@ parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: label: {
-parse/0: instruction: 30
+parse/0: instruction: 31
 parse/0: label: }
 parse/0: label: {
-parse/0: instruction: 30
+parse/0: instruction: 31
 parse/0: label: }
 brace/0: 1000: push (open, 1)
 brace/0: push (close, 3)
diff --git a/cpp/.traces/break_cascading2 b/cpp/.traces/break_cascading2
index 8d0d42b9..a4bf4668 100644
--- a/cpp/.traces/break_cascading2
+++ b/cpp/.traces/break_cascading2
@@ -5,13 +5,13 @@ parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: label: {
-parse/0: instruction: 30
+parse/0: instruction: 31
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 parse/0: label: }
 parse/0: label: {
-parse/0: instruction: 30
+parse/0: instruction: 31
 parse/0: label: }
 brace/0: 1000: push (open, 2)
 brace/0: push (close, 5)
diff --git a/cpp/.traces/break_empty_block b/cpp/.traces/break_empty_block
index ee11f3e6..5dc33d5f 100644
--- a/cpp/.traces/break_empty_block
+++ b/cpp/.traces/break_empty_block
@@ -2,7 +2,7 @@ parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: label: {
-parse/0: instruction: 30
+parse/0: instruction: 31
 parse/0: label: }
 brace/0: 1000: push (open, 1)
 brace/0: push (close, 3)
diff --git a/cpp/.traces/break_if b/cpp/.traces/break_if
index 5e379313..ba84c1bb 100644
--- a/cpp/.traces/break_if
+++ b/cpp/.traces/break_if
@@ -5,14 +5,14 @@ parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: label: {
-parse/0: instruction: 31
+parse/0: instruction: 32
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 parse/0: label: }
 parse/0: label: {
-parse/0: instruction: 30
+parse/0: instruction: 31
 parse/0: label: }
 brace/0: 1000: push (open, 2)
 brace/0: push (close, 5)
diff --git a/cpp/.traces/break_label b/cpp/.traces/break_label
index b4e5d5a4..1f66321f 100644
--- a/cpp/.traces/break_label
+++ b/cpp/.traces/break_label
@@ -2,7 +2,7 @@ parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: label: {
-parse/0: instruction: 30
+parse/0: instruction: 31
 parse/0:   ingredient: {name: "+foo", value: 0, type: 0, properties: ["+foo": "offset"]}
 parse/0: label: }
 brace/0: 1000: push (open, 1)
diff --git a/cpp/.traces/break_nested b/cpp/.traces/break_nested
index 2d445d5d..2879c48a 100644
--- a/cpp/.traces/break_nested
+++ b/cpp/.traces/break_nested
@@ -5,7 +5,7 @@ parse/0: label: {
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 30
+parse/0: instruction: 31
 parse/0: label: {
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
diff --git a/cpp/.traces/break_nested_degenerate b/cpp/.traces/break_nested_degenerate
index 633b6ea0..d451959f 100644
--- a/cpp/.traces/break_nested_degenerate
+++ b/cpp/.traces/break_nested_degenerate
@@ -5,7 +5,7 @@ parse/0: label: {
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 30
+parse/0: instruction: 31
 parse/0: label: {
 parse/0: label: }
 parse/0: instruction: 1
diff --git a/cpp/.traces/break_nested_degenerate2 b/cpp/.traces/break_nested_degenerate2
index e32a341f..47f21f34 100644
--- a/cpp/.traces/break_nested_degenerate2
+++ b/cpp/.traces/break_nested_degenerate2
@@ -5,7 +5,7 @@ parse/0: label: {
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 30
+parse/0: instruction: 31
 parse/0: label: {
 parse/0: label: }
 parse/0: label: }
diff --git a/cpp/.traces/break_unless b/cpp/.traces/break_unless
index 16d7f12b..8557c249 100644
--- a/cpp/.traces/break_unless
+++ b/cpp/.traces/break_unless
@@ -5,7 +5,7 @@ parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: label: {
-parse/0: instruction: 32
+parse/0: instruction: 33
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
diff --git a/cpp/.traces/buffer-append-works b/cpp/.traces/buffer-append-works
index 8f078ca0..dbd2345d 100644
--- a/cpp/.traces/buffer-append-works
+++ b/cpp/.traces/buffer-append-works
@@ -1,4 +1,4 @@
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
diff --git a/cpp/.traces/closure b/cpp/.traces/closure
index 62bbbd4e..ae880949 100644
--- a/cpp/.traces/closure
+++ b/cpp/.traces/closure
@@ -1,4 +1,4 @@
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
@@ -10,7 +10,7 @@ parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer",
 parse/0: instruction: 1002
 parse/0:   ingredient: {name: "1", value: 0, type: 2-5-1, properties: ["1": "address":"array":"location", "names": "init-counter"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer", "raw": ]}
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
@@ -22,7 +22,7 @@ parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal
 parse/0:   product: {name: "y", value: 0, type: 1, properties: ["y": "integer"]}
 parse/0: instruction: 28
 parse/0:   ingredient: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "space", value: 0, type: 0, properties: ["space": "literal"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
diff --git a/cpp/.traces/interpolate-at-end b/cpp/.traces/interpolate-at-end
index a6dcb375..c0093a24 100644
--- a/cpp/.traces/interpolate-at-end
+++ b/cpp/.traces/interpolate-at-end
@@ -1,7 +1,7 @@
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "hello, _", value: 0, type: 0, properties: ["hello, _": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "2", value: 0, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
 parse/0: instruction: 107
diff --git a/cpp/.traces/interpolate-at-start b/cpp/.traces/interpolate-at-start
index ce99463f..69b84ff5 100644
--- a/cpp/.traces/interpolate-at-start
+++ b/cpp/.traces/interpolate-at-start
@@ -1,7 +1,7 @@
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "_, hello!", value: 0, type: 0, properties: ["_, hello!": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "2", value: 0, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
 parse/0: instruction: 107
diff --git a/cpp/.traces/interpolate-works b/cpp/.traces/interpolate-works
index a9f9b7fb..b033c1fd 100644
--- a/cpp/.traces/interpolate-works
+++ b/cpp/.traces/interpolate-works
@@ -1,7 +1,7 @@
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "abc _", value: 0, type: 0, properties: ["abc _": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "def", value: 0, type: 0, properties: ["def": "literal-string"]}
 parse/0:   product: {name: "2", value: 0, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
 parse/0: instruction: 107
diff --git a/cpp/.traces/loop b/cpp/.traces/loop
index 4cfc2250..d68874c4 100644
--- a/cpp/.traces/loop
+++ b/cpp/.traces/loop
@@ -8,7 +8,7 @@ parse/0: label: {
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 33
+parse/0: instruction: 34
 parse/0: label: }
 brace/0: 1000: push (open, 2)
 brace/0: push (close, 5)
diff --git a/cpp/.traces/loop_nested b/cpp/.traces/loop_nested
index b707de42..37ccf23f 100644
--- a/cpp/.traces/loop_nested
+++ b/cpp/.traces/loop_nested
@@ -10,7 +10,7 @@ parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 parse/0: label: }
-parse/0: instruction: 34
+parse/0: instruction: 35
 parse/0:   ingredient: {name: "4", value: 0, type: 3, properties: ["4": "boolean"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
diff --git a/cpp/.traces/loop_unless b/cpp/.traces/loop_unless
index fe50d87e..efd39cc2 100644
--- a/cpp/.traces/loop_unless
+++ b/cpp/.traces/loop_unless
@@ -5,7 +5,7 @@ parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: label: {
-parse/0: instruction: 35
+parse/0: instruction: 36
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
diff --git a/cpp/.traces/new b/cpp/.traces/new
index ff60abae..6b9fb9a9 100644
--- a/cpp/.traces/new
+++ b/cpp/.traces/new
@@ -1,7 +1,7 @@
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   product: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer", "raw": ]}
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   product: {name: "2", value: 0, type: 2-1, properties: ["2": "address":"integer", "raw": ]}
 parse/0: instruction: 13
diff --git a/cpp/.traces/new_array b/cpp/.traces/new_array
index 32a600fc..6f0fc8ac 100644
--- a/cpp/.traces/new_array
+++ b/cpp/.traces/new_array
@@ -1,8 +1,8 @@
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-1, properties: ["1": "address":"array":"integer", "raw": ]}
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   product: {name: "2", value: 0, type: 2-1, properties: ["2": "address":"integer", "raw": ]}
 parse/0: instruction: 3
diff --git a/cpp/.traces/new_concurrent b/cpp/.traces/new_concurrent
index 5e35b113..94200129 100644
--- a/cpp/.traces/new_concurrent
+++ b/cpp/.traces/new_concurrent
@@ -1,9 +1,9 @@
 parse/0: instruction: 29
 parse/0:   ingredient: {name: "f2", value: 0, type: 0, properties: ["f2": "recipe"]}
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   product: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer", "raw": ]}
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   product: {name: "2", value: 0, type: 2-1, properties: ["2": "address":"integer", "raw": ]}
 parse/0: instruction: 13
diff --git a/cpp/.traces/new_overflow b/cpp/.traces/new_overflow
index 6a24ab18..877f1f46 100644
--- a/cpp/.traces/new_overflow
+++ b/cpp/.traces/new_overflow
@@ -1,7 +1,7 @@
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   product: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer", "raw": ]}
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "point", value: 0, type: 0, properties: ["point": "type"]}
 parse/0:   product: {name: "2", value: 0, type: 2-6, properties: ["2": "address":"point", "raw": ]}
 new/0: integer -> 1
diff --git a/cpp/.traces/new_string b/cpp/.traces/new_string
index 6b6cf903..e38d328b 100644
--- a/cpp/.traces/new_string
+++ b/cpp/.traces/new_string
@@ -1,4 +1,4 @@
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "abc def", value: 0, type: 0, properties: ["abc def": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character"]}
 parse/0: instruction: 21
diff --git a/cpp/.traces/stalled_routine b/cpp/.traces/stalled_routine
new file mode 100644
index 00000000..cb2311c5
--- /dev/null
+++ b/cpp/.traces/stalled_routine
@@ -0,0 +1,40 @@
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0: instruction: 29
+parse/0:   ingredient: {name: "f2", value: 0, type: 0, properties: ["f2": "recipe"]}
+parse/0: instruction: 30
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+after-brace/0: recipe f1
+after-brace/0: copy ...
+after-brace/0: run ...
+after-brace/0: wait-for-location ...
+after-brace/0: copy ...
+after-brace/0: recipe f2
+after-brace/0: copy ...
+new/0: routine allocated memory from 1000 to 101000
+schedule/0: f1
+run/0: instruction f1/0
+run/0: ingredient 0 is 0
+mem/0: storing 0 in location 1
+run/0: instruction f1/1
+run/0: ingredient 0 is f2
+new/0: routine allocated memory from 101000 to 201000
+run/0: instruction f1/2
+run/0: waiting for 1 to change from 0
+schedule/0: f2
+run/0: instruction f2/0
+run/0: ingredient 0 is 34
+mem/0: storing 34 in location 1
+schedule/0: waking up routine
+schedule/0: f1
+run/0: instruction f1/3
+run/0: ingredient 0 is 1
+mem/0: location 1 is 34
+mem/0: storing 34 in location 2
diff --git a/cpp/.traces/string-append-1 b/cpp/.traces/string-append-1
index dbc84dcb..8dd9c849 100644
--- a/cpp/.traces/string-append-1
+++ b/cpp/.traces/string-append-1
@@ -1,7 +1,7 @@
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "hello,", value: 0, type: 0, properties: ["hello,": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: " world!", value: 0, type: 0, properties: [" world!": "literal-string"]}
 parse/0:   product: {name: "2", value: 0, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
 parse/0: instruction: 106
diff --git a/cpp/.traces/string-equal-common-lengths-but-distinct b/cpp/.traces/string-equal-common-lengths-but-distinct
index 45605a29..a21aaafe 100644
--- a/cpp/.traces/string-equal-common-lengths-but-distinct
+++ b/cpp/.traces/string-equal-common-lengths-but-distinct
@@ -1,11 +1,11 @@
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "abd", value: 0, type: 0, properties: ["abd": "literal-string"]}
 parse/0:   product: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 parse/0: instruction: 100
diff --git a/cpp/.traces/string-equal-distinct-lengths b/cpp/.traces/string-equal-distinct-lengths
index 249f6a32..e410fdc1 100644
--- a/cpp/.traces/string-equal-distinct-lengths
+++ b/cpp/.traces/string-equal-distinct-lengths
@@ -1,11 +1,11 @@
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "abcd", value: 0, type: 0, properties: ["abcd": "literal-string"]}
 parse/0:   product: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 parse/0: instruction: 100
diff --git a/cpp/.traces/string-equal-identical b/cpp/.traces/string-equal-identical
index bd621b78..cf783038 100644
--- a/cpp/.traces/string-equal-identical
+++ b/cpp/.traces/string-equal-identical
@@ -1,11 +1,11 @@
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 parse/0: instruction: 100
diff --git a/cpp/.traces/string-equal-reflexive b/cpp/.traces/string-equal-reflexive
index b0379aee..6889bd9d 100644
--- a/cpp/.traces/string-equal-reflexive
+++ b/cpp/.traces/string-equal-reflexive
@@ -1,8 +1,8 @@
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
 parse/0: instruction: 100
diff --git a/cpp/.traces/string-equal-with-empty b/cpp/.traces/string-equal-with-empty
index f7c4fb88..c25963b3 100644
--- a/cpp/.traces/string-equal-with-empty
+++ b/cpp/.traces/string-equal-with-empty
@@ -1,11 +1,11 @@
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "", value: 0, type: 0, properties: ["": "literal-string"]}
 parse/0:   product: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "abcd", value: 0, type: 0, properties: ["abcd": "literal-string"]}
 parse/0:   product: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 parse/0: instruction: 100
diff --git a/cpp/.traces/string_literal b/cpp/.traces/string_literal
index be063bc6..966b5166 100644
--- a/cpp/.traces/string_literal
+++ b/cpp/.traces/string_literal
@@ -1,3 +1,3 @@
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "abc def", value: 0, type: 0, properties: ["abc def": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character"]}
diff --git a/cpp/.traces/string_literal_nested b/cpp/.traces/string_literal_nested
index 3b22a0d6..963b8ad8 100644
--- a/cpp/.traces/string_literal_nested
+++ b/cpp/.traces/string_literal_nested
@@ -1,3 +1,3 @@
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "abc [def]", value: 0, type: 0, properties: ["abc [def]": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character"]}
diff --git a/cpp/.traces/string_literal_with_colons b/cpp/.traces/string_literal_with_colons
index 95200b73..a646ca0f 100644
--- a/cpp/.traces/string_literal_with_colons
+++ b/cpp/.traces/string_literal_with_colons
@@ -1,3 +1,3 @@
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "abc:def/ghi", value: 0, type: 0, properties: ["abc:def/ghi": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character"]}
diff --git a/cpp/038scheduler.cc b/cpp/038scheduler.cc
index f0f970dd..76b90933 100644
--- a/cpp/038scheduler.cc
+++ b/cpp/038scheduler.cc
@@ -18,7 +18,7 @@ recipe f2 [
 void run_current_routine(size_t time_slice)
 :(replace "while (!Current_routine->completed())" following "void run_current_routine(size_t time_slice)")
 size_t ninstrs = 0;
-while (!Current_routine->completed() && ninstrs < time_slice)
+while (Current_routine->state == RUNNING && ninstrs < time_slice)
 :(after "Running One Instruction")
 ninstrs++;
 
@@ -28,7 +28,7 @@ ninstrs++;
 enum routine_state {
   RUNNING,
   COMPLETED,
-  // End Routine States
+  // End routine States
 };
 :(before "End routine Fields")
 enum routine_state state;
diff --git a/cpp/039wait.cc b/cpp/039wait.cc
new file mode 100644
index 00000000..eba3a437
--- /dev/null
+++ b/cpp/039wait.cc
@@ -0,0 +1,57 @@
+//: Routines can be put in a 'waiting' state, from which it will be ready to
+//: run again when a specific memory location changes its value. This is mu's
+//: basic technique for orchestrating the order in which different routines
+//: operate.
+
+:(scenario "stalled_routine")
+recipe f1 [
+  1:integer <- copy 0:literal
+  run f2:recipe
+  wait-for-location 1:integer
+  # now wait for f2 to run and modify location 1 before using its value
+  2:integer <- copy 1:integer
+]
+recipe f2 [
+  1:integer <- copy 34:literal
+]
+# if we got the synchronization wrong we'd be storing 0 in location 2
++mem: storing 34 in location 2
+
+//: define the new state that all routines can be in
+
+:(before "End routine States")
+WAITING,
+:(before "End routine Fields")
+// only if state == WAITING
+size_t waiting_on_location;
+int old_value_of_wating_location;
+:(before "End routine Constructor")
+waiting_on_location = old_value_of_wating_location = 0;
+
+//: primitive recipe to put routines in that state
+
+:(before "End Primitive Recipe Declarations")
+WAIT_FOR_LOCATION,
+:(before "End Primitive Recipe Numbers")
+Recipe_number["wait-for-location"] = WAIT_FOR_LOCATION;
+:(before "End Primitive Recipe Implementations")
+case WAIT_FOR_LOCATION: {
+  reagent loc = canonize(current_instruction().ingredients[0]);
+  Current_routine->state = WAITING;
+  Current_routine->waiting_on_location = loc.value;
+  Current_routine->old_value_of_wating_location = Memory[loc.value];
+  trace("run") << "waiting for " << loc.value << " to change from " << Memory[loc.value];
+  break;
+}
+
+//: scheduler tweak to get routines out of that state
+
+:(before "End Scheduler State Transitions")
+for (size_t i = 0; i < Routines.size(); ++i) {
+  if (Routines[i]->state != WAITING) continue;
+  if (Memory[Routines[i]->waiting_on_location] != Routines[i]->old_value_of_wating_location) {
+    trace("schedule") << "waking up routine\n";
+    Routines[i]->state = RUNNING;
+    Routines[i]->waiting_on_location = Routines[i]->old_value_of_wating_location = 0;
+  }
+}
iler/semdata.nim?h=devel&id=95abf30fae3d1d91e1980fa9a5a46e7319201cd8'>^
0440aea69 ^

















7e747d11c ^
0440aea69 ^
e1a921ce4 ^
e25474154 ^
328e7a100 ^
e25474154 ^

e1a921ce4 ^
e25474154 ^
e1b175943 ^















40ec7be45 ^
e25474154 ^
b92fd3028 ^
b731e6ef1 ^
e1b175943 ^
92c2a51bf ^
e25474154 ^
93fa75bb0 ^
5b28d0820 ^
1786e3099 ^
ade67f1ab ^
fd4ef6ae8 ^
804e2ac89 ^
55f8ed245 ^
b731e6ef1 ^
40ec7be45 ^
9e6fb3f69 ^
38dee2095 ^
3aa7c2232 ^
ee366f174 ^
e25474154 ^
366b6be4f ^
7e747d11c ^
5d63ecb3a ^
7e747d11c ^
1786e3099 ^





e25474154 ^
773d17cd1 ^
e25474154 ^

5d63ecb3a ^
773d17cd1 ^
43de61f37 ^

e25474154 ^

773d17cd1 ^
46efaf294 ^
773d17cd1 ^

e25474154 ^
e1a921ce4 ^
e25474154 ^
815724db7 ^


e4081a720 ^
815724db7 ^
e4081a720 ^
815724db7 ^


e1a921ce4 ^
815724db7 ^
e4081a720 ^

bcd8053b2 ^

e4081a720 ^
e1a921ce4 ^
22dc76a36 ^
1e63f1edb ^






22dc76a36 ^
815724db7 ^



bf592c4e9 ^
e1a921ce4 ^
e25474154 ^
6378fbd66 ^
a49b06a52 ^
bf592c4e9 ^
a49b06a52 ^
328e7a100 ^

6378fbd66 ^

789ba107c ^

247af96b0 ^
789ba107c ^

cd0256136 ^
bc0183509 ^


1ffae7cba ^

46efaf294 ^
1ffae7cba ^




76c663f69 ^

1ffae7cba ^
1d02f2ea5 ^


72291875b ^

71695ab79 ^
e55f5d1fd ^
1d02f2ea5 ^


9c4a60193 ^









72291875b ^

71695ab79 ^
e55f5d1fd ^
1d02f2ea5 ^



72291875b ^
71695ab79 ^
e55f5d1fd ^
1d02f2ea5 ^
e1a921ce4 ^
4b7655fd1 ^
e1a921ce4 ^
4b7655fd1 ^


e1a921ce4 ^
4b7655fd1 ^

0f2c4be12 ^

4b7655fd1 ^
afbcd1b33 ^
e1a921ce4 ^
4b7655fd1 ^
76c663f69 ^
0f2c4be12 ^
4b7655fd1 ^
b595fc834 ^

79aaf213d ^
aa072b952 ^
b595fc834 ^
c7158af75 ^



773d17cd1 ^
e25474154 ^
46efaf294 ^
e25474154 ^

92b8fac94 ^
e1a921ce4 ^

7063670a2 ^
7e747d11c ^

e25474154 ^

8682ed9bd ^
d10b524c9 ^
c7158af75 ^
1a61c4d46 ^
4fbba0a65 ^


e1a921ce4 ^

5b28d0820 ^
e1a921ce4 ^

fe30ec83e ^
e1a921ce4 ^
7e747d11c ^
5d63ecb3a ^
e1a921ce4 ^
7e747d11c ^
9fb36bd20 ^
5d63ecb3a ^
4b7de4dc5 ^
f77442609 ^

7e747d11c ^
f77442609 ^





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441

 
                            
                                         




                                                   
                                                                            
 
      
                                                         
                                                
 
    
                                                                            


                                  
                      
                           
                                                          

                                  
                          
                                                                          


                                                                       
                                                                

                                                                
                                                                             
                                                                        
                                                                    
                                                                              
                        
                      
                                                
 




                              


                              
 
                   











                                                                     
                                                        
                                                            
                                                            


                                                                           
 
                              
 
                          

                                                                       
                              
                                                                        


                                                                
                                                  
                                                                            
                                                                         

                                                                            
                                                                  
 
                                                                     
                                                                         
                                                                
                                                                     
                                                               
                                                                      
                                    
                                                                      

                                                             
                                   

                                                                              
                                                             
                                                                                    
                                                                                     
                                                                                        
                                                                     
                                                                        
                                                                                        
                                                                                            
                                                           
                                                                                      
                                                                             
                                                                        

                                                                    
                                                                      
                                                                                  
                           
                              
                                                                          
                                                         
                                                                                         
                                                                          
                                                           
                                                                        
                        
                                                                             
                                                                            
                     
                      
                       
                          
                         
                          
                           
                       




                                                              
                                          
                                            
 

                                                         



                                                                       

                                     
                                                          
 



                                                              
                                       



                                          
                             
 
                                           
                           
 
                             
                                                                           
                                           
 
                                                  
                            
 
                                                         
 
                                        


                          



                                         
                                    

                                          

















                                                              
                              
 
                                                     
             
                               

                              
                           
 















                                                  
                                                              
             
                                                  
                                        
                                                      
                   
                        
                                  
                         
                       
                                     
                                     
                                  
                       
                                     
                            
                      
                                 
                           
                                         
 
                                          
                      
                               
          





                                             
 
                                    

                                                         
 
                                      

                                                     

                 
                                                     
                                         

                                                        
                             
                                    
 


                                                    
                                                                        
 
                                                                           


                                  
                                      
 

                                                                      

                     
                              
                                      
 






                                                                      
                                                    



                                    
                                             
                                
 
                                                                        
                                        
                                             
                                                        

                                                                 

                              

                                                      
                 

              
                                                                              


                               

                                                   
                                         




                                                    

                                                                
 


                                                      

                              
                                                          
                             


                                                     









                                            

                              
                                                          
                             



                                                  
                              
                                             
                             
 
                                              
                                     
                                                                


                                                                 
                                                  

                               

                                     
                                        
                               
                                        
 
                                                    
                         
 

                                               
                               
                                          
 



                                               
                                                            
                  
                              

                 
                                                         

                                                                                 
                                 

                                      

                               
                                                       
 
                                                     
                                                                   


                                        

                                                                                
 

                                                                               
 
                                                            
                                           
 
                                                               
                                          
 
                                                
                                         

                                                     
                                    





                                                
ss="p"><span id="L71" class="LineNr"> 71 </span>  <span class="Delimiter">}</span>
<span id="L72" class="LineNr"> 72 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L73" class="LineNr"> 73 </span>    <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// not done with caller; don't increment current_step_index()</span>
<span id="L74" class="LineNr"> 74 </span>  <span class="Delimiter">}</span>
<span id="L75" class="LineNr"> 75 </span><span class="Delimiter">}</span>
<span id="L76" class="LineNr"> 76 </span>
<span id="L77" class="LineNr"> 77 </span><span class="Comment">//: To show results in the sandbox Mu uses a hack: it saves the products</span>
<span id="L78" class="LineNr"> 78 </span><span class="Comment">//: returned by each instruction while Track_most_recent_products is true, and</span>
<span id="L79" class="LineNr"> 79 </span><span class="Comment">//: keeps the most recent such result around so that it can be returned as the</span>
<span id="L80" class="LineNr"> 80 </span><span class="Comment">//: result of a sandbox.</span>
<span id="L81" class="LineNr"> 81 </span>
<span id="L82" class="LineNr"> 82 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L83" class="LineNr"> 83 </span><span class="Normal">bool</span> Track_most_recent_products =<span class="Constant"> false</span><span class="Delimiter">;</span>
<span id="L84" class="LineNr"> 84 </span><span class="Normal">int</span> Call_depth_to_track_most_recent_products_at = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L85" class="LineNr"> 85 </span>string Most_recent_products<span class="Delimiter">;</span>
<span id="L86" class="LineNr"> 86 </span><span class="Delimiter">:(before &quot;End Reset&quot;)</span>
<span id="L87" class="LineNr"> 87 </span>Track_most_recent_products =<span class="Constant"> false</span><span class="Delimiter">;</span>
<span id="L88" class="LineNr"> 88 </span>Call_depth_to_track_most_recent_products_at = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L89" class="LineNr"> 89 </span>Most_recent_products = <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L90" class="LineNr"> 90 </span>
<span id="L91" class="LineNr"> 91 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L92" class="LineNr"> 92 </span>trace_stream* Save_trace_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span>
<span id="L93" class="LineNr"> 93 </span>string Save_trace_file<span class="Delimiter">;</span>
<span id="L94" class="LineNr"> 94 </span><span class="Delimiter">:(code)</span>
<span id="L95" class="LineNr"> 95 </span><span class="Comment">// reads a string, tries to call it as code (treating it as a test), saving</span>
<span id="L96" class="LineNr"> 96 </span><span class="Comment">// all errors.</span>
<span id="L97" class="LineNr"> 97 </span><span class="Comment">// returns true if successfully called (no errors found during load and transform)</span>
<span id="L98" class="LineNr"> 98 </span><span class="Normal">bool</span> <a href='101run_sandboxed.cc.html#L98'>run_interactive</a><span class="Delimiter">(</span><span class="Normal">int</span> <a href='043space.cc.html#L101'>address</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L99" class="LineNr"> 99 </span><span class="CommentedCode">//?   cerr &lt;&lt; &quot;run_interactive: &quot; &lt;&lt; address &lt;&lt; '\n';</span>
<span id="L100" class="LineNr">100 </span>  assert<span class="Delimiter">(</span><a href='001help.cc.html#L226'>contains_key</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">)</span> &amp;&amp; get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">)</span> != <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L101" class="LineNr">101 </span>  <span class="Comment">// try to sandbox the run as best you can</span>
<span id="L102" class="LineNr">102 </span>  <span class="Comment">// todo: test this</span>
<span id="L103" class="LineNr">103 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!Current_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L104" class="LineNr">104 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">1</span><span class="Delimiter">;</span> i &lt; Reserved_for_tests<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span>
<span id="L105" class="LineNr">105 </span>      Memory<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L106" class="LineNr">106 </span>  <span class="Delimiter">}</span>
<span id="L107" class="LineNr">107 </span>  string command = <a href='003trace.cc.html#L394'>trim</a><span class="Delimiter">(</span><a href='101run_sandboxed.cc.html#L494'>strip_comments</a><span class="Delimiter">(</span><a href='038new_text.cc.html#L142'>read_mu_text</a><span class="Delimiter">(</span><a href='043space.cc.html#L101'>address</a><span class="Delimiter">)));</span>
<span id="L108" class="LineNr">108 </span><span class="CommentedCode">//?   cerr &lt;&lt; &quot;command: &quot; &lt;&lt; command &lt;&lt; '\n';</span>
<span id="L109" class="LineNr">109 </span>  Name[get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">)</span>]<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span>
<span id="L110" class="LineNr">110 </span>  <a href='101run_sandboxed.cc.html#L153'>run_code_begin</a><span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">should_stash_snapshots</span><span class="Comment">*/</span><span class="Constant">true</span><span class="Delimiter">);</span>
<span id="L111" class="LineNr">111 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>command<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Constant"> false</span><span class="Delimiter">;</span>
<span id="L112" class="LineNr">112 </span>  <span class="Comment">// don't kill the current routine on parse errors</span>
<span id="L113" class="LineNr">113 </span>  routine* save_current_routine = Current_routine<span class="Delimiter">;</span>
<span id="L114" class="LineNr">114 </span>  Current_routine = <span class="Constant">NULL</span><span class="Delimiter">;</span>
<span id="L115" class="LineNr">115 </span>  <span class="Comment">// call run(string) but without the scheduling</span>
<span id="L116" class="LineNr">116 </span>  load<span class="Delimiter">(</span>string<span class="Delimiter">(</span><span class="Constant">&quot;recipe! interactive [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">)</span> +
<span id="L117" class="LineNr">117 </span>          <span class="Constant">&quot;local-scope</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L118" class="LineNr">118 </span>          <span class="Constant">&quot;screen:&amp;:screen &lt;- next-ingredient</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L119" class="LineNr">119 </span>          <span class="Constant">&quot;$start-tracking-products</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L120" class="LineNr">120 </span>          command + <span class="Constant">&quot;</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L121" class="LineNr">121 </span>          <span class="Constant">&quot;$stop-tracking-products</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L122" class="LineNr">122 </span>          <span class="Constant">&quot;return screen</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L123" class="LineNr">123 </span>       <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
<span id="L124" class="LineNr">124 </span>  <a href='012transform.cc.html#L46'>transform_all</a><span class="Delimiter">();</span>
<span id="L125" class="LineNr">125 </span>  Current_routine = save_current_routine<span class="Delimiter">;</span>
<span id="L126" class="LineNr">126 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">&quot;error&quot;</span><span class="Delimiter">)</span> &gt; <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Constant"> false</span><span class="Delimiter">;</span>
<span id="L127" class="LineNr">127 </span>  <span class="Comment">// now call 'sandbox' which will run 'interactive' in a separate routine,</span>
<span id="L128" class="LineNr">128 </span>  <span class="Comment">// and wait for it</span>
<span id="L129" class="LineNr">129 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>Save_trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L130" class="LineNr">130 </span>    ++Save_trace_stream<span class="Delimiter">-&gt;</span>callstack_depth<span class="Delimiter">;</span>
<span id="L131" class="LineNr">131 </span>    <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;trace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;run-sandboxed: incrementing callstack depth to &quot;</span> &lt;&lt; Save_trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L132" class="LineNr">132 </span>    assert<span class="Delimiter">(</span>Save_trace_stream<span class="Delimiter">-&gt;</span>callstack_depth &lt; <span class="Constant">9000</span><span class="Delimiter">);</span>  <span class="Comment">// 9998-101 plus cushion</span>
<span id="L133" class="LineNr">133 </span>  <span class="Delimiter">}</span>
<span id="L134" class="LineNr">134 </span>  Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;sandbox&quot;</span><span class="Delimiter">)));</span>
<span id="L135" class="LineNr">135 </span>  <span class="Identifier">return</span><span class="Constant"> true</span><span class="Delimiter">;</span>
<span id="L136" class="LineNr">136 </span><span class="Delimiter">}</span>
<span id="L137" class="LineNr">137 </span>
<span id="L138" class="LineNr">138 </span><span class="Comment">//: Carefully update all state to exactly how it was -- including snapshots.</span>
<span id="L139" class="LineNr">139 </span>
<span id="L140" class="LineNr">140 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L141" class="LineNr">141 </span><span class="Normal">bool</span> Run_profiler_stash =<span class="Constant"> false</span><span class="Delimiter">;</span>
<span id="L142" class="LineNr">142 </span>map&lt;string<span class="Delimiter">,</span> recipe_ordinal&gt; Recipe_ordinal_snapshot_stash<span class="Delimiter">;</span>
<span id="L143" class="LineNr">143 </span>map&lt;recipe_ordinal<span class="Delimiter">,</span> recipe&gt; Recipe_snapshot_stash<span class="Delimiter">;</span>
<span id="L144" class="LineNr">144 </span>map&lt;string<span class="Delimiter">,</span> type_ordinal&gt; Type_ordinal_snapshot_stash<span class="Delimiter">;</span>
<span id="L145" class="LineNr">145 </span>map&lt;type_ordinal<span class="Delimiter">,</span> type_info&gt; Type_snapshot_stash<span class="Delimiter">;</span>
<span id="L146" class="LineNr">146 </span>map&lt;recipe_ordinal<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt; &gt; Name_snapshot_stash<span class="Delimiter">;</span>
<span id="L147" class="LineNr">147 </span>map&lt;string<span class="Delimiter">,</span> vector&lt;recipe_ordinal&gt; &gt; Recipe_variants_snapshot_stash<span class="Delimiter">;</span>
<span id="L148" class="LineNr">148 </span>map&lt;string<span class="Delimiter">,</span> type_tree*&gt; Type_abbreviations_snapshot_stash<span class="Delimiter">;</span>
<span id="L149" class="LineNr">149 </span>vector&lt;scenario&gt; Scenarios_snapshot_stash<span class="Delimiter">;</span>
<span id="L150" class="LineNr">150 </span>set&lt;string&gt; Scenario_names_snapshot_stash<span class="Delimiter">;</span>
<span id="L151" class="LineNr">151 </span>
<span id="L152" class="LineNr">152 </span><span class="Delimiter">:(code)</span>
<span id="L153" class="LineNr">153 </span><span class="Normal">void</span> <a href='101run_sandboxed.cc.html#L153'>run_code_begin</a><span class="Delimiter">(</span><span class="Normal">bool</span> should_stash_snapshots<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L154" class="LineNr">154 </span>  <span class="Comment">// stuff to undo later, in run_code_end()</span>
<span id="L155" class="LineNr">155 </span>  Hide_errors =<span class="Constant"> true</span><span class="Delimiter">;</span>
<span id="L156" class="LineNr">156 </span>  Disable_redefine_checks =<span class="Constant"> true</span><span class="Delimiter">;</span>
<span id="L157" class="LineNr">157 </span>  Run_profiler_stash = Run_profiler<span class="Delimiter">;</span>
<span id="L158" class="LineNr">158 </span>  Run_profiler =<span class="Constant"> false</span><span class="Delimiter">;</span>
<span id="L159" class="LineNr">159 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>should_stash_snapshots<span class="Delimiter">)</span>
<span id="L160" class="LineNr">160 </span>    <a href='101run_sandboxed.cc.html#L184'>stash_snapshots</a><span class="Delimiter">();</span>
<span id="L161" class="LineNr">161 </span>  Save_trace_stream = Trace_stream<span class="Delimiter">;</span>
<span id="L162" class="LineNr">162 </span>  Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span>
<span id="L163" class="LineNr">163 </span>  Trace_stream<span class="Delimiter">-&gt;</span>collect_depth = App_depth<span class="Delimiter">;</span>
<span id="L164" class="LineNr">164 </span><span class="Delimiter">}</span>
<span id="L165" class="LineNr">165 </span>
<span id="L166" class="LineNr">166 </span><span class="Normal">void</span> <a href='101run_sandboxed.cc.html#L166'>run_code_end</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L167" class="LineNr">167 </span>  Hide_errors =<span class="Constant"> false</span><span class="Delimiter">;</span>
<span id="L168" class="LineNr">168 </span>  Disable_redefine_checks =<span class="Constant"> false</span><span class="Delimiter">;</span>
<span id="L169" class="LineNr">169 </span>  Run_profiler = Run_profiler_stash<span class="Delimiter">;</span>
<span id="L170" class="LineNr">170 </span>  Run_profiler_stash =<span class="Constant"> false</span><span class="Delimiter">;</span>
<span id="L171" class="LineNr">171 </span><span class="CommentedCode">//?   ofstream fout(&quot;sandbox.log&quot;);</span>
<span id="L172" class="LineNr">172 </span><span class="CommentedCode">//?   fout &lt;&lt; Trace_stream-&gt;readable_contents(&quot;&quot;);</span>
<span id="L173" class="LineNr">173 </span><span class="CommentedCode">//?   fout.close();</span>
<span id="L174" class="LineNr">174 </span>  <span class="Normal">delete</span> Trace_stream<span class="Delimiter">;</span>
<span id="L175" class="LineNr">175 </span>  Trace_stream = Save_trace_stream<span class="Delimiter">;</span>
<span id="L176" class="LineNr">176 </span>  Save_trace_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span>
<span id="L177" class="LineNr">177 </span>  Save_trace_file<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span>
<span id="L178" class="LineNr">178 </span>  Recipe<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">));</span>  <span class="Comment">// keep past sandboxes from inserting errors</span>
<span id="L179" class="LineNr">179 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!Recipe_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
<span id="L180" class="LineNr">180 </span>    <a href='101run_sandboxed.cc.html#L205'>unstash_snapshots</a><span class="Delimiter">();</span>
<span id="L181" class="LineNr">181 </span><span class="Delimiter">}</span>
<span id="L182" class="LineNr">182 </span>
<span id="L183" class="LineNr">183 </span><span class="Comment">// keep sync'd with save_snapshots and restore_snapshots</span>
<span id="L184" class="LineNr">184 </span><span class="Normal">void</span> <a href='101run_sandboxed.cc.html#L184'>stash_snapshots</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L185" class="LineNr">185 </span>  assert<span class="Delimiter">(</span>Recipe_ordinal_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
<span id="L186" class="LineNr">186 </span>  Recipe_ordinal_snapshot_stash = Recipe_ordinal_snapshot<span class="Delimiter">;</span>
<span id="L187" class="LineNr">187 </span>  assert<span class="Delimiter">(</span>Recipe_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
<span id="L188" class="LineNr">188 </span>  Recipe_snapshot_stash = Recipe_snapshot<span class="Delimiter">;</span>
<span id="L189" class="LineNr">189 </span>  assert<span class="Delimiter">(</span>Type_ordinal_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
<span id="L190" class="LineNr">190 </span>  Type_ordinal_snapshot_stash = Type_ordinal_snapshot<span class="Delimiter">;</span>
<span id="L191" class="LineNr">191 </span>  assert<span class="Delimiter">(</span>Type_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
<span id="L192" class="LineNr">192 </span>  Type_snapshot_stash = Type_snapshot<span class="Delimiter">;</span>
<span id="L193" class="LineNr">193 </span>  assert<span class="Delimiter">(</span>Name_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
<span id="L194" class="LineNr">194 </span>  Name_snapshot_stash = Name_snapshot<span class="Delimiter">;</span>
<span id="L195" class="LineNr">195 </span>  assert<span class="Delimiter">(</span>Recipe_variants_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
<span id="L196" class="LineNr">196 </span>  Recipe_variants_snapshot_stash = Recipe_variants_snapshot<span class="Delimiter">;</span>
<span id="L197" class="LineNr">197 </span>  assert<span class="Delimiter">(</span>Type_abbreviations_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
<span id="L198" class="LineNr">198 </span>  Type_abbreviations_snapshot_stash = Type_abbreviations_snapshot<span class="Delimiter">;</span>
<span id="L199" class="LineNr">199 </span>  assert<span class="Delimiter">(</span>Scenarios_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
<span id="L200" class="LineNr">200 </span>  Scenarios_snapshot_stash = Scenarios_snapshot<span class="Delimiter">;</span>
<span id="L201" class="LineNr">201 </span>  assert<span class="Delimiter">(</span>Scenario_names_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
<span id="L202" class="LineNr">202 </span>  Scenario_names_snapshot_stash = Scenario_names_snapshot<span class="Delimiter">;</span>
<span id="L203" class="LineNr">203 </span>  save_snapshots<span class="Delimiter">();</span>
<span id="L204" class="LineNr">204 </span><span class="Delimiter">}</span>
<span id="L205" class="LineNr">205 </span><span class="Normal">void</span> <a href='101run_sandboxed.cc.html#L205'>unstash_snapshots</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L206" class="LineNr">206 </span>  restore_snapshots<span class="Delimiter">();</span>
<span id="L207" class="LineNr">207 </span>  Recipe_ordinal_snapshot = Recipe_ordinal_snapshot_stash<span class="Delimiter">;</span>  Recipe_ordinal_snapshot_stash<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span>
<span id="L208" class="LineNr">208 </span>  Recipe_snapshot = Recipe_snapshot_stash<span class="Delimiter">;</span>  Recipe_snapshot_stash<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span>
<span id="L209" class="LineNr">209 </span>  Type_ordinal_snapshot = Type_ordinal_snapshot_stash<span class="Delimiter">;</span>  Type_ordinal_snapshot_stash<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span>
<span id="L210" class="LineNr">210 </span>  Type_snapshot = Type_snapshot_stash<span class="Delimiter">;</span>  Type_snapshot_stash<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span>
<span id="L211" class="LineNr">211 </span>  Name_snapshot = Name_snapshot_stash<span class="Delimiter">;</span>  Name_snapshot_stash<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span>
<span id="L212" class="LineNr">212 </span>  Recipe_variants_snapshot = Recipe_variants_snapshot_stash<span class="Delimiter">;</span>  Recipe_variants_snapshot_stash<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span>
<span id="L213" class="LineNr">213 </span>  Type_abbreviations_snapshot = Type_abbreviations_snapshot_stash<span class="Delimiter">;</span>  Type_abbreviations_snapshot_stash<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span>
<span id="L214" class="LineNr">214 </span>  Scenarios_snapshot = Scenarios_snapshot_stash<span class="Delimiter">;</span>  Scenarios_snapshot_stash<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span>
<span id="L215" class="LineNr">215 </span>  Scenario_names_snapshot = Scenario_names_snapshot_stash<span class="Delimiter">;</span>  Scenario_names_snapshot_stash<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span>
<span id="L216" class="LineNr">216 </span><span class="Delimiter">}</span>
<span id="L217" class="LineNr">217 </span>
<span id="L218" class="LineNr">218 </span><span class="Delimiter">:(before &quot;End Mu Prelude&quot;)</span>
<span id="L219" class="LineNr">219 </span>load<span class="Delimiter">(</span>string<span class="Delimiter">(</span>
<span id="L220" class="LineNr">220 </span><span class="Constant">&quot;recipe interactive [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">)</span> +  <span class="Comment">// just a dummy version to initialize the Recipe_ordinal and so on</span>
<span id="L221" class="LineNr">221 </span><span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L222" class="LineNr">222 </span><span class="Constant">&quot;recipe sandbox [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L223" class="LineNr">223 </span>  <span class="Constant">&quot;local-scope</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L224" class="LineNr">224 </span><span class="CommentedCode">//?   &quot;$print [aaa] 10/newline\n&quot; +</span>
<span id="L225" class="LineNr">225 </span>  <span class="Constant">&quot;screen:&amp;:screen &lt;- new-fake-screen 30, 5</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L226" class="LineNr">226 </span>  <span class="Constant">&quot;routine-id:num &lt;- start-running interactive, screen</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L227" class="LineNr">227 </span>  <span class="Constant">&quot;limit-time routine-id, 100000/instructions</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L228" class="LineNr">228 </span>  <span class="Constant">&quot;wait-for-routine routine-id</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L229" class="LineNr">229 </span><span class="CommentedCode">//?   &quot;$print [bbb] 10/newline\n&quot; +</span>
<span id="L230" class="LineNr">230 </span>  <span class="Constant">&quot;instructions-run:num &lt;- number-of-instructions routine-id</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L231" class="LineNr">231 </span>  <span class="Constant">&quot;stash instructions-run [instructions run]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L232" class="LineNr">232 </span>  <span class="Constant">&quot;sandbox-state:num &lt;- routine-state routine-id</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L233" class="LineNr">233 </span>  <span class="Constant">&quot;completed?:bool &lt;- equal sandbox-state, 1/completed</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L234" class="LineNr">234 </span><span class="CommentedCode">//?   &quot;$print [completed: ] completed? 10/newline\n&quot; +</span>
<span id="L235" class="LineNr">235 </span>  <span class="Constant">&quot;output:text &lt;- $most-recent-products</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L236" class="LineNr">236 </span><span class="CommentedCode">//?   &quot;$print [zzz] 10/newline\n&quot; +</span>
<span id="L237" class="LineNr">237 </span><span class="CommentedCode">//?   &quot;$print output\n&quot; +</span>
<span id="L238" class="LineNr">238 </span>  <span class="Constant">&quot;errors:text &lt;- save-errors</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L239" class="LineNr">239 </span>  <span class="Constant">&quot;stashes:text &lt;- save-app-trace</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L240" class="LineNr">240 </span>  <span class="Constant">&quot;$cleanup-run-sandboxed</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L241" class="LineNr">241 </span>  <span class="Constant">&quot;return output, errors, screen, stashes, completed?</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> +
<span id="L242" class="LineNr">242 </span><span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
<span id="L243" class="LineNr">243 </span>
<span id="L244" class="LineNr">244 </span><span class="Comment">//: adjust errors in the sandbox</span>
<span id="L245" class="LineNr">245 </span><span class="Delimiter">:(before &quot;End maybe(recipe_name) Special-cases&quot;)</span>
<span id="L246" class="LineNr">246 </span><span class="Normal">if</span> <span class="Delimiter">(</span>recipe_name == <span class="Constant">&quot;interactive&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L247" class="LineNr">247 </span>
<span id="L248" class="LineNr">248 </span><span class="Delimiter">:(scenario run_interactive_comments)</span>
<span id="L249" class="LineNr">249 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L250" class="LineNr">250 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [<span class="Comment"># ab</span>
<span id="L251" class="LineNr">251 </span>add <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">2</span>]
<span id="L252" class="LineNr">252 </span>  <span class="Constant">2</span>:text<span class="Special"> &lt;- </span>run-sandboxed <span class="Constant">1</span>:text
<span id="L253" class="LineNr">253 </span>  <span class="Constant">3</span>:@:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy *<span class="Constant">2</span>:text
<span id="L254" class="LineNr">254 </span>]
<span id="L255" class="LineNr">255 </span><span class="traceContains">+mem: storing 52 in location 4</span>
<span id="L256" class="LineNr">256 </span>
<span id="L257" class="LineNr">257 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
<span id="L258" class="LineNr">258 </span>_START_TRACKING_PRODUCTS<span class="Delimiter">,</span>
<span id="L259" class="LineNr">259 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
<span id="L260" class="LineNr">260 </span><a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$start-tracking-products&quot;</span><span class="Delimiter">,</span> _START_TRACKING_PRODUCTS<span class="Delimiter">);</span>
<span id="L261" class="LineNr">261 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
<span id="L262" class="LineNr">262 </span><span class="Normal">case</span> _START_TRACKING_PRODUCTS: <span class="Delimiter">{</span>
<span id="L263" class="LineNr">263 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L264" class="LineNr">264 </span><span class="Delimiter">}</span>
<span id="L265" class="LineNr">265 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
<span id="L266" class="LineNr">266 </span><span class="Normal">case</span> _START_TRACKING_PRODUCTS: <span class="Delimiter">{</span>
<span id="L267" class="LineNr">267 </span>  Track_most_recent_products =<span class="Constant"> true</span><span class="Delimiter">;</span>
<span id="L268" class="LineNr">268 </span>  Call_depth_to_track_most_recent_products_at = <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">);</span>
<span id="L269" class="LineNr">269 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L270" class="LineNr">270 </span><span class="Delimiter">}</span>
<span id="L271" class="LineNr">271 </span>
<span id="L272" class="LineNr">272 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
<span id="L273" class="LineNr">273 </span>_STOP_TRACKING_PRODUCTS<span class="Delimiter">,</span>
<span id="L274" class="LineNr">274 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
<span id="L275" class="LineNr">275 </span><a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$stop-tracking-products&quot;</span><span class="Delimiter">,</span> _STOP_TRACKING_PRODUCTS<span class="Delimiter">);</span>
<span id="L276" class="LineNr">276 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
<span id="L277" class="LineNr">277 </span><span class="Normal">case</span> _STOP_TRACKING_PRODUCTS: <span class="Delimiter">{</span>
<span id="L278" class="LineNr">278 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L279" class="LineNr">279 </span><span class="Delimiter">}</span>
<span id="L280" class="LineNr">280 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
<span id="L281" class="LineNr">281 </span><span class="Normal">case</span> _STOP_TRACKING_PRODUCTS: <span class="Delimiter">{</span>
<span id="L282" class="LineNr">282 </span>  Track_most_recent_products =<span class="Constant"> false</span><span class="Delimiter">;</span>
<span id="L283" class="LineNr">283 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L284" class="LineNr">284 </span><span class="Delimiter">}</span>
<span id="L285" class="LineNr">285 </span>
<span id="L286" class="LineNr">286 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
<span id="L287" class="LineNr">287 </span>_MOST_RECENT_PRODUCTS<span class="Delimiter">,</span>
<span id="L288" class="LineNr">288 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
<span id="L289" class="LineNr">289 </span><a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$most-recent-products&quot;</span><span class="Delimiter">,</span> _MOST_RECENT_PRODUCTS<span class="Delimiter">);</span>
<span id="L290" class="LineNr">290 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
<span id="L291" class="LineNr">291 </span><span class="Normal">case</span> _MOST_RECENT_PRODUCTS: <span class="Delimiter">{</span>
<span id="L292" class="LineNr">292 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L293" class="LineNr">293 </span><span class="Delimiter">}</span>
<span id="L294" class="LineNr">294 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
<span id="L295" class="LineNr">295 </span><span class="Normal">case</span> _MOST_RECENT_PRODUCTS: <span class="Delimiter">{</span>
<span id="L296" class="LineNr">296 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L297" class="LineNr">297 </span>  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">alloc id</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L298" class="LineNr">298 </span>  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><a href='038new_text.cc.html#L39'>new_mu_text</a><span class="Delimiter">(</span>Most_recent_products<span class="Delimiter">));</span>
<span id="L299" class="LineNr">299 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L300" class="LineNr">300 </span><span class="Delimiter">}</span>
<span id="L301" class="LineNr">301 </span>
<span id="L302" class="LineNr">302 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
<span id="L303" class="LineNr">303 </span>SAVE_ERRORS<span class="Delimiter">,</span>
<span id="L304" class="LineNr">304 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
<span id="L305" class="LineNr">305 </span><a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;save-errors&quot;</span><span class="Delimiter">,</span> SAVE_ERRORS<span class="Delimiter">);</span>
<span id="L306" class="LineNr">306 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
<span id="L307" class="LineNr">307 </span><span class="Normal">case</span> SAVE_ERRORS: <span class="Delimiter">{</span>
<span id="L308" class="LineNr">308 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L309" class="LineNr">309 </span><span class="Delimiter">}</span>
<span id="L310" class="LineNr">310 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
<span id="L311" class="LineNr">311 </span><span class="Normal">case</span> SAVE_ERRORS: <span class="Delimiter">{</span>
<span id="L312" class="LineNr">312 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L313" class="LineNr">313 </span>  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">alloc id</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L314" class="LineNr">314 </span>  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><a href='101run_sandboxed.cc.html#L515'>trace_error_contents</a><span class="Delimiter">());</span>
<span id="L315" class="LineNr">315 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L316" class="LineNr">316 </span><span class="Delimiter">}</span>
<span id="L317" class="LineNr">317 </span>
<span id="L318" class="LineNr">318 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
<span id="L319" class="LineNr">319 </span>SAVE_APP_TRACE<span class="Delimiter">,</span>
<span id="L320" class="LineNr">320 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
<span id="L321" class="LineNr">321 </span><a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;save-app-trace&quot;</span><span class="Delimiter">,</span> SAVE_APP_TRACE<span class="Delimiter">);</span>
<span id="L322" class="LineNr">322 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
<span id="L323" class="LineNr">323 </span><span class="Normal">case</span> SAVE_APP_TRACE: <span class="Delimiter">{</span>
<span id="L324" class="LineNr">324 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L325" class="LineNr">325 </span><span class="Delimiter">}</span>
<span id="L326" class="LineNr">326 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
<span id="L327" class="LineNr">327 </span><span class="Normal">case</span> SAVE_APP_TRACE: <span class="Delimiter">{</span>
<span id="L328" class="LineNr">328 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L329" class="LineNr">329 </span>  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">alloc id</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L330" class="LineNr">330 </span>  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><a href='101run_sandboxed.cc.html#L529'>trace_app_contents</a><span class="Delimiter">());</span>
<span id="L331" class="LineNr">331 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L332" class="LineNr">332 </span><span class="Delimiter">}</span>
<span id="L333" class="LineNr">333 </span>
<span id="L334" class="LineNr">334 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
<span id="L335" class="LineNr">335 </span>_CLEANUP_RUN_SANDBOXED<span class="Delimiter">,</span>
<span id="L336" class="LineNr">336 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
<span id="L337" class="LineNr">337 </span><a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$cleanup-run-sandboxed&quot;</span><span class="Delimiter">,</span> _CLEANUP_RUN_SANDBOXED<span class="Delimiter">);</span>
<span id="L338" class="LineNr">338 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
<span id="L339" class="LineNr">339 </span><span class="Normal">case</span> _CLEANUP_RUN_SANDBOXED: <span class="Delimiter">{</span>
<span id="L340" class="LineNr">340 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L341" class="LineNr">341 </span><span class="Delimiter">}</span>
<span id="L342" class="LineNr">342 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
<span id="L343" class="LineNr">343 </span><span class="Normal">case</span> _CLEANUP_RUN_SANDBOXED: <span class="Delimiter">{</span>
<span id="L344" class="LineNr">344 </span>  <a href='101run_sandboxed.cc.html#L166'>run_code_end</a><span class="Delimiter">();</span>
<span id="L345" class="LineNr">345 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L346" class="LineNr">346 </span><span class="Delimiter">}</span>
<span id="L347" class="LineNr">347 </span>
<span id="L348" class="LineNr">348 </span><span class="Delimiter">:(scenario &quot;run_interactive_converts_result_to_text&quot;)</span>
<span id="L349" class="LineNr">349 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L350" class="LineNr">350 </span>  <span class="Comment"># try to interactively add 2 and 2</span>
<span id="L351" class="LineNr">351 </span>  <span class="Constant">10</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [add <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">2</span>]
<span id="L352" class="LineNr">352 </span>  <span class="Constant">20</span>:text<span class="Special"> &lt;- </span>run-sandboxed <span class="Constant">10</span>:text
<span id="L353" class="LineNr">353 </span>  <span class="Constant">30</span>:@:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy *<span class="Constant">20</span>:text
<span id="L354" class="LineNr">354 </span>]
<span id="L355" class="LineNr">355 </span><span class="Comment"># first letter in the output should be '4' in unicode</span>
<span id="L356" class="LineNr">356 </span><span class="traceContains">+mem: storing 52 in location 31</span>
<span id="L357" class="LineNr">357 </span>
<span id="L358" class="LineNr">358 </span><span class="Delimiter">:(scenario &quot;run_interactive_ignores_products_in_nested_functions&quot;)</span>
<span id="L359" class="LineNr">359 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L360" class="LineNr">360 </span>  <span class="Constant">10</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [foo]
<span id="L361" class="LineNr">361 </span>  <span class="Constant">20</span>:text<span class="Special"> &lt;- </span>run-sandboxed <span class="Constant">10</span>:text
<span id="L362" class="LineNr">362 </span>  <span class="Constant">30</span>:@:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy *<span class="Constant">20</span>:text
<span id="L363" class="LineNr">363 </span>]
<span id="L364" class="LineNr">364 </span><span class="muRecipe">def</span> foo [
<span id="L365" class="LineNr">365 </span>  <span class="Constant">40</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1234</span>
<span id="L366" class="LineNr">366 </span>  <span class="Delimiter">{</span>
<span id="L367" class="LineNr">367 </span>    <span class="Identifier">break</span>
<span id="L368" class="LineNr">368 </span>    reply <span class="Constant">5678</span>
<span id="L369" class="LineNr">369 </span>  <span class="Delimiter">}</span>
<span id="L370" class="LineNr">370 </span>]
<span id="L371" class="LineNr">371 </span><span class="Comment"># no product should have been tracked</span>
<span id="L372" class="LineNr">372 </span><span class="traceContains">+mem: storing 0 in location 30</span>
<span id="L373" class="LineNr">373 </span>
<span id="L374" class="LineNr">374 </span><span class="Delimiter">:(scenario &quot;run_interactive_ignores_products_in_previous_instructions&quot;)</span>
<span id="L375" class="LineNr">375 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L376" class="LineNr">376 </span>  <span class="Constant">10</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [
<span id="L377" class="LineNr">377 </span>    add <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">1</span>  <span class="Comment"># generates a product</span>
<span id="L378" class="LineNr">378 </span>    foo]  <span class="Comment"># no products</span>
<span id="L379" class="LineNr">379 </span>  <span class="Constant">20</span>:text<span class="Special"> &lt;- </span>run-sandboxed <span class="Constant">10</span>:text
<span id="L380" class="LineNr">380 </span>  <span class="Constant">30</span>:@:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy *<span class="Constant">20</span>:text
<span id="L381" class="LineNr">381 </span>]
<span id="L382" class="LineNr">382 </span><span class="muRecipe">def</span> foo [
<span id="L383" class="LineNr">383 </span>  <span class="Constant">40</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1234</span>
<span id="L384" class="LineNr">384 </span>  <span class="Delimiter">{</span>
<span id="L385" class="LineNr">385 </span>    <span class="Identifier">break</span>
<span id="L386" class="LineNr">386 </span>    reply <span class="Constant">5678</span>
<span id="L387" class="LineNr">387 </span>  <span class="Delimiter">}</span>
<span id="L388" class="LineNr">388 </span>]
<span id="L389" class="LineNr">389 </span><span class="Comment"># no product should have been tracked</span>
<span id="L390" class="LineNr">390 </span><span class="traceContains">+mem: storing 0 in location 30</span>
<span id="L391" class="LineNr">391 </span>
<span id="L392" class="LineNr">392 </span><span class="Delimiter">:(scenario &quot;run_interactive_remembers_products_before_final_label&quot;)</span>
<span id="L393" class="LineNr">393 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L394" class="LineNr">394 </span>  <span class="Constant">10</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [
<span id="L395" class="LineNr">395 </span>    add <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">1</span>  <span class="Comment"># generates a product</span>
<span id="L396" class="LineNr">396 </span>    +foo]  <span class="Comment"># no products</span>
<span id="L397" class="LineNr">397 </span>  <span class="Constant">20</span>:text<span class="Special"> &lt;- </span>run-sandboxed <span class="Constant">10</span>:text
<span id="L398" class="LineNr">398 </span>  <span class="Constant">30</span>:@:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy *<span class="Constant">20</span>:text
<span id="L399" class="LineNr">399 </span>]
<span id="L400" class="LineNr">400 </span><span class="muRecipe">def</span> foo [
<span id="L401" class="LineNr">401 </span>  <span class="Constant">40</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1234</span>
<span id="L402" class="LineNr">402 </span>  <span class="Delimiter">{</span>
<span id="L403" class="LineNr">403 </span>    <span class="Identifier">break</span>
<span id="L404" class="LineNr">404 </span>    reply <span class="Constant">5678</span>
<span id="L405" class="LineNr">405 </span>  <span class="Delimiter">}</span>
<span id="L406" class="LineNr">406 </span>]
<span id="L407" class="LineNr">407 </span><span class="Comment"># product tracked</span>
<span id="L408" class="LineNr">408 </span><span class="traceContains">+mem: storing 50 in location 31</span>
<span id="L409" class="LineNr">409 </span>
<span id="L410" class="LineNr">410 </span><span class="Delimiter">:(scenario &quot;run_interactive_returns_text&quot;)</span>
<span id="L411" class="LineNr">411 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L412" class="LineNr">412 </span>  <span class="Comment"># try to interactively add 2 and 2</span>
<span id="L413" class="LineNr">413 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [
<span id="L414" class="LineNr">414 </span>    <span class="Normal">x</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [a]
<span id="L415" class="LineNr">415 </span>    <span class="Normal">y</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [b]
<span id="L416" class="LineNr">416 </span>    <span class="Normal">z</span>:text<span class="Special"> &lt;- </span>append x:text<span class="Delimiter">,</span> y:text
<span id="L417" class="LineNr">417 </span>  ]
<span id="L418" class="LineNr">418 </span>  <span class="Constant">10</span>:text<span class="Special"> &lt;- </span>run-sandboxed <span class="Constant">1</span>:text
<span id="L419" class="LineNr">419 </span><span class="CommentedCode">#?   $print 10:text 10/newline</span>
<span id="L420" class="LineNr">420 </span>  <span class="Constant">20</span>:@:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy *<span class="Constant">10</span>:text
<span id="L421" class="LineNr">421 </span>]
<span id="L422" class="LineNr">422 </span><span class="Comment"># output contains &quot;ab&quot;</span>
<span id="L423" class="LineNr">423 </span><span class="traceContains">+mem: storing 97 in location 21</span>
<span id="L424" class="LineNr">424 </span><span class="traceContains">+mem: storing 98 in location 22</span>
<span id="L425" class="LineNr">425 </span>
<span id="L426" class="LineNr">426 </span><span class="Delimiter">:(scenario &quot;run_interactive_returns_errors&quot;)</span>
<span id="L427" class="LineNr">427 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L428" class="LineNr">428 </span>  <span class="Comment"># run a command that generates an error</span>
<span id="L429" class="LineNr">429 </span>  <span class="Constant">10</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [x:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
<span id="L430" class="LineNr">430 </span>get x:num<span class="Delimiter">,</span> <span class="Constant">foo:offset</span>]
<span id="L431" class="LineNr">431 </span>  <span class="Constant">20</span>:text<span class="Delimiter">,</span> <span class="Constant">30</span>:text<span class="Special"> &lt;- </span>run-sandboxed <span class="Constant">10</span>:text
<span id="L432" class="LineNr">432 </span>  <span class="Constant">40</span>:@:<span class="Normal">char</span><span class="Special"> &lt;- </span>copy *<span class="Constant">30</span>:text
<span id="L433" class="LineNr">433 </span>]
<span id="L434" class="LineNr">434 </span><span class="Comment"># error should be &quot;unknown element foo in container number&quot;</span>
<span id="L435" class="LineNr">435 </span><span class="traceContains">+mem: storing 117 in location 41</span>
<span id="L436" class="LineNr">436 </span><span class="traceContains">+mem: storing 110 in location 42</span>
<span id="L437" class="LineNr">437 </span><span class="traceContains">+mem: storing 107 in location 43</span>
<span id="L438" class="LineNr">438 </span><span class="traceContains">+mem: storing 110 in location 44</span>
<span id="L439" class="LineNr">439 </span><span class="Comment"># ...</span>
<span id="L440" class="LineNr">440 </span>
<span id="L441" class="LineNr">441 </span><span class="Delimiter">:(scenario run_interactive_with_comment)</span>
<span id="L442" class="LineNr">442 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L443" class="LineNr">443 </span>  <span class="Comment"># 2 instructions, with a comment after the first</span>
<span id="L444" class="LineNr">444 </span>  <span class="Constant">10</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [a:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>  <span class="Comment"># abc</span>
<span id="L445" class="LineNr">445 </span><span class="Normal">b</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
<span id="L446" class="LineNr">446 </span>]
<span id="L447" class="LineNr">447 </span>  <span class="Constant">20</span>:text<span class="Delimiter">,</span> <span class="Constant">30</span>:text<span class="Special"> &lt;- </span>run-sandboxed <span class="Constant">10</span>:text
<span id="L448" class="LineNr">448 </span>]
<span id="L449" class="LineNr">449 </span><span class="Comment"># no errors</span>
<span id="L450" class="LineNr">450 </span><span class="Comment"># skip alloc id</span>
<span id="L451" class="LineNr">451 </span><span class="traceContains">+mem: storing 0 in location 30</span>
<span id="L452" class="LineNr">452 </span><span class="traceContains">+mem: storing 0 in location 31</span>
<span id="L453" class="LineNr">453 </span>
<span id="L454" class="LineNr">454 </span><span class="Delimiter">:(after &quot;Running One Instruction&quot;)</span>
<span id="L455" class="LineNr">455 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Track_most_recent_products &amp;&amp; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">)</span> == Call_depth_to_track_most_recent_products_at
<span id="L456" class="LineNr">456 </span>    &amp;&amp; !current_instruction<span class="Delimiter">().</span>is_label
<span id="L457" class="LineNr">457 </span>    &amp;&amp; <a href='026call.cc.html#L89'>current_instruction</a><span class="Delimiter">().</span>name != <span class="Constant">&quot;$stop-tracking-products&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L458" class="LineNr">458 </span>  Most_recent_products = <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L459" class="LineNr">459 </span><span class="Delimiter">}</span>
<span id="L460" class="LineNr">460 </span><span class="Delimiter">:(before &quot;End Running One Instruction&quot;)</span>
<span id="L461" class="LineNr">461 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Track_most_recent_products &amp;&amp; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>Current_routine<span class="Delimiter">-&gt;</span>calls<span class="Delimiter">)</span> == Call_depth_to_track_most_recent_products_at<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L462" class="LineNr">462 </span>  Most_recent_products = <a href='101run_sandboxed.cc.html#L466'>track_most_recent_products</a><span class="Delimiter">(</span><a href='026call.cc.html#L89'>current_instruction</a><span class="Delimiter">(),</span> products<span class="Delimiter">);</span>
<span id="L463" class="LineNr">463 </span><span class="CommentedCode">//?   cerr &lt;&lt; &quot;most recent products: &quot; &lt;&lt; Most_recent_products &lt;&lt; '\n';</span>
<span id="L464" class="LineNr">464 </span><span class="Delimiter">}</span>
<span id="L465" class="LineNr">465 </span><span class="Delimiter">:(code)</span>
<span id="L466" class="LineNr">466 </span>string <a href='101run_sandboxed.cc.html#L466'>track_most_recent_products</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; <a href='010vm.cc.html#L33'>instruction</a><span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;vector&lt;<span class="Normal">double</span>&gt; &gt;&amp; products<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L467" class="LineNr">467 </span>  ostringstream out<span class="Delimiter">;</span>
<span id="L468" class="LineNr">468 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L469" class="LineNr">469 </span>    <span class="Comment">// A sandbox can print a string result, but only if it is actually saved</span>
<span id="L470" class="LineNr">470 </span>    <span class="Comment">// to a variable in the sandbox, because otherwise the results are</span>
<span id="L471" class="LineNr">471 </span>    <span class="Comment">// reclaimed before the sandbox sees them. So you get these interactions</span>
<span id="L472" class="LineNr">472 </span>    <span class="Comment">// in the sandbox:</span>
<span id="L473" class="LineNr">473 </span>    <span class="Comment">//</span>
<span id="L474" class="LineNr">474 </span>    <span class="Comment">//    new [abc]</span>
<span id="L475" class="LineNr">475 </span>    <span class="Comment">//    =&gt; &lt;address&gt;</span>
<span id="L476" class="LineNr">476 </span>    <span class="Comment">//</span>
<span id="L477" class="LineNr">477 </span>    <span class="Comment">//    x:text &lt;- new [abc]</span>
<span id="L478" class="LineNr">478 </span>    <span class="Comment">//    =&gt; abc</span>
<span id="L479" class="LineNr">479 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span><a href='010vm.cc.html#L33'>instruction</a><span class="Delimiter">.</span>products<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L480" class="LineNr">480 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span><a href='027call_ingredient.cc.html#L179'>is_mu_text</a><span class="Delimiter">(</span><a href='010vm.cc.html#L33'>instruction</a><span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
<span id="L481" class="LineNr">481 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// weak silent check for address</span>
<span id="L482" class="LineNr">482 </span>        out &lt;&lt; <a href='038new_text.cc.html#L142'>read_mu_text</a><span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">skip alloc id</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L483" class="LineNr">483 </span>        <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L484" class="LineNr">484 </span>      <span class="Delimiter">}</span>
<span id="L485" class="LineNr">485 </span>    <span class="Delimiter">}</span>
<span id="L486" class="LineNr">486 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> ++j<span class="Delimiter">)</span>
<span id="L487" class="LineNr">487 </span>      out &lt;&lt; no_scientific<span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span>j<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
<span id="L488" class="LineNr">488 </span>    out &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L489" class="LineNr">489 </span>  <span class="Delimiter">}</span>
<span id="L490" class="LineNr">490 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L491" class="LineNr">491 </span><span class="Delimiter">}</span>
<span id="L492" class="LineNr">492 </span>
<span id="L493" class="LineNr">493 </span><span class="Delimiter">:(code)</span>
<span id="L494" class="LineNr">494 </span>string <a href='101run_sandboxed.cc.html#L494'>strip_comments</a><span class="Delimiter">(</span>string in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L495" class="LineNr">495 </span>  ostringstream result<span class="Delimiter">;</span>
<span id="L496" class="LineNr">496 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L497" class="LineNr">497 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> != <span class="Constant">'#'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L498" class="LineNr">498 </span>      result &lt;&lt; in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L499" class="LineNr">499 </span>    <span class="Delimiter">}</span>
<span id="L500" class="LineNr">500 </span>    <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L501" class="LineNr">501 </span>      <span class="Normal">while</span> <span class="Delimiter">(</span>i+<span class="Constant">1</span> &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i+<span class="Constant">1</span><span class="Delimiter">)</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span>
<span id="L502" class="LineNr">502 </span>        ++i<span class="Delimiter">;</span>
<span id="L503" class="LineNr">503 </span>    <span class="Delimiter">}</span>
<span id="L504" class="LineNr">504 </span>  <span class="Delimiter">}</span>
<span id="L505" class="LineNr">505 </span>  <span class="Identifier">return</span> result<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L506" class="LineNr">506 </span><span class="Delimiter">}</span>
<span id="L507" class="LineNr">507 </span>
<span id="L508" class="LineNr">508 </span><span class="Normal">int</span> <a href='101run_sandboxed.cc.html#L508'>stringified_value_of_location</a><span class="Delimiter">(</span><span class="Normal">int</span> <a href='043space.cc.html#L101'>address</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L509" class="LineNr">509 </span>  <span class="Comment">// convert to string</span>
<span id="L510" class="LineNr">510 </span>  ostringstream out<span class="Delimiter">;</span>
<span id="L511" class="LineNr">511 </span>  out &lt;&lt; no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L229'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L101'>address</a><span class="Delimiter">));</span>
<span id="L512" class="LineNr">512 </span>  <span class="Identifier">return</span> <a href='038new_text.cc.html#L39'>new_mu_text</a><span class="Delimiter">(</span>out<span class="Delimiter">.</span>str<span class="Delimiter">());</span>
<span id="L513" class="LineNr">513 </span><span class="Delimiter">}</span>
<span id="L514" class="LineNr">514 </span>
<span id="L515" class="LineNr">515 </span><span class="Normal">int</span> <a href='101run_sandboxed.cc.html#L515'>trace_error_contents</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L516" class="LineNr">516 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!Trace_stream<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L517" class="LineNr">517 </span>  ostringstream out<span class="Delimiter">;</span>
<span id="L518" class="LineNr">518 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;trace_line&gt;::iterator p = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span><a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L519" class="LineNr">519 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>label != <span class="Constant">&quot;error&quot;</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L520" class="LineNr">520 </span>    out &lt;&lt; p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">;</span>
<span id="L521" class="LineNr">521 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>*--p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">.</span><a href='003trace.cc.html#L225'>end</a><span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> out &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L522" class="LineNr">522 </span>  <span class="Delimiter">}</span>
<span id="L523" class="LineNr">523 </span>  string result = out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L524" class="LineNr">524 </span>  <a href='101run_sandboxed.cc.html#L543'>truncate</a><span class="Delimiter">(</span>result<span class="Delimiter">);</span>
<span id="L525" class="LineNr">525 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L526" class="LineNr">526 </span>  <span class="Identifier">return</span> <a href='038new_text.cc.html#L39'>new_mu_text</a><span class="Delimiter">(</span>result<span class="Delimiter">);</span>
<span id="L527" class="LineNr">527 </span><span class="Delimiter">}</span>
<span id="L528" class="LineNr">528 </span>
<span id="L529" class="LineNr">529 </span><span class="Normal">int</span> <a href='101run_sandboxed.cc.html#L529'>trace_app_contents</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L530" class="LineNr">530 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!Trace_stream<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L531" class="LineNr">531 </span>  ostringstream out<span class="Delimiter">;</span>
<span id="L532" class="LineNr">532 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;trace_line&gt;::iterator p = Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-&gt;</span>past_lines<span class="Delimiter">.</span><a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L533" class="LineNr">533 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>depth != App_depth<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L534" class="LineNr">534 </span>    out &lt;&lt; p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">;</span>
<span id="L535" class="LineNr">535 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>*--p<span class="Delimiter">-&gt;</span>contents<span class="Delimiter">.</span><a href='003trace.cc.html#L225'>end</a><span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> out &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L536" class="LineNr">536 </span>  <span class="Delimiter">}</span>
<span id="L537" class="LineNr">537 </span>  string result = out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L538" class="LineNr">538 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L539" class="LineNr">539 </span>  <a href='101run_sandboxed.cc.html#L543'>truncate</a><span class="Delimiter">(</span>result<span class="Delimiter">);</span>
<span id="L540" class="LineNr">540 </span>  <span class="Identifier">return</span> <a href='038new_text.cc.html#L39'>new_mu_text</a><span class="Delimiter">(</span>result<span class="Delimiter">);</span>
<span id="L541" class="LineNr">541 </span><span class="Delimiter">}</span>
<span id="L542" class="LineNr">542 </span>
<span id="L543" class="LineNr">543 </span><span class="Normal">void</span> <a href='101run_sandboxed.cc.html#L543'>truncate</a><span class="Delimiter">(</span>string&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L544" class="LineNr">544 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>x<span class="Delimiter">)</span> &gt; <span class="Constant">1024</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L545" class="LineNr">545 </span>    x<span class="Delimiter">.</span>erase<span class="Delimiter">(</span><span class="Constant">1024</span><span class="Delimiter">);</span>
<span id="L546" class="LineNr">546 </span>    *x<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> = <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L547" class="LineNr">547 </span>    *++x<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> = <span class="Constant">'.'</span><span class="Delimiter">;</span>
<span id="L548" class="LineNr">548 </span>    *++++x<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> = <span class="Constant">'.'</span><span class="Delimiter">;</span>
<span id="L549" class="LineNr">549 </span>  <span class="Delimiter">}</span>
<span id="L550" class="LineNr">550 </span><span class="Delimiter">}</span>
<span id="L551" class="LineNr">551 </span>
<span id="L552" class="LineNr">552 </span><span class="Comment">//: simpler version of run-sandboxed: doesn't do any running, just loads</span>
<span id="L553" class="LineNr">553 </span><span class="Comment">//: recipes and reports errors.</span>
<span id="L554" class="LineNr">554 </span>
<span id="L555" class="LineNr">555 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
<span id="L556" class="LineNr">556 </span>RELOAD<span class="Delimiter">,</span>
<span id="L557" class="LineNr">557 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
<span id="L558" class="LineNr">558 </span><a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;reload&quot;</span><span class="Delimiter">,</span> RELOAD<span class="Delimiter">);</span>
<span id="L559" class="LineNr">559 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
<span id="L560" class="LineNr">560 </span><span class="Normal">case</span> RELOAD: <span class="Delimiter">{</span>
<span id="L561" class="LineNr">561 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L562" class="LineNr">562 </span>    <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'reload' requires exactly one ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L563" class="LineNr">563 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L564" class="LineNr">564 </span>  <span class="Delimiter">}</span>
<span id="L565" class="LineNr">565 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_text<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
<span id="L566" class="LineNr">566 </span>    <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'reload' should be a string, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L567" class="LineNr">567 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L568" class="LineNr">568 </span>  <span class="Delimiter">}</span>
<span id="L569" class="LineNr">569 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L570" class="LineNr">570 </span><span class="Delimiter">}</span>
<span id="L571" class="LineNr">571 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
<span id="L572" class="LineNr">572 </span><span class="Normal">case</span> RELOAD: <span class="Delimiter">{</span>
<span id="L573" class="LineNr">573 </span>  restore_non_recipe_snapshots<span class="Delimiter">();</span>
<span id="L574" class="LineNr">574 </span>  string code = <a href='038new_text.cc.html#L142'>read_mu_text</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">skip alloc id</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">));</span>
<span id="L575" class="LineNr">575 </span>  <a href='101run_sandboxed.cc.html#L153'>run_code_begin</a><span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">should_stash_snapshots</span><span class="Comment">*/</span><span class="Constant">false</span><span class="Delimiter">);</span>
<span id="L576" class="LineNr">576 </span>  routine* save_current_routine = Current_routine<span class="Delimiter">;</span>
<span id="L577" class="LineNr">577 </span>  Current_routine = <span class="Constant">NULL</span><span class="Delimiter">;</span>
<span id="L578" class="LineNr">578 </span>  Sandbox_mode =<span class="Constant"> true</span><span class="Delimiter">;</span>
<span id="L579" class="LineNr">579 </span>  vector&lt;recipe_ordinal&gt; recipes_reloaded = load<span class="Delimiter">(</span>code<span class="Delimiter">);</span>
<span id="L580" class="LineNr">580 </span>  <a href='012transform.cc.html#L46'>transform_all</a><span class="Delimiter">();</span>
<span id="L581" class="LineNr">581 </span>  Trace_stream<span class="Delimiter">-&gt;</span><a href='003trace.cc.html#L147'>newline</a><span class="Delimiter">();</span>  <span class="Comment">// flush trace</span>
<span id="L582" class="LineNr">582 </span>  Sandbox_mode =<span class="Constant"> false</span><span class="Delimiter">;</span>
<span id="L583" class="LineNr">583 </span>  Current_routine = save_current_routine<span class="Delimiter">;</span>
<span id="L584" class="LineNr">584 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L585" class="LineNr">585 </span>  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">alloc id</span><span class="Comment">*/</span><span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L586" class="LineNr">586 </span>  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><a href='101run_sandboxed.cc.html#L515'>trace_error_contents</a><span class="Delimiter">());</span>
<span id="L587" class="LineNr">587 </span>  <a href='101run_sandboxed.cc.html#L166'>run_code_end</a><span class="Delimiter">();</span>  <span class="Comment">// wait until we're done with the trace contents</span>
<span id="L588" class="LineNr">588 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L589" class="LineNr">589 </span><span class="Delimiter">}</span>
<span id="L590" class="LineNr">590 </span>
<span id="L591" class="LineNr">591 </span><span class="Delimiter">:(scenario reload_loads_function_definitions)</span>
<span id="L592" class="LineNr">592 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L593" class="LineNr">593 </span>  local-scope
<span id="L594" class="LineNr">594 </span>  <span class="Normal">x</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [recipe foo [
<span id="L595" class="LineNr">595 </span>    <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>copy <span class="Constant">34</span>
<span id="L596" class="LineNr">596 </span>  ]]
<span id="L597" class="LineNr">597 </span>  reload x
<span id="L598" class="LineNr">598 </span>  run-sandboxed [foo]
<span id="L599" class="LineNr">599 </span>  <span class="Constant">2</span>:num/<span class="Special">raw &lt;- </span>copy <span class="Constant">1</span>:num/<span class="Special">raw</span>
<span id="L600" class="LineNr">600 </span>]
<span id="L601" class="LineNr">601 </span><span class="traceContains">+mem: storing 34 in location 2</span>
<span id="L602" class="LineNr">602 </span>
<span id="L603" class="LineNr">603 </span><span class="Delimiter">:(scenario reload_continues_past_error)</span>
<span id="L604" class="LineNr">604 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L605" class="LineNr">605 </span>  local-scope
<span id="L606" class="LineNr">606 </span>  <span class="Normal">x</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [recipe foo [
<span id="L607" class="LineNr">607 </span>    get <span class="Constant">1234</span>:num<span class="Delimiter">,</span> <span class="Constant">foo:offset</span>
<span id="L608" class="LineNr">608 </span>  ]]
<span id="L609" class="LineNr">609 </span>  reload x
<span id="L610" class="LineNr">610 </span>  <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>copy <span class="Constant">34</span>
<span id="L611" class="LineNr">611 </span>]
<span id="L612" class="LineNr">612 </span><span class="traceContains">+mem: storing 34 in location 1</span>
<span id="L613" class="LineNr">613 </span>
<span id="L614" class="LineNr">614 </span><span class="Delimiter">:(scenario reload_can_repeatedly_load_container_definitions)</span>
<span id="L615" class="LineNr">615 </span><span class="Comment"># define a container and try to create it (merge requires knowing container size)</span>
<span id="L616" class="LineNr">616 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L617" class="LineNr">617 </span>  local-scope
<span id="L618" class="LineNr">618 </span>  <span class="Normal">x</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [
<span id="L619" class="LineNr">619 </span>    container foo [
<span id="L620" class="LineNr">620 </span>      <span class="Normal">x</span>:num
<span id="L621" class="LineNr">621 </span>      <span class="Normal">y</span>:num
<span id="L622" class="LineNr">622 </span>    ]
<span id="L623" class="LineNr">623 </span>    <a href='010vm.cc.html#L19'>recipe</a> bar [
<span id="L624" class="LineNr">624 </span>      local-scope
<span id="L625" class="LineNr">625 </span>      <span class="Normal">x</span>:foo<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
<span id="L626" class="LineNr">626 </span>    ]
<span id="L627" class="LineNr">627 </span>  ]
<span id="L628" class="LineNr">628 </span>  <span class="Comment"># save warning addresses in locations of type 'number' to avoid spurious changes to them due to 'abandon'</span>
<span id="L629" class="LineNr">629 </span>  <span class="Constant">10</span>:text/<span class="Special">raw &lt;- </span>reload x
<span id="L630" class="LineNr">630 </span>  <span class="Constant">20</span>:text/<span class="Special">raw &lt;- </span>reload x
<span id="L631" class="LineNr">631 </span>]
<span id="L632" class="LineNr">632 </span><span class="Comment"># no errors on either load</span>
<span id="L633" class="LineNr">633 </span><span class="traceContains">+mem: storing 0 in location 10</span>
<span id="L634" class="LineNr">634 </span><span class="traceContains">+mem: storing 0 in location 11</span>
<span id="L635" class="LineNr">635 </span><span class="traceContains">+mem: storing 0 in location 20</span>
<span id="L636" class="LineNr">636 </span><span class="traceContains">+mem: storing 0 in location 21</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->