about summary refs log tree commit diff stats
path: root/062rewrite_stash.cc
blob: 68738341742916cb7d2854c05052deceb7e24fc6 (plain) (blame)
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
//: when encountering other types, try to convert them to strings using
//: 'to-text'

:(scenarios transform)
:(scenario rewrite_stashes_to_text)
recipe main [
  local-scope
  n:number <- copy 34
  stash n
]
+transform: {stash_2_0: ("address" "array" "character")} <- to-text-line {n: "number"}
+transform: stash {stash_2_0: ("address" "array" "character")}

:(scenario rewrite_traces_to_text)
recipe main [
  local-scope
  n:number <- copy 34
  trace 2, [app], n
]
+transform: {trace_2_2: ("address" "array" "character")} <- to-text-line {n: "number"}
+transform: trace {2: "literal"}, {"app": "literal-string"}, {trace_2_2: ("address" "array" "character")}

//: special case: rewrite attempts to stash contents of most arrays to avoid
//: passing addresses around

:(scenario rewrite_stashes_of_arrays)
recipe main [
  local-scope
  n:address:array:number <- new number:type, 3
  stash *n
]
+transform: {stash_2_0: ("address" "array" "character")} <- array-to-text-line {n: ("address" "array" "number")}
+transform: stash {stash_2_0: ("address" "array" "character")}

:(scenario ignore_stashes_of_static_arrays)
recipe main [
  local-scope
  n:array:number:3 <- create-array
  stash n
]
+transform: stash {n: ("array" "number" "3")}

:(scenario rewrite_stashes_of_recipe_header_products)
container foo [
  x:number
]
recipe bar -> x:foo [
  local-scope
  load-ingredients
  x <- merge 34
  stash x
]
+transform: stash {stash_2_0: ("address" "array" "character")}

//: misplaced; should be in instruction inserting/deleting transforms, but has
//: prerequisites: deduce_types_from_header and check_or_set_types_by_name
:(after "Transform.push_back(deduce_types_from_header)")
Transform.push_back(rewrite_stashes_to_text);

:(code)
void rewrite_stashes_to_text(recipe_ordinal r) {
  recipe& caller = get(Recipe, r);
  trace(9991, "transform") << "--- rewrite 'stash' instructions in recipe " << caller.name << end();
  // in recipes without named locations, 'stash' is still not extensible
  if (contains_numeric_locations(caller)) return;
  rewrite_stashes_to_text(caller);
}

void rewrite_stashes_to_text(recipe& caller) {
  vector<instruction> new_instructions;
  for (int i = 0; i < SIZE(caller.steps); ++i) {
    instruction& inst = caller.steps.at(i);
    if (inst.name == "stash") {
      for (int j = 0; j < SIZE(inst.ingredients); ++j) {
        ostringstream ingredient_name;
        ingredient_name << "stash_" << i << '_' << j << ":address:array:character";
        rewrite_stash_to_text(inst.ingredients.at(j), new_instructions, ingredient_name.str());
      }
    }
    else if (inst.name == "trace") {
      for (int j = /*skip*/2; j < SIZE(inst.ingredients); ++j) {
        ostringstream ingredient_name;
        ingredient_name << "trace_" << i << '_' << j << ":address:array:character";
        rewrite_stash_to_text(inst.ingredients.at(j), new_instructions, ingredient_name.str());
      }
    }
    trace(9993, "transform") << to_string(inst) << end();
    new_instructions.push_back(inst);
  }
  caller.steps.swap(new_instructions);
}

// add an instruction to convert reagent 'r' to text in list 'out', then
// replace r with converted text
void rewrite_stash_to_text(reagent& r, vector<instruction>& out, const string& tmp_var) {
  if (!r.type) return;  // error; will be handled elsewhere
  if (is_literal(r)) return;
  if (is_mu_string(r)) return;
  // don't try to extend static arrays
  if (is_static_array(r)) return;
  instruction def;
  if (is_lookup_of_address_of_array(r)) {
    def.name = "array-to-text-line";
    reagent/*copy*/ tmp = r;
    drop_one_lookup(tmp);
    def.ingredients.push_back(tmp);
  }
  else {
    def.name = "to-text-line";
    def.ingredients.push_back(r);
  }
  def.products.push_back(reagent(tmp_var));
  trace(9993, "transform") << to_string(def) << end();
  out.push_back(def);
  r.clear();  // reclaim old memory
  r = reagent(tmp_var);
}

bool is_lookup_of_address_of_array(reagent/*copy*/ x) {
  if (x.type->name != "address") return false;
  if (!canonize_type(x)) return false;
  return x.type->name == "array";
}

bool is_static_array(const reagent& x) {
  // no canonize_type()
  return x.type->name == "array";
}

//: Make sure that the new system is strictly better than just the 'stash'
//: primitive by itself.

:(scenarios run)
:(scenario rewrite_stash_continues_to_fall_back_to_default_implementation)
# type without a to-text implementation
container foo [
  x:number
  y:number
]
recipe main [
  local-scope
  x:foo <- merge 34, 35
  stash x
]
+app: 34 35

