about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--cpp/.traces/buffer-append-works421
-rw-r--r--cpp/.traces/deref_sidesteps_default_space22
-rw-r--r--cpp/.traces/deref_sidesteps_default_space_in_get49
-rw-r--r--cpp/.traces/deref_sidesteps_default_space_in_index56
-rw-r--r--cpp/031address1
-rw-r--r--cpp/032array8
-rw-r--r--cpp/043space45
-rw-r--r--cpp/050scenario2
-rw-r--r--cpp/060string.mu100
9 files changed, 684 insertions, 20 deletions
diff --git a/cpp/.traces/buffer-append-works b/cpp/.traces/buffer-append-works
new file mode 100644
index 00000000..e6e31d41
--- /dev/null
+++ b/cpp/.traces/buffer-append-works
@@ -0,0 +1,421 @@
+parse/0: instruction: 33
+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-0, properties: ["default-space": "address":"space"]}
+parse/0: instruction: 101
+parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
+parse/0:   product: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
+parse/0: instruction: 19
+parse/0:   ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}
+parse/0:   ingredient: {name: "data", value: 0, type: 0, properties: ["data": "offset"]}
+parse/0:   product: {name: "s1", value: 0, type: 2-5-4, properties: ["s1": "address":"array":"character"]}
+parse/0: instruction: 104
+parse/0:   ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
+parse/0:   ingredient: {name: "97", value: 0, type: 0, properties: ["97": "literal"]}
+parse/0:   product: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
+parse/0: instruction: 104
+parse/0:   ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
+parse/0:   ingredient: {name: "98", value: 0, type: 0, properties: ["98": "literal"]}
+parse/0:   product: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
+parse/0: instruction: 104
+parse/0:   ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
+parse/0:   ingredient: {name: "99", value: 0, type: 0, properties: ["99": "literal"]}
+parse/0:   product: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
+parse/0: instruction: 19
+parse/0:   ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}
+parse/0:   ingredient: {name: "data", value: 0, type: 0, properties: ["data": "offset"]}
+parse/0:   product: {name: "s2", value: 0, type: 2-5-4, properties: ["s2": "address":"array":"character"]}
+parse/0: instruction: 13
+parse/0:   ingredient: {name: "s1", value: 0, type: 2-5-4, properties: ["s1": "address":"array":"character"]}
+parse/0:   ingredient: {name: "s2", value: 0, type: 2-5-4, properties: ["s2": "address":"array":"character"]}
+parse/0:   product: {name: "1", value: 0, type: 3, properties: ["1": "boolean", "raw": ]}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "s2", value: 0, type: 2-5-4, properties: ["s2": "address":"array":"character", "deref": ]}
+parse/0:   product: {name: "2", value: 0, type: 5-4, properties: ["2": "array":"character", "raw": ]}
+new/0: location -> 1
+name/0: assign x 1
+name/0: element data of type buffer is at offset 1
+name/0: assign s1 2
+name/0: element data of type buffer is at offset 1
+name/0: assign s2 3
+after-brace/0: recipe test-buffer-append-works
+after-brace/0: new ...
+after-brace/0: init-buffer ...
+after-brace/0: get ...
+after-brace/0: buffer-append ...
+after-brace/0: buffer-append ...
+after-brace/0: buffer-append ...
+after-brace/0: get ...
+after-brace/0: equal ...
+after-brace/0: copy ...
+run/0: instruction test-buffer-append-works/0
+mem/0: new alloc: 1000
+mem/0: array size is 30
+run/0: instruction test-buffer-append-works/1
+run/0: instruction init-buffer/0
+mem/0: new alloc: 1030
+mem/0: array size is 30
+run/0: instruction init-buffer/1
+mem/0: new alloc: 1060
+mem/0: storing 1060 in location 1032
+run/0: instruction init-buffer/2
+run/0: ingredient 0 is result
+mem/0: location 1032 is 1060
+run/0: ingredient 1 is length
+run/0: address to copy is 1060
+run/0: product 0 is 1060
+mem/0: storing 1060 in location 1033
+run/0: instruction init-buffer/3
+run/0: ingredient 0 is 0
+mem/0: location 1033 is 1060
+mem/0: storing 0 in location 1060
+run/0: instruction init-buffer/4
+run/0: ingredient 0 is result
+mem/0: location 1032 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+run/0: product 0 is 1061
+mem/0: storing 1061 in location 1034
+run/0: instruction init-buffer/5
+run/0: product 0 is 3
+mem/0: storing 3 in location 1035
+run/0: instruction init-buffer/6
+mem/0: new alloc: 1062
+mem/0: location 1034 is 1061
+mem/0: storing 1062 in location 1061
+mem/0: location 1035 is 3
+mem/0: array size is 3
+run/0: instruction init-buffer/7
+mem/0: location 1032 is 1060
+run/0: result 0 is 1060
+mem/0: storing 1060 in location 1002
+run/0: instruction test-buffer-append-works/2
+run/0: ingredient 0 is x
+mem/0: location 1002 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+run/0: its type is 2
+mem/0: location 1061 is 1062
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1003
+run/0: instruction test-buffer-append-works/3
+mem/0: location 1002 is 1060
+run/0: instruction buffer-append/0
+mem/0: new alloc: 1065
+mem/0: array size is 30
+run/0: instruction buffer-append/1
+run/0: product 0 is 1060
+mem/0: storing 1060 in location 1067
+run/0: instruction buffer-append/2
+run/0: product 0 is 97
+mem/0: storing 97 in location 1068
+run/0: instruction buffer-append/4
+mem/0: location 1067 is 1060
+run/0: instruction buffer-full?/0
+mem/0: new alloc: 1095
+mem/0: array size is 30
+run/0: instruction buffer-full?/1
+run/0: product 0 is 1060
+mem/0: storing 1060 in location 1097
+run/0: instruction buffer-full?/2
+run/0: ingredient 0 is in
+mem/0: location 1097 is 1060
+run/0: ingredient 1 is length
+run/0: address to copy is 1060
+run/0: its type is 1
+mem/0: location 1060 is 0
+run/0: product 0 is 0
+mem/0: storing 0 in location 1098
+run/0: instruction buffer-full?/3
+run/0: ingredient 0 is in
+mem/0: location 1097 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+run/0: its type is 2
+mem/0: location 1061 is 1062
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1099
+run/0: instruction buffer-full?/4
+mem/0: location 1099 is 1062
+mem/0: storing 3 in location 1100
+run/0: instruction buffer-full?/5
+run/0: ingredient 0 is len
+mem/0: location 1098 is 0
+run/0: ingredient 1 is capacity
+mem/0: location 1100 is 3
+run/0: product 0 is 0
+mem/0: storing 0 in location 1101
+run/0: instruction buffer-full?/6
+mem/0: location 1101 is 0
+run/0: result 0 is 0
+mem/0: storing 0 in location 1069
+run/0: instruction buffer-append/5
+mem/0: location 1069 is 0
+run/0: ingredient 0 is 0
+run/0: ingredient 1 is 
+run/0: jumping to instruction 7
+run/0: instruction buffer-append/8
+run/0: ingredient 0 is in
+mem/0: location 1067 is 1060
+run/0: ingredient 1 is length
+run/0: address to copy is 1060
+run/0: product 0 is 1060
+mem/0: storing 1060 in location 1070
+run/0: instruction buffer-append/9
+run/0: ingredient 0 is in
+mem/0: location 1067 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+run/0: its type is 2
+mem/0: location 1061 is 1062
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1071
+run/0: instruction buffer-append/10
+run/0: ingredient 0 is s
+mem/0: location 1071 is 1062
+run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
+mem/0: location 1070 is 1060
+mem/0: location 1060 is 0
+run/0: address to copy is 1063
+run/0: product 0 is 1063
+mem/0: storing 1063 in location 1072
+run/0: instruction buffer-append/11
+run/0: ingredient 0 is c
+mem/0: location 1068 is 97
+mem/0: location 1072 is 1063
+mem/0: storing 97 in location 1063
+run/0: instruction buffer-append/12
+run/0: ingredient 0 is len
+mem/0: location 1070 is 1060
+mem/0: location 1060 is 0
+run/0: ingredient 1 is 1
+run/0: product 0 is 1
+mem/0: location 1070 is 1060
+mem/0: storing 1 in location 1060
+run/0: instruction buffer-append/13
+mem/0: location 1067 is 1060
+run/0: result 0 is 1060
+mem/0: storing 1060 in location 1002
+run/0: instruction test-buffer-append-works/4
+mem/0: location 1002 is 1060
+run/0: instruction buffer-append/0
+mem/0: new alloc: 1125
+mem/0: array size is 30
+run/0: instruction buffer-append/1
+run/0: product 0 is 1060
+mem/0: storing 1060 in location 1127
+run/0: instruction buffer-append/2
+run/0: product 0 is 98
+mem/0: storing 98 in location 1128
+run/0: instruction buffer-append/4
+mem/0: location 1127 is 1060
+run/0: instruction buffer-full?/0
+mem/0: new alloc: 1155
+mem/0: array size is 30
+run/0: instruction buffer-full?/1
+run/0: product 0 is 1060
+mem/0: storing 1060 in location 1157
+run/0: instruction buffer-full?/2
+run/0: ingredient 0 is in
+mem/0: location 1157 is 1060
+run/0: ingredient 1 is length
+run/0: address to copy is 1060
+run/0: its type is 1
+mem/0: location 1060 is 1
+run/0: product 0 is 1
+mem/0: storing 1 in location 1158
+run/0: instruction buffer-full?/3
+run/0: ingredient 0 is in
+mem/0: location 1157 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+run/0: its type is 2
+mem/0: location 1061 is 1062
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1159
+run/0: instruction buffer-full?/4
+mem/0: location 1159 is 1062
+mem/0: storing 3 in location 1160
+run/0: instruction buffer-full?/5
+run/0: ingredient 0 is len
+mem/0: location 1158 is 1
+run/0: ingredient 1 is capacity
+mem/0: location 1160 is 3
+run/0: product 0 is 0
+mem/0: storing 0 in location 1161
+run/0: instruction buffer-full?/6
+mem/0: location 1161 is 0
+run/0: result 0 is 0
+mem/0: storing 0 in location 1129
+run/0: instruction buffer-append/5
+mem/0: location 1129 is 0
+run/0: ingredient 0 is 0
+run/0: ingredient 1 is 
+run/0: jumping to instruction 7
+run/0: instruction buffer-append/8
+run/0: ingredient 0 is in
+mem/0: location 1127 is 1060
+run/0: ingredient 1 is length
+run/0: address to copy is 1060
+run/0: product 0 is 1060
+mem/0: storing 1060 in location 1130
+run/0: instruction buffer-append/9
+run/0: ingredient 0 is in
+mem/0: location 1127 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+run/0: its type is 2
+mem/0: location 1061 is 1062
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1131
+run/0: instruction buffer-append/10
+run/0: ingredient 0 is s
+mem/0: location 1131 is 1062
+run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
+mem/0: location 1130 is 1060
+mem/0: location 1060 is 1
+run/0: address to copy is 1064
+run/0: product 0 is 1064
+mem/0: storing 1064 in location 1132
+run/0: instruction buffer-append/11
+run/0: ingredient 0 is c
+mem/0: location 1128 is 98
+mem/0: location 1132 is 1064
+mem/0: storing 98 in location 1064
+run/0: instruction buffer-append/12
+run/0: ingredient 0 is len
+mem/0: location 1130 is 1060
+mem/0: location 1060 is 1
+run/0: ingredient 1 is 1
+run/0: product 0 is 2
+mem/0: location 1130 is 1060
+mem/0: storing 2 in location 1060
+run/0: instruction buffer-append/13
+mem/0: location 1127 is 1060
+run/0: result 0 is 1060
+mem/0: storing 1060 in location 1002
+run/0: instruction test-buffer-append-works/5
+mem/0: location 1002 is 1060
+run/0: instruction buffer-append/0
+mem/0: new alloc: 1185
+mem/0: array size is 30
+run/0: instruction buffer-append/1
+run/0: product 0 is 1060
+mem/0: storing 1060 in location 1187
+run/0: instruction buffer-append/2
+run/0: product 0 is 99
+mem/0: storing 99 in location 1188
+run/0: instruction buffer-append/4
+mem/0: location 1187 is 1060
+run/0: instruction buffer-full?/0
+mem/0: new alloc: 1215
+mem/0: array size is 30
+run/0: instruction buffer-full?/1
+run/0: product 0 is 1060
+mem/0: storing 1060 in location 1217
+run/0: instruction buffer-full?/2
+run/0: ingredient 0 is in
+mem/0: location 1217 is 1060
+run/0: ingredient 1 is length
+run/0: address to copy is 1060
+run/0: its type is 1
+mem/0: location 1060 is 2
+run/0: product 0 is 2
+mem/0: storing 2 in location 1218
+run/0: instruction buffer-full?/3
+run/0: ingredient 0 is in
+mem/0: location 1217 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+run/0: its type is 2
+mem/0: location 1061 is 1062
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1219
+run/0: instruction buffer-full?/4
+mem/0: location 1219 is 1062
+mem/0: storing 3 in location 1220
+run/0: instruction buffer-full?/5
+run/0: ingredient 0 is len
+mem/0: location 1218 is 2
+run/0: ingredient 1 is capacity
+mem/0: location 1220 is 3
+run/0: product 0 is 0
+mem/0: storing 0 in location 1221
+run/0: instruction buffer-full?/6
+mem/0: location 1221 is 0
+run/0: result 0 is 0
+mem/0: storing 0 in location 1189
+run/0: instruction buffer-append/5
+mem/0: location 1189 is 0
+run/0: ingredient 0 is 0
+run/0: ingredient 1 is 
+run/0: jumping to instruction 7
+run/0: instruction buffer-append/8
+run/0: ingredient 0 is in
+mem/0: location 1187 is 1060
+run/0: ingredient 1 is length
+run/0: address to copy is 1060
+run/0: product 0 is 1060
+mem/0: storing 1060 in location 1190
+run/0: instruction buffer-append/9
+run/0: ingredient 0 is in
+mem/0: location 1187 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+run/0: its type is 2
+mem/0: location 1061 is 1062
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1191
+run/0: instruction buffer-append/10
+run/0: ingredient 0 is s
+mem/0: location 1191 is 1062
+run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}
+mem/0: location 1190 is 1060
+mem/0: location 1060 is 2
+run/0: address to copy is 1065
+run/0: product 0 is 1065
+mem/0: storing 1065 in location 1192
+run/0: instruction buffer-append/11
+run/0: ingredient 0 is c
+mem/0: location 1188 is 99
+mem/0: location 1192 is 1065
+mem/0: storing 99 in location 1065
+run/0: instruction buffer-append/12
+run/0: ingredient 0 is len
+mem/0: location 1190 is 1060
+mem/0: location 1060 is 2
+run/0: ingredient 1 is 1
+run/0: product 0 is 3
+mem/0: location 1190 is 1060
+mem/0: storing 3 in location 1060
+run/0: instruction buffer-append/13
+mem/0: location 1187 is 1060
+run/0: result 0 is 1060
+mem/0: storing 1060 in location 1002
+run/0: instruction test-buffer-append-works/6
+run/0: ingredient 0 is x
+mem/0: location 1002 is 1060
+run/0: ingredient 1 is data
+run/0: address to copy is 1061
+run/0: its type is 2
+mem/0: location 1061 is 1062
+run/0: product 0 is 1062
+mem/0: storing 1062 in location 1004
+run/0: instruction test-buffer-append-works/7
+run/0: ingredient 0 is s1
+mem/0: location 1003 is 1062
+run/0: ingredient 1 is s2
+mem/0: location 1004 is 1062
+run/0: product 0 is 1
+mem/0: storing 1 in location 1
+run/0: instruction test-buffer-append-works/8
+run/0: ingredient 0 is s2
+mem/0: location 1004 is 1062
+mem/0: location 1062 is 3
+mem/0: location 1063 is 97
+mem/0: location 1064 is 98
+mem/0: location 1065 is 99
+mem/0: storing 3 in location 2
+mem/0: storing 97 in location 3
+mem/0: storing 98 in location 4
+mem/0: storing 99 in location 5
diff --git a/cpp/.traces/deref_sidesteps_default_space b/cpp/.traces/deref_sidesteps_default_space
index 9c7205ab..0fd3d790 100644
--- a/cpp/.traces/deref_sidesteps_default_space
+++ b/cpp/.traces/deref_sidesteps_default_space
@@ -1,14 +1,14 @@
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
-parse/0:   product: {name: "7", value: 0, type: 1, properties: ["7": "integer"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
-parse/0:   product: {name: "10", value: 0, type: 1, properties: ["10": "integer"]}
+parse/0:   product: {name: "1000", value: 0, type: 1, properties: ["1000": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "10", value: 0, type: 0, properties: ["10": "literal"]}
+parse/0:   ingredient: {name: "1000", value: 0, type: 0, properties: ["1000": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-0, properties: ["default-space": "address":"space"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "7", value: 0, type: 0, properties: ["7": "literal"]}
+parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer", "deref": ]}
@@ -21,17 +21,17 @@ after-brace/0: copy ...
 after-brace/0: copy ...
 run/0: instruction main/0
 run/0: ingredient 0 is 34
-mem/0: storing 34 in location 7
+mem/0: storing 34 in location 3
 run/0: instruction main/1
 run/0: ingredient 0 is 5
-mem/0: storing 5 in location 10
+mem/0: storing 5 in location 1000
 run/0: instruction main/2
-run/0: ingredient 0 is 10
+run/0: ingredient 0 is 1000
 run/0: instruction main/3
-run/0: ingredient 0 is 7
-mem/0: storing 7 in location 12
+run/0: ingredient 0 is 3
+mem/0: storing 3 in location 1002
 run/0: instruction main/4
 run/0: ingredient 0 is 1
-mem/0: location 12 is 7
-mem/0: location 7 is 34
+mem/0: location 1002 is 3
+mem/0: location 3 is 34
 mem/0: storing 34 in location 8
diff --git a/cpp/.traces/deref_sidesteps_default_space_in_get b/cpp/.traces/deref_sidesteps_default_space_in_get
new file mode 100644
index 00000000..e12e1500
--- /dev/null
+++ b/cpp/.traces/deref_sidesteps_default_space_in_get
@@ -0,0 +1,49 @@
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
+parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
+parse/0:   product: {name: "1000", value: 0, type: 1, properties: ["1000": "integer"]}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "1000", value: 0, type: 0, properties: ["1000": "literal"]}
+parse/0:   product: {name: "default-space", value: 0, type: 2-0, properties: ["default-space": "address":"space"]}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "12", value: 0, type: 0, properties: ["12": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 2-6, properties: ["1": "address":"point"]}
+parse/0: instruction: 19
+parse/0:   ingredient: {name: "1", value: 0, type: 2-6, properties: ["1": "address":"point", "deref": ]}
+parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
+parse/0:   product: {name: "9", value: 0, type: 1, properties: ["9": "integer", "raw": ]}
+after-brace/0: recipe main
+after-brace/0: copy ...
+after-brace/0: copy ...
+after-brace/0: copy ...
+after-brace/0: copy ...
+after-brace/0: copy ...
+after-brace/0: get ...
+run/0: instruction main/0
+run/0: ingredient 0 is 34
+mem/0: storing 34 in location 12
+run/0: instruction main/1
+run/0: ingredient 0 is 35
+mem/0: storing 35 in location 13
+run/0: instruction main/2
+run/0: ingredient 0 is 5
+mem/0: storing 5 in location 1000
+run/0: instruction main/3
+run/0: ingredient 0 is 1000
+run/0: instruction main/4
+run/0: ingredient 0 is 12
+mem/0: storing 12 in location 1002
+run/0: instruction main/5
+run/0: ingredient 0 is 1
+mem/0: location 1002 is 12
+run/0: ingredient 1 is 1
+run/0: address to copy is 13
+run/0: its type is 1
+mem/0: location 13 is 35
+run/0: product 0 is 35
+mem/0: storing 35 in location 9
diff --git a/cpp/.traces/deref_sidesteps_default_space_in_index b/cpp/.traces/deref_sidesteps_default_space_in_index
new file mode 100644
index 00000000..24c8ea0e
--- /dev/null
+++ b/cpp/.traces/deref_sidesteps_default_space_in_index
@@ -0,0 +1,56 @@
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
+parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
+parse/0:   product: {name: "14", value: 0, type: 1, properties: ["14": "integer"]}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
+parse/0:   product: {name: "1000", value: 0, type: 1, properties: ["1000": "integer"]}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "1000", value: 0, type: 0, properties: ["1000": "literal"]}
+parse/0:   product: {name: "default-space", value: 0, type: 2-0, properties: ["default-space": "address":"space"]}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "12", value: 0, type: 0, properties: ["12": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 2-5-1, properties: ["1": "address":"array":"integer"]}
+parse/0: instruction: 21
+parse/0:   ingredient: {name: "1", value: 0, type: 2-5-1, properties: ["1": "address":"array":"integer", "deref": ]}
+parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
+parse/0:   product: {name: "9", value: 0, type: 1, properties: ["9": "integer", "raw": ]}
+after-brace/0: recipe main
+after-brace/0: copy ...
+after-brace/0: copy ...
+after-brace/0: copy ...
+after-brace/0: copy ...
+after-brace/0: copy ...
+after-brace/0: copy ...
+after-brace/0: index ...
+run/0: instruction main/0
+run/0: ingredient 0 is 2
+mem/0: storing 2 in location 12
+run/0: instruction main/1
+run/0: ingredient 0 is 34
+mem/0: storing 34 in location 13
+run/0: instruction main/2
+run/0: ingredient 0 is 35
+mem/0: storing 35 in location 14
+run/0: instruction main/3
+run/0: ingredient 0 is 5
+mem/0: storing 5 in location 1000
+run/0: instruction main/4
+run/0: ingredient 0 is 1000
+run/0: instruction main/5
+run/0: ingredient 0 is 12
+mem/0: storing 12 in location 1002
+run/0: instruction main/6
+run/0: ingredient 0 is {name: "1", value: 1, type: 2-5-1, properties: ["1": "address":"array":"integer", "deref": ]}
+mem/0: location 1002 is 12
+run/0: ingredient 1 is {name: "1", value: 1, type: 0, properties: ["1": "literal"]}
+run/0: address to copy is 14
+run/0: its type is 1
+mem/0: location 14 is 35
+run/0: product 0 is 35
+mem/0: storing 35 in location 9
diff --git a/cpp/031address b/cpp/031address
index 801459f6..e3f31869 100644
--- a/cpp/031address
+++ b/cpp/031address
@@ -32,6 +32,7 @@ x = canonize(x);
 
 :(code)
 reagent canonize(reagent x) {
+  if (isa_literal(x)) return x;
 //?   cout << "canonize\n"; //? 1
   reagent r = x;
 //?   cout << x.to_string() << " => " << r.to_string() << '\n'; //? 1
diff --git a/cpp/032array b/cpp/032array
index 84ee4d38..284ca592 100644
--- a/cpp/032array
+++ b/cpp/032array
@@ -98,21 +98,23 @@ case INDEX: {
 //?   if (Trace_stream) Trace_stream->dump_layer = "run"; //? 1
   trace("run") << "ingredient 0 is " << instructions[pc].ingredients[0].to_string();
   reagent base = canonize(instructions[pc].ingredients[0]);
-//?   trace("run") << "ingredient 0 after canonize: " << instructions[pc].ingredients[0].to_string(); //? 1
+//?   trace("run") << "ingredient 0 after canonize: " << base.to_string(); //? 1
   int base_address = base.value;
   assert(base.types[0] == ARRAY);
   trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].to_string();
   reagent offset = canonize(instructions[pc].ingredients[1]);
+//?   trace("run") << "ingredient 1 after canonize: " << offset.to_string(); //? 1
   vector<int> offset_val(read_memory(offset));
   vector<type_number> element_type = array_element(base.types);
+//?   trace("run") << "offset: " << offset_val[0]; //? 1
+//?   trace("run") << "size of elements: " << size_of(element_type); //? 1
   int src = base_address + 1 + offset_val[0]*size_of(element_type);
   trace("run") << "address to copy is " << src;
   trace("run") << "its type is " << element_type[0];
   reagent tmp;
   tmp.set_value(src);
   copy(element_type.begin(), element_type.end(), inserter(tmp.types, tmp.types.begin()));
-  tmp.properties.push_back(pair<string, vector<string> >("raw", vector<string>()));
-//?   cout << "AAA: " << tmp.to_string() << '\n'; //? 2
+//?   trace("run") << "AAA: " << tmp.to_string() << '\n'; //? 3
   vector<int> result(read_memory(tmp));
   trace("run") << "product 0 is " << result[0];
   write_memory(instructions[pc].products[0], result);
diff --git a/cpp/043space b/cpp/043space
index 1bb91b8e..b2b29cf3 100644
--- a/cpp/043space
+++ b/cpp/043space
@@ -16,12 +16,12 @@ recipe main [
 :(scenario "deref_sidesteps_default_space")
 recipe main [
   # pretend pointer from outside
-  7:integer <- copy 34:literal
+  3:integer <- copy 34:literal
   # pretend array
-  10:integer <- copy 5:literal
+  1000:integer <- copy 5:literal
   # actual start of this function
-  default-space:address:space <- copy 10:literal
-  1:address:integer <- copy 7:literal
+  default-space:address:space <- copy 1000:literal
+  1:address:integer <- copy 3:literal
   8:integer/raw <- copy 1:address:integer/deref
 ]
 +mem: storing 34 in location 8
@@ -37,7 +37,7 @@ reagent r = absolutize(x);
 reagent absolutize(reagent x) {
 //?   if (Recipe_number.find("increment-counter") != Recipe_number.end()) //? 1
 //?     cout << "AAA " << "increment-counter/2: " << Recipe[Recipe_number["increment-counter"]].steps[2].products[0].to_string() << '\n'; //? 1
-//?   cout << "absolutize " << x.to_string() << '\n'; //? 3
+//?   cout << "absolutize " << x.to_string() << '\n'; //? 4
 //?   cout << is_raw(x) << '\n'; //? 1
   if (is_raw(x) || is_dummy(x)) return x;
 //?   cout << "not raw: " << x.to_string() << '\n'; //? 1
@@ -52,6 +52,41 @@ reagent absolutize(reagent x) {
 :(before "return result" following "reagent deref(reagent x)")
 result.properties.push_back(pair<string, vector<string> >("raw", vector<string>()));
 
+:(scenario "deref_sidesteps_default_space_in_get")
+recipe main [
+  # pretend pointer to container from outside
+  12:integer <- copy 34:literal
+  13:integer <- copy 35:literal
+  # pretend array
+  1000:integer <- copy 5:literal
+  # actual start of this function
+  default-space:address:space <- copy 1000:literal
+  1:address:point <- copy 12:literal
+  9:integer/raw <- get 1:address:point/deref, 1:offset
+]
++mem: storing 35 in location 9
+
+:(after "reagent tmp" following "case GET:")
+tmp.properties.push_back(pair<string, vector<string> >("raw", vector<string>()));
+
+:(scenario "deref_sidesteps_default_space_in_index")
+recipe main [
+  # pretend pointer to array from outside
+  12:integer <- copy 2:literal
+  13:integer <- copy 34:literal
+  14:integer <- copy 35:literal
+  # pretend array
+  1000:integer <- copy 5:literal
+  # actual start of this function
+  default-space:address:space <- copy 1000:literal
+  1:address:array:integer <- copy 12:literal
+  9:integer/raw <- index 1:address:array:integer/deref, 1:literal
+]
++mem: storing 35 in location 9
+
+:(after "reagent tmp" following "case INDEX:")
+tmp.properties.push_back(pair<string, vector<string> >("raw", vector<string>()));
+
 :(code)
 int space_base(const reagent& x) {
   return Current_routine->calls.top().default_space;
diff --git a/cpp/050scenario b/cpp/050scenario
index 199fd692..ab057ccc 100644
--- a/cpp/050scenario
+++ b/cpp/050scenario
@@ -18,7 +18,7 @@ for (size_t i = 0; i < Scenarios.size(); ++i) {
   setup();
   Trace_file = Scenarios[i].name;
   START_TRACING_UNTIL_END_OF_SCOPE
-//?   Trace_stream->dump_layer = "all"; //? 1
+//?   Trace_stream->dump_layer = "all"; //? 2
 //?   cout << "before: " << Memory[1] << '\n'; //? 1
 //?   Trace_stream->dump_layer = "all"; //? 1
 //?   cout << "Before:\n";  dump_memory(); //? 1
diff --git a/cpp/060string.mu b/cpp/060string.mu
index 85ff65b6..fb1a1eb5 100644
--- a/cpp/060string.mu
+++ b/cpp/060string.mu
@@ -105,11 +105,111 @@ container buffer [
 
 recipe init-buffer [
   default-space:address:space <- new location:type, 30:literal
+#?   $print default-space:address:space
+#?   $print [
+#? ]
   result:address:buffer <- new buffer:type
   len:address:integer <- get-address result:address:buffer/deref, length:offset
   len:address:integer/deref <- copy 0:literal
   s:address:address:array:character <- get-address result:address:buffer/deref, data:offset
   capacity:integer <- next-ingredient
   s:address:address:array:character/deref <- new character:type, capacity:integer
+#?   $print s:address:address:array:character/deref
+#?   $print [
+#? ]
   reply result:address:buffer
 ]
+
+recipe grow-buffer [
+  default-space:address:space <- new location:type, 30:literal
+  in:address:buffer <- next-ingredient
+  # double buffer size
+  x:address:address:array:character <- get-address in:address:buffer/deref, data:offset
+  oldlen:integer <- length x:address:address:array:character/deref/deref
+  newlen:integer <- multiply oldlen:integer, 2:literal
+  olddata:address:array:character <- copy x:address:address:array:character/deref
+  x:address:address:array:character/deref <- new character:type, newlen:integer
+  # copy old contents
+  i:integer <- copy 0:literal
+  {
+    done?:boolean <- greater-or-equal i:integer, oldlen:integer
+    break-if done?:boolean
+    src:character <- index olddata:address:array:character/deref, i:integer
+    dest:address:character <- index-address x:address:address:array:character/deref/deref, i:integer
+    dest:address:character/deref <- copy src:character
+    i:integer <- add i:integer, 1:literal
+    loop
+  }
+  reply in:address:buffer
+]
+
+recipe buffer-full? [
+  default-space:address:space <- new location:type, 30:literal
+  in:address:buffer <- next-ingredient
+  len:integer <- get in:address:buffer/deref, length:offset
+  s:address:array:character <- get in:address:buffer/deref, data:offset
+  capacity:integer <- length s:address:array:character/deref
+  result:boolean <- greater-or-equal len:integer, capacity:integer
+  reply result:boolean
+]
+
+# in:address:buffer <- buffer-append in:address:buffer, c:character
+recipe buffer-append [
+  default-space:address:space <- new location:type, 30:literal
+  in:address:buffer <- next-ingredient
+  c:character <- next-ingredient
+  {
+    # grow buffer if necessary
+    full?:boolean <- buffer-full? in:address:buffer
+    break-unless full?:boolean
+    in:address:buffer <- grow-buffer in:address:buffer
+  }
+  len:address:integer <- get-address in:address:buffer/deref, length:offset
+  s:address:array:character <- get in:address:buffer/deref, data:offset
+  dest:address:character <- index-address s:address:array:character/deref, len:address:integer/deref
+  dest:address:character/deref <- copy c:character
+  len:address:integer/deref <- add len:address:integer/deref, 1:literal
+  reply in:address:buffer/same-as-arg:0
+]
+
+scenario buffer-append-works [
+  run [
+    default-space:address:space <- new location:type, 30:literal
+    x:address:buffer <- init-buffer 3:literal
+    s1:address:array:character <- get x:address:buffer/deref, data:offset
+    x:address:buffer <- buffer-append x:address:buffer, 97:literal  # 'a'
+    x:address:buffer <- buffer-append x:address:buffer, 98:literal  # 'b'
+    x:address:buffer <- buffer-append x:address:buffer, 99:literal  # 'c'
+    s2:address:array:character <- get x:address:buffer/deref, data:offset
+    1:boolean/raw <- equal s1:address:array:character, s2:address:array:character
+#?     $print s2:address:array:character
+#?     $print [
+#? ]
+#?     $print 1060:integer/raw
+#?     $print [
+#? ]
+#?     $print 1061:integer/raw
+#?     $print [
+#? ]
+#?     $print 1062:integer/raw
+#?     $print [
+#? ]
+#?     $print 1063:integer/raw
+#?     $print [
+#? ]
+#?     $print 1064:integer/raw
+#?     $print [
+#? ]
+#?     $print 1065:integer/raw
+#?     $print [
+#? ]
+    2:array:character/raw <- copy s2:address:array:character/deref
+  ]
+  memory should contain [
+    1 <- 1   # no change in data pointer
+    2 <- 3   # size of data
+    3 <- 97  # data
+    4 <- 98
+    5 <- 99
+  ]
+]