about summary refs log tree commit diff stats
path: root/cpp
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-02-25 01:24:11 -0800
committerKartik K. Agaram <vc@akkartik.com>2015-02-25 01:24:11 -0800
commit6f5d7864f6c0c62b8849349cb182c61f8dbed452 (patch)
treec4c22032dc09eefbc3b55268044d29607804c4fd /cpp
parentdc3803320013059ad400853e3f6a2851f7f82c04 (diff)
downloadmu-6f5d7864f6c0c62b8849349cb182c61f8dbed452.tar.gz
832 - call-stack for C++ version
These #defines and references now span many different layers. Let's see
if the lack of encapsulation causes problems.

Also interesting to run into a case where I need to modify a
foundational layer and touch every single scenario/trace. Only
alternative was to duplicate all the different layers that add
instructions. Sign of problems with this model?
Diffstat (limited to 'cpp')
-rw-r--r--cpp/.traces/add6
-rw-r--r--cpp/.traces/add_literal2
-rw-r--r--cpp/.traces/and6
-rw-r--r--cpp/.traces/copy4
-rw-r--r--cpp/.traces/copy_array10
-rw-r--r--cpp/.traces/copy_indirect6
-rw-r--r--cpp/.traces/copy_literal2
-rw-r--r--cpp/.traces/copy_multiple_locations6
-rw-r--r--cpp/.traces/divide6
-rw-r--r--cpp/.traces/divide_literal2
-rw-r--r--cpp/.traces/divide_with_remainder6
-rw-r--r--cpp/.traces/divide_with_remainder_literal2
-rw-r--r--cpp/.traces/equal6
-rw-r--r--cpp/.traces/equal26
-rw-r--r--cpp/.traces/get6
-rw-r--r--cpp/.traces/get_address6
-rw-r--r--cpp/.traces/get_address_indirect8
-rw-r--r--cpp/.traces/get_handles_record_fields8
-rw-r--r--cpp/.traces/get_indirect8
-rw-r--r--cpp/.traces/greater_or_equal6
-rw-r--r--cpp/.traces/greater_or_equal26
-rw-r--r--cpp/.traces/greater_or_equal36
-rw-r--r--cpp/.traces/greater_than6
-rw-r--r--cpp/.traces/greater_than26
-rw-r--r--cpp/.traces/index10
-rw-r--r--cpp/.traces/index_address10
-rw-r--r--cpp/.traces/jump_backward6
-rw-r--r--cpp/.traces/jump_can_skip_instructions2
-rw-r--r--cpp/.traces/jump_if2
-rw-r--r--cpp/.traces/jump_if_fallthrough4
-rw-r--r--cpp/.traces/jump_unless2
-rw-r--r--cpp/.traces/jump_unless_fallthrough4
-rw-r--r--cpp/.traces/lesser_or_equal6
-rw-r--r--cpp/.traces/lesser_or_equal26
-rw-r--r--cpp/.traces/lesser_or_equal36
-rw-r--r--cpp/.traces/lesser_than6
-rw-r--r--cpp/.traces/lesser_than26
-rw-r--r--cpp/.traces/multiply6
-rw-r--r--cpp/.traces/multiply_literal2
-rw-r--r--cpp/.traces/not4
-rw-r--r--cpp/.traces/or6
-rw-r--r--cpp/.traces/store_indirect4
-rw-r--r--cpp/.traces/subtract6
-rw-r--r--cpp/.traces/subtract_literal2
-rw-r--r--cpp/010vm1
-rw-r--r--cpp/011load1
-rw-r--r--cpp/012run42
-rw-r--r--cpp/013arithmetic20
-rw-r--r--cpp/014boolean6
-rw-r--r--cpp/015jump26
-rw-r--r--cpp/016compare24
-rw-r--r--cpp/017record6
-rw-r--r--cpp/018address8
-rw-r--r--cpp/019array6
54 files changed, 203 insertions, 173 deletions
diff --git a/cpp/.traces/add b/cpp/.traces/add
index 365c75f0..eaa94f85 100644
--- a/cpp/.traces/add
+++ b/cpp/.traces/add
@@ -8,13 +8,13 @@ parse/0: instruction: 2
 parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   ingredient: {name: "2", type: 1}
 parse/0:   product: {name: "3", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 23
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 34
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 23
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/add_literal b/cpp/.traces/add_literal
index fcbb611f..e695a9a0 100644
--- a/cpp/.traces/add_literal
+++ b/cpp/.traces/add_literal
@@ -2,7 +2,7 @@ parse/0: instruction: 2
 parse/0:   ingredient: {name: "23", type: 0}
 parse/0:   ingredient: {name: "34", type: 0}
 parse/0:   product: {name: "1", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 23
 run/0: ingredient 1 is 34
 run/0: product 0 is 57
diff --git a/cpp/.traces/and b/cpp/.traces/and
index 61fe4a64..4bbf11c3 100644
--- a/cpp/.traces/and
+++ b/cpp/.traces/and
@@ -8,13 +8,13 @@ parse/0: instruction: 7
 parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   ingredient: {name: "2", type: 1}
 parse/0:   product: {name: "3", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 1
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 0
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 1
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/copy b/cpp/.traces/copy
index 965b5f2a..507bf92a 100644
--- a/cpp/.traces/copy
+++ b/cpp/.traces/copy
@@ -4,10 +4,10 @@ parse/0:   product: {name: "1", type: 1}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   product: {name: "2", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 23
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 1
 mem/0: location 1 is 23
 mem/0: storing in location 2
diff --git a/cpp/.traces/copy_array b/cpp/.traces/copy_array
index 62253d3e..7350b04e 100644
--- a/cpp/.traces/copy_array
+++ b/cpp/.traces/copy_array
@@ -13,19 +13,19 @@ parse/0:   product: {name: "4", type: 1}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "1", type: 6}
 parse/0:   product: {name: "5", type: 6}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 3
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 14
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 15
 mem/0: storing in location 3
-run/0: instruction 3
+run/0: instruction main/3
 run/0: ingredient 0 is 16
 mem/0: storing in location 4
-run/0: instruction 4
+run/0: instruction main/4
 run/0: ingredient 0 is 1
 mem/0: location 1 is 3
 mem/0: location 2 is 14
diff --git a/cpp/.traces/copy_indirect b/cpp/.traces/copy_indirect
index f757f05a..357d1498 100644
--- a/cpp/.traces/copy_indirect
+++ b/cpp/.traces/copy_indirect
@@ -7,13 +7,13 @@ parse/0:   product: {name: "2", type: 1}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "1", type: 2-1, property: deref:}
 parse/0:   product: {name: "3", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 2
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 34
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 2
 mem/0: location 2 is 34
diff --git a/cpp/.traces/copy_literal b/cpp/.traces/copy_literal
index 94d56f2e..06a6b997 100644
--- a/cpp/.traces/copy_literal
+++ b/cpp/.traces/copy_literal
@@ -1,6 +1,6 @@
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "23", type: 0}
 parse/0:   product: {name: "1", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 23
 mem/0: storing in location 1
diff --git a/cpp/.traces/copy_multiple_locations b/cpp/.traces/copy_multiple_locations
index 9804de88..4ba0d565 100644
--- a/cpp/.traces/copy_multiple_locations
+++ b/cpp/.traces/copy_multiple_locations
@@ -7,13 +7,13 @@ parse/0:   product: {name: "2", type: 1}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "1", type: 4}
 parse/0:   product: {name: "3", type: 4}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 34
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 35
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 34
 mem/0: location 2 is 35
diff --git a/cpp/.traces/divide b/cpp/.traces/divide
index d713a512..4cd49db4 100644
--- a/cpp/.traces/divide
+++ b/cpp/.traces/divide
@@ -8,13 +8,13 @@ parse/0: instruction: 5
 parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   ingredient: {name: "2", type: 1}
 parse/0:   product: {name: "3", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 27
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 3
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 27
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/divide_literal b/cpp/.traces/divide_literal
index 47f8690f..3d29139b 100644
--- a/cpp/.traces/divide_literal
+++ b/cpp/.traces/divide_literal
@@ -2,7 +2,7 @@ parse/0: instruction: 5
 parse/0:   ingredient: {name: "8", type: 0}
 parse/0:   ingredient: {name: "2", type: 0}
 parse/0:   product: {name: "1", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 8
 run/0: ingredient 1 is 2
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/divide_with_remainder b/cpp/.traces/divide_with_remainder
index 330141db..62993a82 100644
--- a/cpp/.traces/divide_with_remainder
+++ b/cpp/.traces/divide_with_remainder
@@ -9,13 +9,13 @@ parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   ingredient: {name: "2", type: 1}
 parse/0:   product: {name: "3", type: 1}
 parse/0:   product: {name: "4", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 27
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 11
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 27
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/divide_with_remainder_literal b/cpp/.traces/divide_with_remainder_literal
index aa3b6478..bcc2451b 100644
--- a/cpp/.traces/divide_with_remainder_literal
+++ b/cpp/.traces/divide_with_remainder_literal
@@ -3,7 +3,7 @@ parse/0:   ingredient: {name: "9", type: 0}
 parse/0:   ingredient: {name: "2", type: 0}
 parse/0:   product: {name: "1", type: 1}
 parse/0:   product: {name: "2", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 9
 run/0: ingredient 1 is 2
 run/0: product 0 is 4
diff --git a/cpp/.traces/equal b/cpp/.traces/equal
index 6d03ccfb..9abcdde6 100644
--- a/cpp/.traces/equal
+++ b/cpp/.traces/equal
@@ -8,13 +8,13 @@ parse/0: instruction: 13
 parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   ingredient: {name: "2", type: 1}
 parse/0:   product: {name: "3", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 34
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 33
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 34
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/equal2 b/cpp/.traces/equal2
index bb52e968..b1d02785 100644
--- a/cpp/.traces/equal2
+++ b/cpp/.traces/equal2
@@ -8,13 +8,13 @@ parse/0: instruction: 13
 parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   ingredient: {name: "2", type: 1}
 parse/0:   product: {name: "3", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 34
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 34
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 34
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/get b/cpp/.traces/get
index 3f5a996e..fed4a487 100644
--- a/cpp/.traces/get
+++ b/cpp/.traces/get
@@ -8,13 +8,13 @@ parse/0: instruction: 18
 parse/0:   ingredient: {name: "12", type: 4}
 parse/0:   ingredient: {name: "1", type: 0}
 parse/0:   product: {name: "15", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 34
 mem/0: storing in location 12
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 35
 mem/0: storing in location 13
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 12
 run/0: ingredient 1 is 1
 run/0: address to copy is 13
diff --git a/cpp/.traces/get_address b/cpp/.traces/get_address
index 296fd6c0..59da3a6d 100644
--- a/cpp/.traces/get_address
+++ b/cpp/.traces/get_address
@@ -8,13 +8,13 @@ parse/0: instruction: 19
 parse/0:   ingredient: {name: "12", type: 4}
 parse/0:   ingredient: {name: "1", type: 0}
 parse/0:   product: {name: "15", type: 2-1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 34
 mem/0: storing in location 12
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 35
 mem/0: storing in location 13
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 12
 run/0: ingredient 1 is 1
 run/0: address to copy is 13
diff --git a/cpp/.traces/get_address_indirect b/cpp/.traces/get_address_indirect
index 6d7b2c24..27591476 100644
--- a/cpp/.traces/get_address_indirect
+++ b/cpp/.traces/get_address_indirect
@@ -11,16 +11,16 @@ parse/0: instruction: 19
 parse/0:   ingredient: {name: "1", type: 2-4, property: deref:}
 parse/0:   ingredient: {name: "0", type: 0}
 parse/0:   product: {name: "4", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 2
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 34
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 35
 mem/0: storing in location 3
-run/0: instruction 3
+run/0: instruction main/3
 run/0: ingredient 0 is 1
 mem/0: location 1 is 2
 run/0: ingredient 1 is 0
diff --git a/cpp/.traces/get_handles_record_fields b/cpp/.traces/get_handles_record_fields
index 6e2f065e..0c1eb7d9 100644
--- a/cpp/.traces/get_handles_record_fields
+++ b/cpp/.traces/get_handles_record_fields
@@ -11,16 +11,16 @@ parse/0: instruction: 18
 parse/0:   ingredient: {name: "12", type: 5}
 parse/0:   ingredient: {name: "1", type: 0}
 parse/0:   product: {name: "15", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 34
 mem/0: storing in location 12
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 35
 mem/0: storing in location 13
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 36
 mem/0: storing in location 14
-run/0: instruction 3
+run/0: instruction main/3
 run/0: ingredient 0 is 12
 run/0: ingredient 1 is 1
 run/0: address to copy is 14
diff --git a/cpp/.traces/get_indirect b/cpp/.traces/get_indirect
index 60ddfd9b..6aaf660d 100644
--- a/cpp/.traces/get_indirect
+++ b/cpp/.traces/get_indirect
@@ -11,16 +11,16 @@ parse/0: instruction: 18
 parse/0:   ingredient: {name: "1", type: 2-4, property: deref:}
 parse/0:   ingredient: {name: "0", type: 0}
 parse/0:   product: {name: "4", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 2
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 34
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 35
 mem/0: storing in location 3
-run/0: instruction 3
+run/0: instruction main/3
 run/0: ingredient 0 is 1
 mem/0: location 1 is 2
 run/0: ingredient 1 is 0
diff --git a/cpp/.traces/greater_or_equal b/cpp/.traces/greater_or_equal
index d01859ca..d347b751 100644
--- a/cpp/.traces/greater_or_equal
+++ b/cpp/.traces/greater_or_equal
@@ -8,13 +8,13 @@ parse/0: instruction: 16
 parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   ingredient: {name: "2", type: 1}
 parse/0:   product: {name: "3", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 34
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 33
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 34
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/greater_or_equal2 b/cpp/.traces/greater_or_equal2
index 6ce24011..4777cecc 100644
--- a/cpp/.traces/greater_or_equal2
+++ b/cpp/.traces/greater_or_equal2
@@ -8,13 +8,13 @@ parse/0: instruction: 16
 parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   ingredient: {name: "2", type: 1}
 parse/0:   product: {name: "3", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 34
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 34
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 34
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/greater_or_equal3 b/cpp/.traces/greater_or_equal3
index 7cba95fb..4e5986ec 100644
--- a/cpp/.traces/greater_or_equal3
+++ b/cpp/.traces/greater_or_equal3
@@ -8,13 +8,13 @@ parse/0: instruction: 16
 parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   ingredient: {name: "2", type: 1}
 parse/0:   product: {name: "3", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 34
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 35
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 34
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/greater_than b/cpp/.traces/greater_than
index aea0dbda..58654c92 100644
--- a/cpp/.traces/greater_than
+++ b/cpp/.traces/greater_than
@@ -8,13 +8,13 @@ parse/0: instruction: 14
 parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   ingredient: {name: "2", type: 1}
 parse/0:   product: {name: "3", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 34
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 33
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 34
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/greater_than2 b/cpp/.traces/greater_than2
index 52c4019b..cc0494ee 100644
--- a/cpp/.traces/greater_than2
+++ b/cpp/.traces/greater_than2
@@ -8,13 +8,13 @@ parse/0: instruction: 14
 parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   ingredient: {name: "2", type: 1}
 parse/0:   product: {name: "3", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 34
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 34
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 34
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/index b/cpp/.traces/index
index a23f11ab..9809b808 100644
--- a/cpp/.traces/index
+++ b/cpp/.traces/index
@@ -14,19 +14,19 @@ parse/0: instruction: 20
 parse/0:   ingredient: {name: "1", type: 6}
 parse/0:   ingredient: {name: "0", type: 0}
 parse/0:   product: {name: "5", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 3
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 14
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 15
 mem/0: storing in location 3
-run/0: instruction 3
+run/0: instruction main/3
 run/0: ingredient 0 is 16
 mem/0: storing in location 4
-run/0: instruction 4
+run/0: instruction main/4
 run/0: ingredient 0 is 1
 run/0: ingredient 1 is 0
 run/0: address to copy is 2
diff --git a/cpp/.traces/index_address b/cpp/.traces/index_address
index bd407dda..76b99827 100644
--- a/cpp/.traces/index_address
+++ b/cpp/.traces/index_address
@@ -14,19 +14,19 @@ parse/0: instruction: 21
 parse/0:   ingredient: {name: "1", type: 6}
 parse/0:   ingredient: {name: "0", type: 0}
 parse/0:   product: {name: "5", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 3
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 14
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 15
 mem/0: storing in location 3
-run/0: instruction 3
+run/0: instruction main/3
 run/0: ingredient 0 is 16
 mem/0: storing in location 4
-run/0: instruction 4
+run/0: instruction main/4
 run/0: ingredient 0 is 1
 run/0: ingredient 1 is 0
 run/0: address to copy is 2
diff --git a/cpp/.traces/jump_backward b/cpp/.traces/jump_backward
index 033b1dfd..6d9e433f 100644
--- a/cpp/.traces/jump_backward
+++ b/cpp/.traces/jump_backward
@@ -15,9 +15,9 @@ parse/0:   ingredient: {name: "//", type: }
 parse/0:   ingredient: {name: "2", type: }
 parse/0:   ingredient: {name: "+-->+", type: }
 parse/0:   ingredient: {name: "|", type: }
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 1
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is -2
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 1
diff --git a/cpp/.traces/jump_can_skip_instructions b/cpp/.traces/jump_can_skip_instructions
index e1c0f664..b8bc85e9 100644
--- a/cpp/.traces/jump_can_skip_instructions
+++ b/cpp/.traces/jump_can_skip_instructions
@@ -3,5 +3,5 @@ parse/0:   ingredient: {name: "1", type: 0}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "1", type: 0}
 parse/0:   product: {name: "1", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 1
diff --git a/cpp/.traces/jump_if b/cpp/.traces/jump_if
index a496582e..707dfd81 100644
--- a/cpp/.traces/jump_if
+++ b/cpp/.traces/jump_if
@@ -4,7 +4,7 @@ parse/0:   ingredient: {name: "1", type: 0}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "1", type: 0}
 parse/0:   product: {name: "1", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 999
 run/0: ingredient 1 is 1
 run/0: jumping to instruction 2
diff --git a/cpp/.traces/jump_if_fallthrough b/cpp/.traces/jump_if_fallthrough
index 894392ec..f95c99bb 100644
--- a/cpp/.traces/jump_if_fallthrough
+++ b/cpp/.traces/jump_if_fallthrough
@@ -4,9 +4,9 @@ parse/0:   ingredient: {name: "1", type: 0}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "1", type: 0}
 parse/0:   product: {name: "123", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 1
 mem/0: storing in location 123
diff --git a/cpp/.traces/jump_unless b/cpp/.traces/jump_unless
index 68a57639..a0978ed4 100644
--- a/cpp/.traces/jump_unless
+++ b/cpp/.traces/jump_unless
@@ -4,7 +4,7 @@ parse/0:   ingredient: {name: "1", type: 0}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "1", type: 0}
 parse/0:   product: {name: "1", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 0
 run/0: ingredient 1 is 1
 run/0: jumping to instruction 2
diff --git a/cpp/.traces/jump_unless_fallthrough b/cpp/.traces/jump_unless_fallthrough
index 5d6a5d9e..c1981cd7 100644
--- a/cpp/.traces/jump_unless_fallthrough
+++ b/cpp/.traces/jump_unless_fallthrough
@@ -4,9 +4,9 @@ parse/0:   ingredient: {name: "1", type: 0}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "1", type: 0}
 parse/0:   product: {name: "123", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 999
 run/0: jump-unless fell through
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 1
 mem/0: storing in location 123
diff --git a/cpp/.traces/lesser_or_equal b/cpp/.traces/lesser_or_equal
index df518a0a..cfd78e25 100644
--- a/cpp/.traces/lesser_or_equal
+++ b/cpp/.traces/lesser_or_equal
@@ -8,13 +8,13 @@ parse/0: instruction: 17
 parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   ingredient: {name: "2", type: 1}
 parse/0:   product: {name: "3", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 32
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 33
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 32
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/lesser_or_equal2 b/cpp/.traces/lesser_or_equal2
index d87c8a37..02874d2f 100644
--- a/cpp/.traces/lesser_or_equal2
+++ b/cpp/.traces/lesser_or_equal2
@@ -8,13 +8,13 @@ parse/0: instruction: 17
 parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   ingredient: {name: "2", type: 1}
 parse/0:   product: {name: "3", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 33
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 33
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 33
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/lesser_or_equal3 b/cpp/.traces/lesser_or_equal3
index 9576ddf9..cc6828fc 100644
--- a/cpp/.traces/lesser_or_equal3
+++ b/cpp/.traces/lesser_or_equal3
@@ -8,13 +8,13 @@ parse/0: instruction: 17
 parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   ingredient: {name: "2", type: 1}
 parse/0:   product: {name: "3", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 34
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 33
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 34
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/lesser_than b/cpp/.traces/lesser_than
index 5583f5fa..d1d02a6d 100644
--- a/cpp/.traces/lesser_than
+++ b/cpp/.traces/lesser_than
@@ -8,13 +8,13 @@ parse/0: instruction: 15
 parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   ingredient: {name: "2", type: 1}
 parse/0:   product: {name: "3", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 32
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 33
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 32
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/lesser_than2 b/cpp/.traces/lesser_than2
index 735b78b0..f0a593f5 100644
--- a/cpp/.traces/lesser_than2
+++ b/cpp/.traces/lesser_than2
@@ -8,13 +8,13 @@ parse/0: instruction: 15
 parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   ingredient: {name: "2", type: 1}
 parse/0:   product: {name: "3", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 34
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 33
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 34
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/multiply b/cpp/.traces/multiply
index 4d9c5008..d73c18ae 100644
--- a/cpp/.traces/multiply
+++ b/cpp/.traces/multiply
@@ -8,13 +8,13 @@ parse/0: instruction: 4
 parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   ingredient: {name: "2", type: 1}
 parse/0:   product: {name: "3", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 4
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 6
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 4
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/multiply_literal b/cpp/.traces/multiply_literal
index e27a4fa9..25449167 100644
--- a/cpp/.traces/multiply_literal
+++ b/cpp/.traces/multiply_literal
@@ -2,7 +2,7 @@ parse/0: instruction: 4
 parse/0:   ingredient: {name: "2", type: 0}
 parse/0:   ingredient: {name: "3", type: 0}
 parse/0:   product: {name: "1", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 2
 run/0: ingredient 1 is 3
 run/0: ingredient 1 is 3
diff --git a/cpp/.traces/not b/cpp/.traces/not
index 69459c1b..30f2b4b9 100644
--- a/cpp/.traces/not
+++ b/cpp/.traces/not
@@ -4,10 +4,10 @@ parse/0:   product: {name: "1", type: 1}
 parse/0: instruction: 9
 parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   product: {name: "2", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 1
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 1
 mem/0: location 1 is 1
 run/0: product 0 is 0
diff --git a/cpp/.traces/or b/cpp/.traces/or
index 73c46b6d..3f266ea0 100644
--- a/cpp/.traces/or
+++ b/cpp/.traces/or
@@ -8,13 +8,13 @@ parse/0: instruction: 8
 parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   ingredient: {name: "2", type: 1}
 parse/0:   product: {name: "3", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 1
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 0
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 1
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/store_indirect b/cpp/.traces/store_indirect
index 259685d1..da8f4aff 100644
--- a/cpp/.traces/store_indirect
+++ b/cpp/.traces/store_indirect
@@ -4,10 +4,10 @@ parse/0:   product: {name: "1", type: 2-1}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "34", type: 0}
 parse/0:   product: {name: "1", type: 2-1, property: deref:}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 2
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 34
 mem/0: location 1 is 2
 mem/0: storing in location 2
diff --git a/cpp/.traces/subtract b/cpp/.traces/subtract
index 73b675e9..72497a6e 100644
--- a/cpp/.traces/subtract
+++ b/cpp/.traces/subtract
@@ -8,13 +8,13 @@ parse/0: instruction: 3
 parse/0:   ingredient: {name: "1", type: 1}
 parse/0:   ingredient: {name: "2", type: 1}
 parse/0:   product: {name: "3", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 23
 mem/0: storing in location 1
-run/0: instruction 1
+run/0: instruction main/1
 run/0: ingredient 0 is 34
 mem/0: storing in location 2
-run/0: instruction 2
+run/0: instruction main/2
 run/0: ingredient 0 is 1
 mem/0: location 1 is 23
 run/0: ingredient 1 is 2
diff --git a/cpp/.traces/subtract_literal b/cpp/.traces/subtract_literal
index 73bfce31..c4981839 100644
--- a/cpp/.traces/subtract_literal
+++ b/cpp/.traces/subtract_literal
@@ -2,7 +2,7 @@ parse/0: instruction: 3
 parse/0:   ingredient: {name: "5", type: 0}
 parse/0:   ingredient: {name: "2", type: 0}
 parse/0:   product: {name: "1", type: 1}
-run/0: instruction 0
+run/0: instruction main/0
 run/0: ingredient 0 is 5
 run/0: ingredient 1 is 2
 run/0: product 0 is 3
diff --git a/cpp/010vm b/cpp/010vm
index 28cdd2c0..a734305f 100644
--- a/cpp/010vm
+++ b/cpp/010vm
@@ -10,6 +10,7 @@ int Next_recipe_number = 1;
 // Recipes are lists of instructions. To run a recipe, the computer runs its
 // instructions.
 struct recipe {
+  string name;
   vector<instruction> steps;
 };
 
diff --git a/cpp/011load b/cpp/011load
index b7fa4a20..ab2d6535 100644
--- a/cpp/011load
+++ b/cpp/011load
@@ -32,6 +32,7 @@ int add_recipe(string form) {
   while (next_instruction(in, &curr)) {
     Recipe[r].steps.push_back(curr);
   }
+  Recipe[r].name = recipe_name;
   return r;
 }
 
diff --git a/cpp/012run b/cpp/012run
index 194a55c5..79dcbfc2 100644
--- a/cpp/012run
+++ b/cpp/012run
@@ -3,7 +3,7 @@
 recipe main [
   1:integer <- copy 23:literal
 ]
-+run: instruction 0
++run: instruction main/0
 +run: ingredient 0 is 23
 +mem: storing in location 1
 
@@ -12,20 +12,45 @@ recipe main [
   1:integer <- copy 23:literal
   2:integer <- copy 1:integer
 ]
-+run: instruction 1
++run: instruction main/1
 +run: ingredient 0 is 1
 +mem: location 1 is 23
 +mem: storing in location 2
 
+:(before "End Types")
+// Each recipe can be 'called' many many times in a program. Each call needs a
+// little extra information.
+struct call {
+  recipe_number running_recipe;
+  size_t pc;
+  call(recipe_number r) :running_recipe(r), pc(0) {}
+};
+typedef stack<call> call_stack;
+
 :(code)
 void run(string form) {
-  run(add_recipe(form));
+  recipe_number r = add_recipe(form);
+  call_stack context;
+  context.push(call(r));
+  run(context);
 }
 
-void run(recipe_number r) {
-  vector<instruction>& instructions(Recipe[r].steps);
-  for (size_t pc = 0; pc < instructions.size(); ++pc) {
-    trace("run") << "instruction " << pc;
+void run(call_stack context) {
+// #defines save us the trouble of updating aliases when dependent variables
+// change.
+#define TOP Recipe[context.top().running_recipe]
+#define instructions TOP.steps
+  while (!context.empty()) {
+    while (context.top().pc >= instructions.size()) {
+      context.pop();
+      if (context.empty()) return;
+      // todo: no results returned warning
+      ++context.top().pc;
+    }
+//?     cout << context.size() << '\n'; //? 1
+    size_t& pc = context.top().pc;
+//?     cout << "instruction " << TOP.name << '/' << pc << '\n'; //? 1
+    trace("run") << "instruction " << TOP.name << '/' << pc;
     switch (instructions[pc].operation) {
     // Primitive Recipe Implementations.
     case COPY: {
@@ -38,7 +63,10 @@ void run(recipe_number r) {
     default:
       raise << "undefined operation " << instructions[pc].operation;
     }
+    ++pc;
   }
+#undef TOP
+#undef instructions
 }
 
 vector<int> read_memory(reagent x) {
diff --git a/cpp/013arithmetic b/cpp/013arithmetic
index 1f12b474..d1d61eed 100644
--- a/cpp/013arithmetic
+++ b/cpp/013arithmetic
@@ -23,7 +23,7 @@ case ADD: {
 recipe main [
   1:integer <- add 23:literal, 34:literal
 ]
-+run: instruction 0
++run: instruction main/0
 +run: ingredient 0 is 23
 +run: ingredient 1 is 34
 +run: product 0 is 57
@@ -35,7 +35,7 @@ recipe main [
   2:integer <- copy 34:literal
   3:integer <- add 1:integer, 2:integer
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 1
 +mem: location 1 is 23
 +run: ingredient 1 is 2
@@ -67,7 +67,7 @@ case SUBTRACT: {
 recipe main [
   1:integer <- subtract 5:literal, 2:literal
 ]
-+run: instruction 0
++run: instruction main/0
 +run: ingredient 0 is 5
 +run: ingredient 1 is 2
 +run: product 0 is 3
@@ -79,7 +79,7 @@ recipe main [
   2:integer <- copy 34:literal
   3:integer <- subtract 1:integer, 2:integer
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 1
 +mem: location 1 is 23
 +run: ingredient 1 is 2
@@ -112,7 +112,7 @@ case MULTIPLY: {
 recipe main [
   1:integer <- multiply 2:literal, 3:literal
 ]
-+run: instruction 0
++run: instruction main/0
 +run: ingredient 0 is 2
 +run: ingredient 1 is 3
 +run: product 0 is 6
@@ -124,7 +124,7 @@ recipe main [
   2:integer <- copy 6:literal
   3:integer <- multiply 1:integer, 2:integer
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 1
 +mem: location 1 is 4
 +run: ingredient 1 is 2
@@ -157,7 +157,7 @@ case DIVIDE: {
 recipe main [
   1:integer <- divide 8:literal, 2:literal
 ]
-+run: instruction 0
++run: instruction main/0
 +run: ingredient 0 is 8
 +run: ingredient 1 is 2
 +run: product 0 is 4
@@ -169,7 +169,7 @@ recipe main [
   2:integer <- copy 3:literal
   3:integer <- divide 1:integer, 2:integer
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 1
 +mem: location 1 is 27
 +run: ingredient 1 is 2
@@ -205,7 +205,7 @@ case DIVIDE_WITH_REMAINDER: {
 recipe main [
   1:integer, 2:integer <- divide_with_remainder 9:literal, 2:literal
 ]
-+run: instruction 0
++run: instruction main/0
 +run: ingredient 0 is 9
 +run: ingredient 1 is 2
 +run: product 0 is 4
@@ -219,7 +219,7 @@ recipe main [
   2:integer <- copy 11:literal
   3:integer, 4:integer <- divide_with_remainder 1:integer, 2:integer
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 1
 +mem: location 1 is 27
 +run: ingredient 1 is 2
diff --git a/cpp/014boolean b/cpp/014boolean
index 7da98db4..61f5f436 100644
--- a/cpp/014boolean
+++ b/cpp/014boolean
@@ -25,7 +25,7 @@ recipe main [
   2:integer <- copy 0:literal
   3:integer <- and 1:integer, 2:integer
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 1
 +mem: location 1 is 1
 +run: ingredient 1 is 2
@@ -59,7 +59,7 @@ recipe main [
   2:integer <- copy 0:literal
   3:integer <- or 1:integer, 2:integer
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 1
 +mem: location 1 is 1
 +run: ingredient 1 is 2
@@ -89,7 +89,7 @@ recipe main [
   1:integer <- copy 1:literal
   2:integer <- not 1:integer
 ]
-+run: instruction 1
++run: instruction main/1
 +run: ingredient 0 is 1
 +mem: location 1 is 1
 +run: product 0 is 0
diff --git a/cpp/015jump b/cpp/015jump
index 99b333dd..26861166 100644
--- a/cpp/015jump
+++ b/cpp/015jump
@@ -16,9 +16,9 @@ recipe main [
   jump 1:offset
   1:integer <- copy 1:literal
 ]
-+run: instruction 0
++run: instruction main/0
 +run: ingredient 0 is 1
--run: instruction 1
+-run: instruction main/1
 -mem: storing in location 1
 
 :(scenario "jump_backward")
@@ -27,9 +27,9 @@ recipe main [
   jump 1:offset  //    | 1 +-+
   jump -2:offset //  2 +-->+ |
 ]                //       3 \/
-+run: instruction 0
-+run: instruction 2
-+run: instruction 1
++run: instruction main/0
++run: instruction main/2
++run: instruction main/1
 
 :(before "End Globals")
 const int JUMP_IF = 11;
@@ -56,10 +56,10 @@ recipe main [
   jump-if 999:literal 1:offset
   1:integer <- copy 1:literal
 ]
-+run: instruction 0
++run: instruction main/0
 +run: ingredient 1 is 1
 +run: jumping to instruction 2
--run: instruction 1
+-run: instruction main/1
 -mem: storing in location 1
 
 :(scenario "jump_if_fallthrough")
@@ -67,9 +67,9 @@ recipe main [
   jump-if 0:literal 1:offset
   123:integer <- copy 1:literal
 ]
-+run: instruction 0
++run: instruction main/0
 +run: jump-if fell through
-+run: instruction 1
++run: instruction main/1
 +mem: storing in location 123
 
 :(before "End Globals")
@@ -97,10 +97,10 @@ recipe main [
   jump-unless 0:literal 1:offset
   1:integer <- copy 1:literal
 ]
-+run: instruction 0
++run: instruction main/0
 +run: ingredient 1 is 1
 +run: jumping to instruction 2
--run: instruction 1
+-run: instruction main/1
 -mem: storing in location 1
 
 :(scenario "jump_unless_fallthrough")
@@ -108,8 +108,8 @@ recipe main [
   jump-unless 999:literal 1:offset
   123:integer <- copy 1:literal
 ]
-+run: instruction 0
++run: instruction main/0
 +run: ingredient 0 is 999
 +run: jump-unless fell through
-+run: instruction 1
++run: instruction main/1
 +mem: storing in location 123
diff --git a/cpp/016compare b/cpp/016compare
index 7da3dd16..9a97911f 100644
--- a/cpp/016compare
+++ b/cpp/016compare
@@ -23,7 +23,7 @@ recipe main [
   2:integer <- copy 33:literal
   3:integer <- equal 1:integer, 2:integer
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 1
 +mem: location 1 is 34
 +run: ingredient 1 is 2
@@ -37,7 +37,7 @@ recipe main [
   2:integer <- copy 34:literal
   3:integer <- equal 1:integer, 2:integer
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 1
 +mem: location 1 is 34
 +run: ingredient 1 is 2
@@ -71,7 +71,7 @@ recipe main [
   2:integer <- copy 33:literal
   3:integer <- greater-than 1:integer, 2:integer
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 1
 +mem: location 1 is 34
 +run: ingredient 1 is 2
@@ -85,7 +85,7 @@ recipe main [
   2:integer <- copy 34:literal
   3:integer <- greater-than 1:integer, 2:integer
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 1
 +mem: location 1 is 34
 +run: ingredient 1 is 2
@@ -119,7 +119,7 @@ recipe main [
   2:integer <- copy 33:literal
   3:integer <- lesser-than 1:integer, 2:integer
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 1
 +mem: location 1 is 32
 +run: ingredient 1 is 2
@@ -133,7 +133,7 @@ recipe main [
   2:integer <- copy 33:literal
   3:integer <- lesser-than 1:integer, 2:integer
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 1
 +mem: location 1 is 34
 +run: ingredient 1 is 2
@@ -167,7 +167,7 @@ recipe main [
   2:integer <- copy 33:literal
   3:integer <- greater-or-equal 1:integer, 2:integer
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 1
 +mem: location 1 is 34
 +run: ingredient 1 is 2
@@ -181,7 +181,7 @@ recipe main [
   2:integer <- copy 34:literal
   3:integer <- greater-or-equal 1:integer, 2:integer
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 1
 +mem: location 1 is 34
 +run: ingredient 1 is 2
@@ -195,7 +195,7 @@ recipe main [
   2:integer <- copy 35:literal
   3:integer <- greater-or-equal 1:integer, 2:integer
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 1
 +mem: location 1 is 34
 +run: ingredient 1 is 2
@@ -229,7 +229,7 @@ recipe main [
   2:integer <- copy 33:literal
   3:integer <- lesser-or-equal 1:integer, 2:integer
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 1
 +mem: location 1 is 32
 +run: ingredient 1 is 2
@@ -243,7 +243,7 @@ recipe main [
   2:integer <- copy 33:literal
   3:integer <- lesser-or-equal 1:integer, 2:integer
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 1
 +mem: location 1 is 33
 +run: ingredient 1 is 2
@@ -257,7 +257,7 @@ recipe main [
   2:integer <- copy 33:literal
   3:integer <- lesser-or-equal 1:integer, 2:integer
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 1
 +mem: location 1 is 34
 +run: ingredient 1 is 2
diff --git a/cpp/017record b/cpp/017record
index 3dbd21c0..6ce9da1d 100644
--- a/cpp/017record
+++ b/cpp/017record
@@ -63,7 +63,7 @@ recipe main [
   13:integer <- copy 35:literal
   15:integer <- get 12:point, 1:offset
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 12
 +run: ingredient 1 is 1
 +run: address to copy is 13
@@ -90,7 +90,7 @@ recipe main [
   14:integer <- copy 36:literal
   15:integer <- get 12:point-integer, 1:offset
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 12
 +run: ingredient 1 is 1
 +run: address to copy is 14
@@ -133,7 +133,7 @@ recipe main [
   13:integer <- copy 35:literal
   15:address:integer <- get-address 12:point, 1:offset
 ]
-+run: instruction 2
++run: instruction main/2
 +run: ingredient 0 is 12
 +run: ingredient 1 is 1
 +run: address to copy is 13
diff --git a/cpp/018address b/cpp/018address
index 19650e84..bdf10685 100644
--- a/cpp/018address
+++ b/cpp/018address
@@ -6,7 +6,7 @@ recipe main [
   # This loads location 1 as an address and looks up *that* location.
   3:integer <- copy 1:address:integer/deref
 ]
-+run: instruction 2
++run: instruction main/2
 +mem: location 1 is 2
 +mem: location 2 is 34
 +mem: storing in location 3
@@ -35,7 +35,7 @@ recipe main [
   1:address:integer <- copy 2:literal
   1:address:integer/deref <- copy 34:literal
 ]
-+run: instruction 1
++run: instruction main/1
 +mem: location 1 is 2
 +mem: storing in location 2
 
@@ -103,7 +103,7 @@ recipe main [
   3:integer <- copy 35:literal
   4:integer <- get 1:address:point/deref, 0:offset
 ]
-+run: instruction 3
++run: instruction main/3
 +run: address to copy is 2
 +run: product 0 is 34
 +mem: storing in location 4
@@ -146,7 +146,7 @@ recipe main [
   3:integer <- copy 35:literal
   4:integer <- get-address 1:address:point/deref, 0:offset
 ]
-+run: instruction 3
++run: instruction main/3
 +run: address to copy is 2
 +run: product 0 is 2
 
diff --git a/cpp/019array b/cpp/019array
index bb50a783..fe457b0a 100644
--- a/cpp/019array
+++ b/cpp/019array
@@ -15,7 +15,7 @@ recipe main [
   4:integer <- copy 16:literal
   5:integer-array <- copy 1:integer-array
 ]
-+run: instruction 4
++run: instruction main/4
 +run: ingredient 0 is 1
 +mem: location 1 is 3
 +mem: location 2 is 14
@@ -91,7 +91,7 @@ recipe main [
   4:integer <- copy 16:literal
   5:integer <- index 1:integer-array, 0:literal
 ]
-+run: instruction 4
++run: instruction main/4
 +run: ingredient 0 is 1
 +run: ingredient 1 is 0
 +run: address to copy is 2
@@ -132,7 +132,7 @@ recipe main [
   4:integer <- copy 16:literal
   5:integer <- index-address 1:integer-array, 0:literal
 ]
-+run: instruction 4
++run: instruction main/4
 +run: ingredient 0 is 1
 +run: ingredient 1 is 0
 +run: address to copy is 2