:(before "End Primitive Recipe Declarations")
TO_TEXT,
:(before "End Primitive Recipe Numbers")
put(Recipe_ordinal, "to-text", TO_TEXT);
:(before "End Primitive Recipe Checks")
case TO_TEXT: {
  if (SIZE(inst.ingredients) != 1) {
    raise << maybe(get(Recipe, r).name) << "'to-text' requires a single ingredient, but got '" << inst.original_string << "'\n" << end();
    break;
  }
  // can handle any type
  break;
}
:(before "End Primitive Recipe Implementations")
case TO_TEXT: {
  products.resize(1);
  products.at(0).push_back(new_mu_string(print_mu(current_instruction().ingredients.at(0), ingredients.at(0))));
  break;
}
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 +buffer-filled x:address:buffer <- buffer-append x:address:buffer, 100:literal # 'd' s3:address:array:character <- get x:address:buffer/deref, data:offset 10:boolean/raw <- equal s1:address:array:character, s3:address:array:character 11:integer/raw <- get x:address:buffer/deref, length:offset 12:array:character/raw <- copy s3:address:array:character/deref ": "literal-string"]} parse/0: instruction: memory-should-contain parse/0: ingredient: {name: " # before +buffer-filled 1 <- 1 # no change in data pointer 2 <- 3 # size of data 3 <- 97 # data 4 <- 98 5 <- 99 # in the end 10 <- 0 # data pointer has grown 11 <- 4 # final length 12 <- 6 # but data's capacity has doubled 13 <- 97 # data 14 <- 98 15 <- 99 16 <- 100 17 <- 0 18 <- 0 ", value: 0, type: 0, properties: [" # before +buffer-filled 1 <- 1 # no change in data pointer 2 <- 3 # size of data 3 <- 97 # data 4 <- 98 5 <- 99 # in the end 10 <- 0 # data pointer has grown 11 <- 4 # final length 12 <- 6 # but data's capacity has doubled 13 <- 97 # data 14 <- 98 15 <- 99 16 <- 100 17 <- 0 18 <- 0 ": "literal-string"]} after-brace/0: recipe buffer-append-works after-brace/0: run ... after-brace/0: memory-should-contain ... new/0: routine allocated memory from 1000 to 101000 schedule/0: buffer-append-works run/0: instruction buffer-append-works/0 run/0: run/44 {name: " default-space:address:array:location <- 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 +buffer-filled x:address:buffer <- buffer-append x:address:buffer, 100:literal # 'd' s3:address:array:character <- get x:address:buffer/deref, data:offset 10:boolean/raw <- equal s1:address:array:character, s3:address:array:character 11:integer/raw <- get x:address:buffer/deref, length:offset 12:array:character/raw <- copy s3:address:array:character/deref ", value: 0, type: 0, properties: [" default-space:address:array:location <- 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 +buffer-filled x:address:buffer <- buffer-append x:address:buffer, 100:literal # 'd' s3:address:array:character <- get x:address:buffer/deref, data:offset 10:boolean/raw <- equal s1:address:array:character, s3:address:array:character 11:integer/raw <- get x:address:buffer/deref, length:offset 12:array:character/raw <- copy s3:address:array:character/deref ": "literal-string"]} parse/0: instruction: new 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: init-buffer 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: get 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: buffer-append 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: buffer-append 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: buffer-append 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: get 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: equal 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: copy 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": ]} parse/0: label: +buffer-filled parse/0: instruction: buffer-append parse/0: ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]} parse/0: ingredient: {name: "100", value: 0, type: 0, properties: ["100": "literal"]} parse/0: product: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]} parse/0: instruction: get 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: "s3", value: 0, type: 2-5-4, properties: ["s3": "address":"array":"character"]} parse/0: instruction: equal parse/0: ingredient: {name: "s1", value: 0, type: 2-5-4, properties: ["s1": "address":"array":"character"]} parse/0: ingredient: {name: "s3", value: 0, type: 2-5-4, properties: ["s3": "address":"array":"character"]} parse/0: product: {name: "10", value: 0, type: 3, properties: ["10": "boolean", "raw": ]} parse/0: instruction: get parse/0: ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer", "deref": ]} parse/0: ingredient: {name: "length", value: 0, type: 0, properties: ["length": "offset"]} parse/0: product: {name: "11", value: 0, type: 1, properties: ["11": "integer", "raw": ]} parse/0: instruction: copy parse/0: ingredient: {name: "s3", value: 0, type: 2-5-4, properties: ["s3": "address":"array":"character", "deref": ]} parse/0: product: {name: "12", value: 0, type: 5-4, properties: ["12": "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 name/0: element data of type buffer is at offset 1 name/0: assign s3 4 name/0: element length of type buffer is at offset 0 after-brace/0: recipe run1001 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 ... after-brace/0: buffer-append ... after-brace/0: get ... after-brace/0: equal ... after-brace/0: get ... after-brace/0: copy ... run/0: instruction run1001/0 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/43 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]} mem/0: array size is 30 mem/0: new alloc: 1000 run/0: instruction run1001/1 run/0: {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]} <- init-buffer/101 {name: "3", value: 3, type: 0, properties: ["3": "literal"]} run/0: instruction init-buffer/0 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/43 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]} mem/0: array size is 30 mem/0: new alloc: 1031 run/0: instruction init-buffer/1 run/0: {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer"]} <- new/43 {name: "buffer", value: 9, type: 0, properties: ["buffer": "type"]} mem/0: new alloc: 1062 mem/0: storing 1062 in location 1033 run/0: instruction init-buffer/2 run/0: {name: "len", value: 2, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/25 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]} run/0: ingredient 0 is result mem/0: location 1033 is 1062 run/0: ingredient 1 is length run/0: address to copy is 1062 run/0: product 0 is 1062 mem/0: storing 1062 in location 1034 run/0: instruction init-buffer/3 run/0: {name: "len", value: 2, type: 2-1, properties: ["len": "address":"integer", "deref": ]} <- copy/1 {name: "0", value: 0, type: 0, properties: ["0": "literal"]} run/0: ingredient 0 is 0 mem/0: location 1034 is 1062 mem/0: storing 0 in location 1062 run/0: instruction init-buffer/4 run/0: {name: "s", value: 3, type: 2-2-5-4, properties: ["s": "address":"address":"array":"character"]} <- get-address/25 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]} run/0: ingredient 0 is result mem/0: location 1033 is 1062 run/0: ingredient 1 is data run/0: address to copy is 1063 run/0: product 0 is 1063 mem/0: storing 1063 in location 1035 run/0: instruction init-buffer/5 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- next-ingredient/30 run/0: product 0 is 3 mem/0: storing 3 in location 1036 run/0: instruction init-buffer/6 run/0: {name: "s", value: 3, type: 2-2-5-4, properties: ["s": "address":"address":"array":"character", "deref": ]} <- new/43 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} mem/0: location 1036 is 3 mem/0: array size is 3 mem/0: new alloc: 1064 mem/0: location 1035 is 1063 mem/0: storing 1064 in location 1063 run/0: instruction init-buffer/7 run/0: reply/33 {name: "result", value: 1, type: 2-9, properties: ["result": "address":"buffer"]} mem/0: location 1033 is 1062 run/0: result 0 is 1062 mem/0: storing 1062 in location 1002 run/0: instruction run1001/2 run/0: {name: "s1", value: 2, type: 2-5-4, properties: ["s1": "address":"array":"character"]} <- get/24 {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]} run/0: ingredient 0 is x mem/0: location 1002 is 1062 run/0: ingredient 1 is data run/0: address to copy is 1063 run/0: its type is 2 mem/0: location 1063 is 1064 run/0: product 0 is 1064 mem/0: storing 1064 in location 1003 run/0: instruction run1001/3 run/0: {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]} <- buffer-append/104 {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]}, {name: "97", value: 97, type: 0, properties: ["97": "literal"]} mem/0: location 1002 is 1062 run/0: instruction buffer-append/0 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/43 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]} mem/0: array size is 30 mem/0: new alloc: 1068 run/0: instruction buffer-append/1 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 run/0: product 0 is 1062 mem/0: storing 1062 in location 1070 run/0: instruction buffer-append/2 run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/30 run/0: product 0 is 97 mem/0: storing 97 in location 1071 run/0: instruction buffer-append/4 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full?/103 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} mem/0: location 1070 is 1062 run/0: instruction buffer-full?/0 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/43 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]} mem/0: array size is 30 mem/0: new alloc: 1099 run/0: instruction buffer-full?/1 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 run/0: product 0 is 1062 mem/0: storing 1062 in location 1101 run/0: instruction buffer-full?/2 run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]} run/0: ingredient 0 is in mem/0: location 1101 is 1062 run/0: ingredient 1 is length run/0: address to copy is 1062 run/0: its type is 1 mem/0: location 1062 is 0 run/0: product 0 is 0 mem/0: storing 0 in location 1102 run/0: instruction buffer-full?/3 run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]} run/0: ingredient 0 is in mem/0: location 1101 is 1062 run/0: ingredient 1 is data run/0: address to copy is 1063 run/0: its type is 2 mem/0: location 1063 is 1064 run/0: product 0 is 1064 mem/0: storing 1064 in location 1103 run/0: instruction buffer-full?/4 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/28 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]} mem/0: location 1103 is 1064 mem/0: storing 3 in location 1104 run/0: instruction buffer-full?/5 run/0: {name: "result", value: 5, type: 3, properties: ["result": "boolean"]} <- greater-or-equal/16 {name: "len", value: 2, type: 1, properties: ["len": "integer"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} run/0: ingredient 0 is len mem/0: location 1102 is 0 run/0: ingredient 1 is capacity mem/0: location 1104 is 3 run/0: product 0 is 0 mem/0: storing 0 in location 1105 run/0: instruction buffer-full?/6 run/0: reply/33 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]} mem/0: location 1105 is 0 run/0: result 0 is 0 mem/0: storing 0 in location 1072 run/0: instruction buffer-append/5 run/0: break-unless/12 {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]} mem/0: location 1072 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: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/25 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]} run/0: ingredient 0 is in mem/0: location 1070 is 1062 run/0: ingredient 1 is length run/0: address to copy is 1062 run/0: product 0 is 1062 mem/0: storing 1062 in location 1073 run/0: instruction buffer-append/9 run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]} run/0: ingredient 0 is in mem/0: location 1070 is 1062 run/0: ingredient 1 is data run/0: address to copy is 1063 run/0: its type is 2 mem/0: location 1063 is 1064 run/0: product 0 is 1064 mem/0: storing 1064 in location 1074 run/0: instruction buffer-append/10 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} run/0: ingredient 0 is s mem/0: location 1074 is 1064 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} mem/0: location 1073 is 1062 mem/0: location 1062 is 0 run/0: address to copy is 1065 run/0: product 0 is 1065 mem/0: storing 1065 in location 1075 run/0: instruction buffer-append/11 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy/1 {name: "c", value: 2, type: 4, properties: ["c": "character"]} run/0: ingredient 0 is c mem/0: location 1071 is 97 mem/0: location 1075 is 1065 mem/0: storing 97 in location 1065 run/0: instruction buffer-append/12 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} <- add/2 {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]} run/0: ingredient 0 is len mem/0: location 1073 is 1062 mem/0: location 1062 is 0 run/0: ingredient 1 is 1 run/0: product 0 is 1 mem/0: location 1073 is 1062 mem/0: storing 1 in location 1062 run/0: instruction buffer-append/13 run/0: reply/33 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]} mem/0: location 1070 is 1062 run/0: result 0 is 1062 mem/0: storing 1062 in location 1002 run/0: instruction run1001/4 run/0: {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]} <- buffer-append/104 {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]}, {name: "98", value: 98, type: 0, properties: ["98": "literal"]} mem/0: location 1002 is 1062 run/0: instruction buffer-append/0 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/43 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]} mem/0: array size is 30 mem/0: new alloc: 1130 run/0: instruction buffer-append/1 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 run/0: product 0 is 1062 mem/0: storing 1062 in location 1132 run/0: instruction buffer-append/2 run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/30 run/0: product 0 is 98 mem/0: storing 98 in location 1133 run/0: instruction buffer-append/4 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full?/103 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} mem/0: location 1132 is 1062 run/0: instruction buffer-full?/0 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/43 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]} mem/0: array size is 30 mem/0: new alloc: 1161 run/0: instruction buffer-full?/1 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 run/0: product 0 is 1062 mem/0: storing 1062 in location 1163 run/0: instruction buffer-full?/2 run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]} run/0: ingredient 0 is in mem/0: location 1163 is 1062 run/0: ingredient 1 is length run/0: address to copy is 1062 run/0: its type is 1 mem/0: location 1062 is 1 run/0: product 0 is 1 mem/0: storing 1 in location 1164 run/0: instruction buffer-full?/3 run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]} run/0: ingredient 0 is in mem/0: location 1163 is 1062 run/0: ingredient 1 is data run/0: address to copy is 1063 run/0: its type is 2 mem/0: location 1063 is 1064 run/0: product 0 is 1064 mem/0: storing 1064 in location 1165 run/0: instruction buffer-full?/4 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/28 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]} mem/0: location 1165 is 1064 mem/0: storing 3 in location 1166 run/0: instruction buffer-full?/5 run/0: {name: "result", value: 5, type: 3, properties: ["result": "boolean"]} <- greater-or-equal/16 {name: "len", value: 2, type: 1, properties: ["len": "integer"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} run/0: ingredient 0 is len mem/0: location 1164 is 1 run/0: ingredient 1 is capacity mem/0: location 1166 is 3 run/0: product 0 is 0 mem/0: storing 0 in location 1167 run/0: instruction buffer-full?/6 run/0: reply/33 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]} mem/0: location 1167 is 0 run/0: result 0 is 0 mem/0: storing 0 in location 1134 run/0: instruction buffer-append/5 run/0: break-unless/12 {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]} mem/0: location 1134 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: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/25 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]} run/0: ingredient 0 is in mem/0: location 1132 is 1062 run/0: ingredient 1 is length run/0: address to copy is 1062 run/0: product 0 is 1062 mem/0: storing 1062 in location 1135 run/0: instruction buffer-append/9 run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]} run/0: ingredient 0 is in mem/0: location 1132 is 1062 run/0: ingredient 1 is data run/0: address to copy is 1063 run/0: its type is 2 mem/0: location 1063 is 1064 run/0: product 0 is 1064 mem/0: storing 1064 in location 1136 run/0: instruction buffer-append/10 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} run/0: ingredient 0 is s mem/0: location 1136 is 1064 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} mem/0: location 1135 is 1062 mem/0: location 1062 is 1 run/0: address to copy is 1066 run/0: product 0 is 1066 mem/0: storing 1066 in location 1137 run/0: instruction buffer-append/11 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy/1 {name: "c", value: 2, type: 4, properties: ["c": "character"]} run/0: ingredient 0 is c mem/0: location 1133 is 98 mem/0: location 1137 is 1066 mem/0: storing 98 in location 1066 run/0: instruction buffer-append/12 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} <- add/2 {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]} run/0: ingredient 0 is len mem/0: location 1135 is 1062 mem/0: location 1062 is 1 run/0: ingredient 1 is 1 run/0: product 0 is 2 mem/0: location 1135 is 1062 mem/0: storing 2 in location 1062 run/0: instruction buffer-append/13 run/0: reply/33 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]} mem/0: location 1132 is 1062 run/0: result 0 is 1062 mem/0: storing 1062 in location 1002 run/0: instruction run1001/5 run/0: {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]} <- buffer-append/104 {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]}, {name: "99", value: 99, type: 0, properties: ["99": "literal"]} mem/0: location 1002 is 1062 run/0: instruction buffer-append/0 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/43 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]} mem/0: array size is 30 mem/0: new alloc: 1192 run/0: instruction buffer-append/1 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 run/0: product 0 is 1062 mem/0: storing 1062 in location 1194 run/0: instruction buffer-append/2 run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/30 run/0: product 0 is 99 mem/0: storing 99 in location 1195 run/0: instruction buffer-append/4 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full?/103 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} mem/0: location 1194 is 1062 run/0: instruction buffer-full?/0 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/43 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]} mem/0: array size is 30 mem/0: new alloc: 1223 run/0: instruction buffer-full?/1 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 run/0: product 0 is 1062 mem/0: storing 1062 in location 1225 run/0: instruction buffer-full?/2 run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]} run/0: ingredient 0 is in mem/0: location 1225 is 1062 run/0: ingredient 1 is length run/0: address to copy is 1062 run/0: its type is 1 mem/0: location 1062 is 2 run/0: product 0 is 2 mem/0: storing 2 in location 1226 run/0: instruction buffer-full?/3 run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]} run/0: ingredient 0 is in mem/0: location 1225 is 1062 run/0: ingredient 1 is data run/0: address to copy is 1063 run/0: its type is 2 mem/0: location 1063 is 1064 run/0: product 0 is 1064 mem/0: storing 1064 in location 1227 run/0: instruction buffer-full?/4 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/28 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]} mem/0: location 1227 is 1064 mem/0: storing 3 in location 1228 run/0: instruction buffer-full?/5 run/0: {name: "result", value: 5, type: 3, properties: ["result": "boolean"]} <- greater-or-equal/16 {name: "len", value: 2, type: 1, properties: ["len": "integer"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} run/0: ingredient 0 is len mem/0: location 1226 is 2 run/0: ingredient 1 is capacity mem/0: location 1228 is 3 run/0: product 0 is 0 mem/0: storing 0 in location 1229 run/0: instruction buffer-full?/6 run/0: reply/33 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]} mem/0: location 1229 is 0 run/0: result 0 is 0 mem/0: storing 0 in location 1196 run/0: instruction buffer-append/5 run/0: break-unless/12 {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]} mem/0: location 1196 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: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/25 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]} run/0: ingredient 0 is in mem/0: location 1194 is 1062 run/0: ingredient 1 is length run/0: address to copy is 1062 run/0: product 0 is 1062 mem/0: storing 1062 in location 1197 run/0: instruction buffer-append/9 run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]} run/0: ingredient 0 is in mem/0: location 1194 is 1062 run/0: ingredient 1 is data run/0: address to copy is 1063 run/0: its type is 2 mem/0: location 1063 is 1064 run/0: product 0 is 1064 mem/0: storing 1064 in location 1198 run/0: instruction buffer-append/10 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} run/0: ingredient 0 is s mem/0: location 1198 is 1064 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} mem/0: location 1197 is 1062 mem/0: location 1062 is 2 run/0: address to copy is 1067 run/0: product 0 is 1067 mem/0: storing 1067 in location 1199 run/0: instruction buffer-append/11 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy/1 {name: "c", value: 2, type: 4, properties: ["c": "character"]} run/0: ingredient 0 is c mem/0: location 1195 is 99 mem/0: location 1199 is 1067 mem/0: storing 99 in location 1067 run/0: instruction buffer-append/12 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} <- add/2 {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]} run/0: ingredient 0 is len mem/0: location 1197 is 1062 mem/0: location 1062 is 2 run/0: ingredient 1 is 1 run/0: product 0 is 3 mem/0: location 1197 is 1062 mem/0: storing 3 in location 1062 run/0: instruction buffer-append/13 run/0: reply/33 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]} mem/0: location 1194 is 1062 run/0: result 0 is 1062 mem/0: storing 1062 in location 1002 run/0: instruction run1001/6 run/0: {name: "s2", value: 3, type: 2-5-4, properties: ["s2": "address":"array":"character"]} <- get/24 {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]} run/0: ingredient 0 is x mem/0: location 1002 is 1062 run/0: ingredient 1 is data run/0: address to copy is 1063 run/0: its type is 2 mem/0: location 1063 is 1064 run/0: product 0 is 1064 mem/0: storing 1064 in location 1004 run/0: instruction run1001/7 run/0: {name: "1", value: 1, type: 3, properties: ["1": "boolean", "raw": ]} <- equal/13 {name: "s1", value: 2, type: 2-5-4, properties: ["s1": "address":"array":"character"]}, {name: "s2", value: 3, type: 2-5-4, properties: ["s2": "address":"array":"character"]} run/0: ingredient 0 is s1 mem/0: location 1003 is 1064 run/0: ingredient 1 is s2 mem/0: location 1004 is 1064 run/0: product 0 is 1 mem/0: storing 1 in location 1 run/0: instruction run1001/8 run/0: {name: "2", value: 2, type: 5-4, properties: ["2": "array":"character", "raw": ]} <- copy/1 {name: "s2", value: 3, type: 2-5-4, properties: ["s2": "address":"array":"character", "deref": ]} run/0: ingredient 0 is s2 mem/0: location 1004 is 1064 mem/0: location 1064 is 3 mem/0: location 1065 is 97 mem/0: location 1066 is 98 mem/0: location 1067 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 run/0: instruction run1001/10 run/0: {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]} <- buffer-append/104 {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer"]}, {name: "100", value: 100, type: 0, properties: ["100": "literal"]} mem/0: location 1002 is 1062 run/0: instruction buffer-append/0 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/43 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]} mem/0: array size is 30 mem/0: new alloc: 1254 run/0: instruction buffer-append/1 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 run/0: product 0 is 1062 mem/0: storing 1062 in location 1256 run/0: instruction buffer-append/2 run/0: {name: "c", value: 2, type: 4, properties: ["c": "character"]} <- next-ingredient/30 run/0: product 0 is 100 mem/0: storing 100 in location 1257 run/0: instruction buffer-append/4 run/0: {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]} <- buffer-full?/103 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} mem/0: location 1256 is 1062 run/0: instruction buffer-full?/0 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/43 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]} mem/0: array size is 30 mem/0: new alloc: 1285 run/0: instruction buffer-full?/1 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 run/0: product 0 is 1062 mem/0: storing 1062 in location 1287 run/0: instruction buffer-full?/2 run/0: {name: "len", value: 2, type: 1, properties: ["len": "integer"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]} run/0: ingredient 0 is in mem/0: location 1287 is 1062 run/0: ingredient 1 is length run/0: address to copy is 1062 run/0: its type is 1 mem/0: location 1062 is 3 run/0: product 0 is 3 mem/0: storing 3 in location 1288 run/0: instruction buffer-full?/3 run/0: {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]} run/0: ingredient 0 is in mem/0: location 1287 is 1062 run/0: ingredient 1 is data run/0: address to copy is 1063 run/0: its type is 2 mem/0: location 1063 is 1064 run/0: product 0 is 1064 mem/0: storing 1064 in location 1289 run/0: instruction buffer-full?/4 run/0: {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} <- length/28 {name: "s", value: 3, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]} mem/0: location 1289 is 1064 mem/0: storing 3 in location 1290 run/0: instruction buffer-full?/5 run/0: {name: "result", value: 5, type: 3, properties: ["result": "boolean"]} <- greater-or-equal/16 {name: "len", value: 2, type: 1, properties: ["len": "integer"]}, {name: "capacity", value: 4, type: 1, properties: ["capacity": "integer"]} run/0: ingredient 0 is len mem/0: location 1288 is 3 run/0: ingredient 1 is capacity mem/0: location 1290 is 3 run/0: product 0 is 1 mem/0: storing 1 in location 1291 run/0: instruction buffer-full?/6 run/0: reply/33 {name: "result", value: 5, type: 3, properties: ["result": "boolean"]} mem/0: location 1291 is 1 run/0: result 0 is 1 mem/0: storing 1 in location 1258 run/0: instruction buffer-append/5 run/0: break-unless/12 {name: "full?", value: 3, type: 3, properties: ["full?": "boolean"]}, {name: "", value: 1, type: , properties: ["": ]} mem/0: location 1258 is 1 run/0: ingredient 0 is 1 run/0: jump-unless fell through run/0: instruction buffer-append/6 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- grow-buffer/102 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} mem/0: location 1256 is 1062 run/0: instruction grow-buffer/0 run/0: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]} <- new/43 {name: "location", value: 1, type: 0, properties: ["location": "type"]}, {name: "30", value: 30, type: 0, properties: ["30": "literal"]} mem/0: array size is 30 mem/0: new alloc: 1316 run/0: instruction grow-buffer/1 run/0: {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} <- next-ingredient/30 run/0: product 0 is 1062 mem/0: storing 1062 in location 1318 run/0: instruction grow-buffer/2 run/0: {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character"]} <- get-address/25 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]} run/0: ingredient 0 is in mem/0: location 1318 is 1062 run/0: ingredient 1 is data run/0: address to copy is 1063 run/0: product 0 is 1063 mem/0: storing 1063 in location 1319 run/0: instruction grow-buffer/3 run/0: {name: "oldlen", value: 3, type: 1, properties: ["oldlen": "integer"]} <- length/28 {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": , "deref": ]} mem/0: location 1319 is 1063 mem/0: location 1063 is 1064 mem/0: storing 3 in location 1320 run/0: instruction grow-buffer/4 run/0: {name: "newlen", value: 4, type: 1, properties: ["newlen": "integer"]} <- multiply/4 {name: "oldlen", value: 3, type: 1, properties: ["oldlen": "integer"]}, {name: "2", value: 2, type: 0, properties: ["2": "literal"]} run/0: ingredient 0 is oldlen mem/0: location 1320 is 3 run/0: ingredient 1 is 2 run/0: ingredient 1 is 2 run/0: product 0 is 6 mem/0: storing 6 in location 1321 run/0: instruction grow-buffer/5 run/0: {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character"]} <- copy/1 {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": ]} run/0: ingredient 0 is x mem/0: location 1319 is 1063 mem/0: location 1063 is 1064 mem/0: storing 1064 in location 1322 run/0: instruction grow-buffer/6 run/0: {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": ]} <- new/43 {name: "character", value: 4, type: 0, properties: ["character": "type"]}, {name: "newlen", value: 4, type: 1, properties: ["newlen": "integer"]} mem/0: location 1321 is 6 mem/0: array size is 6 mem/0: new alloc: 1347 mem/0: location 1319 is 1063 mem/0: storing 1347 in location 1063 run/0: instruction grow-buffer/7 run/0: {name: "i", value: 6, type: 1, properties: ["i": "integer"]} <- copy/1 {name: "0", value: 0, type: 0, properties: ["0": "literal"]} run/0: ingredient 0 is 0 mem/0: storing 0 in location 1323 run/0: instruction grow-buffer/9 run/0: {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal/16 {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "oldlen", value: 3, type: 1, properties: ["oldlen": "integer"]} run/0: ingredient 0 is i mem/0: location 1323 is 0 run/0: ingredient 1 is oldlen mem/0: location 1320 is 3 run/0: product 0 is 0 mem/0: storing 0 in location 1324 run/0: instruction grow-buffer/10 run/0: break-if/11 {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 5, type: , properties: ["": ]} mem/0: location 1324 is 0 run/0: ingredient 0 is 0 run/0: jump-if fell through run/0: instruction grow-buffer/11 run/0: {name: "src", value: 8, type: 4, properties: ["src": "character"]} <- index/26 {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]} run/0: ingredient 0 is {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]} mem/0: location 1322 is 1064 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]} mem/0: location 1323 is 0 run/0: address to copy is 1065 run/0: its type is 4 mem/0: location 1065 is 97 run/0: product 0 is 97 mem/0: storing 97 in location 1325 run/0: instruction grow-buffer/12 run/0: {name: "dest", value: 9, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": , "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]} run/0: ingredient 0 is x mem/0: location 1319 is 1063 mem/0: location 1063 is 1347 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]} mem/0: location 1323 is 0 run/0: address to copy is 1348 run/0: product 0 is 1348 mem/0: storing 1348 in location 1326 run/0: instruction grow-buffer/13 run/0: {name: "dest", value: 9, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy/1 {name: "src", value: 8, type: 4, properties: ["src": "character"]} run/0: ingredient 0 is src mem/0: location 1325 is 97 mem/0: location 1326 is 1348 mem/0: storing 97 in location 1348 run/0: instruction grow-buffer/14 run/0: {name: "i", value: 6, type: 1, properties: ["i": "integer"]} <- add/2 {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]} run/0: ingredient 0 is i mem/0: location 1323 is 0 run/0: ingredient 1 is 1 run/0: product 0 is 1 mem/0: storing 1 in location 1323 run/0: instruction grow-buffer/15 run/0: loop/10 {name: "", value: -7, type: , properties: ["": ]} run/0: ingredient 0 is -7 run/0: jumping to instruction 9 run/0: instruction grow-buffer/9 run/0: {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal/16 {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "oldlen", value: 3, type: 1, properties: ["oldlen": "integer"]} run/0: ingredient 0 is i mem/0: location 1323 is 1 run/0: ingredient 1 is oldlen mem/0: location 1320 is 3 run/0: product 0 is 0 mem/0: storing 0 in location 1324 run/0: instruction grow-buffer/10 run/0: break-if/11 {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 5, type: , properties: ["": ]} mem/0: location 1324 is 0 run/0: ingredient 0 is 0 run/0: jump-if fell through run/0: instruction grow-buffer/11 run/0: {name: "src", value: 8, type: 4, properties: ["src": "character"]} <- index/26 {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]} run/0: ingredient 0 is {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]} mem/0: location 1322 is 1064 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]} mem/0: location 1323 is 1 run/0: address to copy is 1066 run/0: its type is 4 mem/0: location 1066 is 98 run/0: product 0 is 98 mem/0: storing 98 in location 1325 run/0: instruction grow-buffer/12 run/0: {name: "dest", value: 9, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": , "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]} run/0: ingredient 0 is x mem/0: location 1319 is 1063 mem/0: location 1063 is 1347 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]} mem/0: location 1323 is 1 run/0: address to copy is 1349 run/0: product 0 is 1349 mem/0: storing 1349 in location 1326 run/0: instruction grow-buffer/13 run/0: {name: "dest", value: 9, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy/1 {name: "src", value: 8, type: 4, properties: ["src": "character"]} run/0: ingredient 0 is src mem/0: location 1325 is 98 mem/0: location 1326 is 1349 mem/0: storing 98 in location 1349 run/0: instruction grow-buffer/14 run/0: {name: "i", value: 6, type: 1, properties: ["i": "integer"]} <- add/2 {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]} run/0: ingredient 0 is i mem/0: location 1323 is 1 run/0: ingredient 1 is 1 run/0: product 0 is 2 mem/0: storing 2 in location 1323 run/0: instruction grow-buffer/15 run/0: loop/10 {name: "", value: -7, type: , properties: ["": ]} run/0: ingredient 0 is -7 run/0: jumping to instruction 9 run/0: instruction grow-buffer/9 run/0: {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal/16 {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "oldlen", value: 3, type: 1, properties: ["oldlen": "integer"]} run/0: ingredient 0 is i mem/0: location 1323 is 2 run/0: ingredient 1 is oldlen mem/0: location 1320 is 3 run/0: product 0 is 0 mem/0: storing 0 in location 1324 run/0: instruction grow-buffer/10 run/0: break-if/11 {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 5, type: , properties: ["": ]} mem/0: location 1324 is 0 run/0: ingredient 0 is 0 run/0: jump-if fell through run/0: instruction grow-buffer/11 run/0: {name: "src", value: 8, type: 4, properties: ["src": "character"]} <- index/26 {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]} run/0: ingredient 0 is {name: "olddata", value: 5, type: 2-5-4, properties: ["olddata": "address":"array":"character", "deref": ]} mem/0: location 1322 is 1064 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]} mem/0: location 1323 is 2 run/0: address to copy is 1067 run/0: its type is 4 mem/0: location 1067 is 99 run/0: product 0 is 99 mem/0: storing 99 in location 1325 run/0: instruction grow-buffer/12 run/0: {name: "dest", value: 9, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "x", value: 2, type: 2-2-5-4, properties: ["x": "address":"address":"array":"character", "deref": , "deref": ]}, {name: "i", value: 6, type: 1, properties: ["i": "integer"]} run/0: ingredient 0 is x mem/0: location 1319 is 1063 mem/0: location 1063 is 1347 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]} mem/0: location 1323 is 2 run/0: address to copy is 1350 run/0: product 0 is 1350 mem/0: storing 1350 in location 1326 run/0: instruction grow-buffer/13 run/0: {name: "dest", value: 9, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy/1 {name: "src", value: 8, type: 4, properties: ["src": "character"]} run/0: ingredient 0 is src mem/0: location 1325 is 99 mem/0: location 1326 is 1350 mem/0: storing 99 in location 1350 run/0: instruction grow-buffer/14 run/0: {name: "i", value: 6, type: 1, properties: ["i": "integer"]} <- add/2 {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]} run/0: ingredient 0 is i mem/0: location 1323 is 2 run/0: ingredient 1 is 1 run/0: product 0 is 3 mem/0: storing 3 in location 1323 run/0: instruction grow-buffer/15 run/0: loop/10 {name: "", value: -7, type: , properties: ["": ]} run/0: ingredient 0 is -7 run/0: jumping to instruction 9 run/0: instruction grow-buffer/9 run/0: {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]} <- greater-or-equal/16 {name: "i", value: 6, type: 1, properties: ["i": "integer"]}, {name: "oldlen", value: 3, type: 1, properties: ["oldlen": "integer"]} run/0: ingredient 0 is i mem/0: location 1323 is 3 run/0: ingredient 1 is oldlen mem/0: location 1320 is 3 run/0: product 0 is 1 mem/0: storing 1 in location 1324 run/0: instruction grow-buffer/10 run/0: break-if/11 {name: "done?", value: 7, type: 3, properties: ["done?": "boolean"]}, {name: "", value: 5, type: , properties: ["": ]} mem/0: location 1324 is 1 run/0: ingredient 0 is 1 run/0: ingredient 1 is run/0: jumping to instruction 16 run/0: instruction grow-buffer/17 run/0: reply/33 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer"]} mem/0: location 1318 is 1062 run/0: result 0 is 1062 mem/0: storing 1062 in location 1256 run/0: instruction buffer-append/8 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer"]} <- get-address/25 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]} run/0: ingredient 0 is in mem/0: location 1256 is 1062 run/0: ingredient 1 is length run/0: address to copy is 1062 run/0: product 0 is 1062 mem/0: storing 1062 in location 1259 run/0: instruction buffer-append/9 run/0: {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character"]} <- get/24 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]} run/0: ingredient 0 is in mem/0: location 1256 is 1062 run/0: ingredient 1 is data run/0: address to copy is 1063 run/0: its type is 2 mem/0: location 1063 is 1347 run/0: product 0 is 1347 mem/0: storing 1347 in location 1260 run/0: instruction buffer-append/10 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character"]} <- index-address/27 {name: "s", value: 5, type: 2-5-4, properties: ["s": "address":"array":"character", "deref": ]}, {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} run/0: ingredient 0 is s mem/0: location 1260 is 1347 run/0: ingredient 1 is {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} mem/0: location 1259 is 1062 mem/0: location 1062 is 3 run/0: address to copy is 1351 run/0: product 0 is 1351 mem/0: storing 1351 in location 1261 run/0: instruction buffer-append/11 run/0: {name: "dest", value: 6, type: 2-4, properties: ["dest": "address":"character", "deref": ]} <- copy/1 {name: "c", value: 2, type: 4, properties: ["c": "character"]} run/0: ingredient 0 is c mem/0: location 1257 is 100 mem/0: location 1261 is 1351 mem/0: storing 100 in location 1351 run/0: instruction buffer-append/12 run/0: {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]} <- add/2 {name: "len", value: 4, type: 2-1, properties: ["len": "address":"integer", "deref": ]}, {name: "1", value: 1, type: 0, properties: ["1": "literal"]} run/0: ingredient 0 is len mem/0: location 1259 is 1062 mem/0: location 1062 is 3 run/0: ingredient 1 is 1 run/0: product 0 is 4 mem/0: location 1259 is 1062 mem/0: storing 4 in location 1062 run/0: instruction buffer-append/13 run/0: reply/33 {name: "in", value: 1, type: 2-9, properties: ["in": "address":"buffer", "same-as-ingredient": "0"]} mem/0: location 1256 is 1062 run/0: result 0 is 1062 mem/0: storing 1062 in location 1002 run/0: instruction run1001/11 run/0: {name: "s3", value: 4, type: 2-5-4, properties: ["s3": "address":"array":"character"]} <- get/24 {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}, {name: "data", value: 1, type: 0, properties: ["data": "offset"]} run/0: ingredient 0 is x mem/0: location 1002 is 1062 run/0: ingredient 1 is data run/0: address to copy is 1063 run/0: its type is 2 mem/0: location 1063 is 1347 run/0: product 0 is 1347 mem/0: storing 1347 in location 1005 run/0: instruction run1001/12 run/0: {name: "10", value: 10, type: 3, properties: ["10": "boolean", "raw": ]} <- equal/13 {name: "s1", value: 2, type: 2-5-4, properties: ["s1": "address":"array":"character"]}, {name: "s3", value: 4, type: 2-5-4, properties: ["s3": "address":"array":"character"]} run/0: ingredient 0 is s1 mem/0: location 1003 is 1064 run/0: ingredient 1 is s3 mem/0: location 1005 is 1347 run/0: product 0 is 0 mem/0: storing 0 in location 10 run/0: instruction run1001/13 run/0: {name: "11", value: 11, type: 1, properties: ["11": "integer", "raw": ]} <- get/24 {name: "x", value: 1, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}, {name: "length", value: 0, type: 0, properties: ["length": "offset"]} run/0: ingredient 0 is x mem/0: location 1002 is 1062 run/0: ingredient 1 is length run/0: address to copy is 1062 run/0: its type is 1 mem/0: location 1062 is 4 run/0: product 0 is 4 mem/0: storing 4 in location 11 run/0: instruction run1001/14 run/0: {name: "12", value: 12, type: 5-4, properties: ["12": "array":"character", "raw": ]} <- copy/1 {name: "s3", value: 4, type: 2-5-4, properties: ["s3": "address":"array":"character", "deref": ]} run/0: ingredient 0 is s3 mem/0: location 1005 is 1347 mem/0: location 1347 is 6 mem/0: location 1348 is 97 mem/0: location 1349 is 98 mem/0: location 1350 is 99 mem/0: location 1351 is 100 mem/0: location 1352 is 0 mem/0: location 1353 is 0 mem/0: storing 6 in location 12 mem/0: storing 97 in location 13 mem/0: storing 98 in location 14 mem/0: storing 99 in location 15 mem/0: storing 100 in location 16 mem/0: storing 0 in location 17 mem/0: storing 0 in location 18 run/0: instruction buffer-append-works/1 run/0: memory-should-contain/45 {name: " # before +buffer-filled 1 <- 1 # no change in data pointer 2 <- 3 # size of data 3 <- 97 # data 4 <- 98 5 <- 99 # in the end 10 <- 0 # data pointer has grown 11 <- 4 # final length 12 <- 6 # but data's capacity has doubled 13 <- 97 # data 14 <- 98 15 <- 99 16 <- 100 17 <- 0 18 <- 0 ", value: 0, type: 0, properties: [" # before +buffer-filled 1 <- 1 # no change in data pointer 2 <- 3 # size of data 3 <- 97 # data 4 <- 98 5 <- 99 # in the end 10 <- 0 # data pointer has grown 11 <- 4 # final length 12 <- 6 # but data's capacity has doubled 13 <- 97 # data 14 <- 98 15 <- 99 16 <- 100 17 <- 0 18 <- 0 ": "literal-string"]} run/0: checking location 1 run/0: checking location 2 run/0: checking location 3 run/0: checking location 4 run/0: checking location 5 run/0: checking location 10 run/0: checking location 11 run/0: checking location 12 run/0: checking location 13 run/0: checking location 14 run/0: checking location 15 run/0: checking location 16 run/0: checking location 17 run/0: checking location 18