about summary refs log tree commit diff stats
path: root/archive/1.vm/028call_return.cc
blob: 056db7b94cbcde97f90f4c132c2b06a020e8f91f (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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
//: Calls can also generate products, using 'reply' or 'return'.

void test_return() {
  run(
      "def main [\n"
      "  1:num, 2:num <- f 34\n"
      "]\n"
      "def f [\n"
      "  12:num <- next-ingredient\n"
      "  13:num <- add 1, 12:num\n"
      "  return 12:num, 13:num\n"
      "]\n"
  );
  CHECK_TRACE_CONTENTS(
      "mem: storing 34 in location 1\n"
      "mem: storing 35 in location 2\n"
  );
}

void test_reply() {
  run(
      "def main [\n"
      "  1:num, 2:num <- f 34\n"
      "]\n"
      "def f [\n"
      "  12:num <- next-ingredient\n"
      "  13:num <- add 1, 12:num\n"
      "  reply 12:num, 13:num\n"
      "]\n"
  );
  CHECK_TRACE_CONTENTS(
      "mem: storing 34 in location 1\n"
      "mem: storing 35 in location 2\n"
  );
}

:(before "End Primitive Recipe Declarations")
RETURN,
:(before "End Primitive Recipe Numbers")
put(Recipe_ordinal, "return", RETURN);
put(Recipe_ordinal, "reply", RETURN);  // synonym while teaching
put(Recipe_ordinal, "output", RETURN);  // experiment
:(before "End Primitive Recipe Checks")
case RETURN: {
  break;  // checks will be performed by a transform below
}
:(before "End Primitive Recipe Implementations")
case RETURN: {
  // Begin Return
  trace(Callstack_depth+1, "trace") << current_instruction().name << ": decrementing callstack depth from " << Callstack_depth << end();
  --Callstack_depth;
  if (Callstack_depth < 0) {
    Current_routine->calls.clear();
    goto stop_running_current_routine;
  }
  Current_routine->calls.pop_front();
  // just in case 'main' returns a value, drop it for now
  if (Current_routine->calls.empty()) goto stop_running_current_routine;
  for (int i = 0;  i < SIZE(ingredients);  ++i)
    trace(Callstack_depth+1, "run") << "result " << i << " is " << to_string(ingredients.at(i)) << end();
  // make return products available to caller
  copy(ingredients.begin(), ingredients.end(), inserter(products, products.begin()));
  // End Return
  break;  // continue to process rest of *caller* instruction
}

//: Types in return instructions are checked ahead of time.

:(before "End Checks")
Transform.push_back(check_types_of_return_instructions);  // idempotent
:(code)
void check_types_of_return_instructions(const recipe_ordinal r) {
  const recipe& caller = get(Recipe, r);
  trace(9991, "transform") << "--- check types of return instructions in recipe " << caller.name << end();
  for (int i = 0;  i < SIZE(caller.steps);  ++i) {
    const instruction& caller_instruction = caller.steps.at(i);
    if (caller_instruction.is_label) continue;
    if (caller_instruction.products.empty()) continue;
    if (is_primitive(caller_instruction.operation)) continue;
    const recipe& callee = get(Recipe, caller_instruction.operation);
    for (int i = 0;  i < SIZE(callee.steps);  ++i) {
      const instruction& return_inst = callee.steps.at(i);
      if (return_inst.operation != RETURN) continue;
      // check types with the caller
      if (SIZE(caller_instruction.products) > SIZE(return_inst.ingredients)) {
        raise << maybe(caller.name) << "too few values returned from " << callee.name << '\n' << end();
        break;
      }
      for (int i = 0;  i < SIZE(caller_instruction.products);  ++i) {
        reagent/*copy*/ lhs = return_inst.ingredients.at(i);
        reagent/*copy*/ rhs = caller_instruction.products.at(i);
        // End Check RETURN Copy(lhs, rhs)
        if (!types_coercible(rhs, lhs)) {
          raise << maybe(callee.name) << return_inst.name << " ingredient '" << lhs.original_string << "' can't be saved in '" << rhs.original_string << "'\n" << end();
          raise << "  ['" << to_string(lhs.type) << "' vs '" << to_string(rhs.type) << "']\n" << end();
          goto finish_return_check;
        }
      }
      // check that any return ingredients with /same-as-ingredient connect up
      // the corresponding ingredient and product in the caller.
      for (int i = 0;  i < SIZE(caller_instruction.products);  ++i) {
        if (has_property(return_inst.ingredients.at(i), "same-as-ingredient")) {
          string_tree* tmp = property(return_inst.ingredients.at(i), "same-as-ingredient");
          if (!tmp || !tmp->atom) {
            raise << maybe(caller.name) << "'same-as-ingredient' metadata should take exactly one value in '" << to_original_string(return_inst) << "'\n" << end();
            goto finish_return_check;
          }
          int ingredient_index = to_integer(tmp->value);
          if (ingredient_index >= SIZE(caller_instruction.ingredients)) {
            raise << maybe(caller.name) << "too few ingredients in '" << to_original_string(caller_instruction) << "'\n" << end();
            goto finish_return_check;
          }
          if (!is_dummy(caller_instruction.products.at(i)) && !is_literal(caller_instruction.ingredients.at(ingredient_index)) && caller_instruction.products.at(i).name != caller_instruction.ingredients.at(ingredient_index).name) {
            raise << maybe(caller.name) << "'" << to_original_string(caller_instruction) << "' should write to '" << caller_instruction.ingredients.at(ingredient_index).original_string << "' rather than '" << caller_instruction.products.at(i).original_string << "'\n" << end();
          }
        }
      }
      finish_return_check:;
    }
  }
}

bool is_primitive(recipe_ordinal r) {
  return r < MAX_PRIMITIVE_RECIPES;
}

void test_return_type_mismatch() {
  Hide_errors = true;
  run(
      "def main [\n"
      "  3:num <- f 2\n"
      "]\n"
      "def f [\n"
      "  12:num <- next-ingredient\n"
      "  13:num <- copy 35\n"
      "  14:point <- copy 12:point/raw\n"
      "  return 14:point\n"
      "]\n"
  );
  CHECK_TRACE_CONTENTS(
      "error: f: return ingredient '14:point' can't be saved in '3:num'\n"
  );
}

//: In Mu we'd like to assume that any instruction doesn't modify its
//: ingredients unless they're also products. The /same-as-ingredient inside
//: the recipe's 'return' indicates that an ingredient is intended to be
//: modified in place, and will help catch accidental misuse of such
//: 'ingredient-products' (sometimes called in-out parameters in other
//: languages).

void test_return_same_as_ingredient() {
  Hide_errors = true;
  run(
      "def main [\n"
      "  1:num <- copy 0\n"
      "  2:num <- test1 1:num  # call with different ingredient and product\n"
      "]\n"
      "def test1 [\n"
      "  10:num <- next-ingredient\n"
      "  return 10:num/same-as-ingredient:0\n"
      "]\n"
  );
  CHECK_TRACE_CONTENTS(
      "error: main: '2:num <- test1 1:num' should write to '1:num' rather than '2:num'\n"
  );
}

void test_return_same_as_ingredient_dummy() {
  run(
      "def main [\n"
      "  1:num <- copy 0\n"
      "  _ <- test1 1:num  # call with different ingredient and product\n"
      "]\n"
      "def test1 [\n"
      "  10:num <- next-ingredient\n"
      "  return 10:num/same-as-ingredient:0\n"
      "]\n"
  );
  CHECK_TRACE_COUNT("error", 0);
}

string to_string(const vector<double>& in) {
  if (in.empty()) return "[]";
  ostringstream out;
  if (SIZE(in) == 1) {
    out << no_scientific(in.at(0));
    return out.str();
  }
  out << "[";
  for (int i = 0;  i < SIZE(in);  ++i) {
    if (i > 0) out << ", ";
    out << no_scientific(in.at(i));
  }
  out << "]";
  return out.str();
}
n class="Comment">//: You can also read from the payload in instructions like this:</span> <span id="L27" class="LineNr"> 27 </span><span class="Comment">//:</span> <span id="L28" class="LineNr"> 28 </span><span class="Comment">//: z:num &lt;- add *x, 1</span> <span id="L29" class="LineNr"> 29 </span><span class="Comment">//:</span> <span id="L30" class="LineNr"> 30 </span><span class="Comment">//: After this instruction runs the value of z will be 35.</span> <span id="L31" class="LineNr"> 31 </span><span class="Comment">//:</span> <span id="L32" class="LineNr"> 32 </span><span class="Comment">//: The tests in this layer use unsafe operations so as to stay decoupled from</span> <span id="L33" class="LineNr"> 33 </span><span class="Comment">//: 'new'.</span> <span id="L34" class="LineNr"> 34 </span> <span id="L35" class="LineNr"> 35 </span><span class="Delimiter">:(scenario copy_indirect)</span> <span id="L36" class="LineNr"> 36 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L37" class="LineNr"> 37 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe <span id="L38" class="LineNr"> 38 </span> <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span> <span id="L39" class="LineNr"> 39 </span> <span class="Comment"># This loads location 1 as an address and looks up *that* location.</span> <span id="L40" class="LineNr"> 40 </span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:num/lookup <span id="L41" class="LineNr"> 41 </span>] <span id="L42" class="LineNr"> 42 </span><span class="Comment"># 1 contains 10. Skip refcount and lookup location 11.</span> <span id="L43" class="LineNr"> 43 </span><span class="traceContains">+mem: storing 34 in location 2</span> <span id="L44" class="LineNr"> 44 </span> <span id="L45" class="LineNr"> 45 </span><span class="Delimiter">:(before &quot;End Preprocess read_memory(x)&quot;)</span> <span id="L46" class="LineNr"> 46 </span>canonize<span class="Delimiter">(</span>x<span class="Delimiter">);</span> <span id="L47" class="LineNr"> 47 </span> <span id="L48" class="LineNr"> 48 </span><span class="Comment">//: similarly, write to addresses pointing at other locations using the</span> <span id="L49" class="LineNr"> 49 </span><span class="Comment">//: 'lookup' property</span> <span id="L50" class="LineNr"> 50 </span><span class="Delimiter">:(scenario store_indirect)</span> <span id="L51" class="LineNr"> 51 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L52" class="LineNr"> 52 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe <span id="L53" class="LineNr"> 53 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:num/lookup<span class="Special"> &lt;- </span>copy <span class="Constant">34</span> <span id="L54" class="LineNr"> 54 </span>] <span id="L55" class="LineNr"> 55 </span><span class="traceContains">+mem: storing 34 in location 11</span> <span id="L56" class="LineNr"> 56 </span> <span id="L57" class="LineNr"> 57 </span><span class="Delimiter">:(before &quot;End Preprocess write_memory(x, data)&quot;)</span> <span id="L58" class="LineNr"> 58 </span>canonize<span class="Delimiter">(</span>x<span class="Delimiter">);</span> <span id="L59" class="LineNr"> 59 </span> <span id="L60" class="LineNr"> 60 </span><span class="Comment">//: writes to address 0 always loudly fail</span> <span id="L61" class="LineNr"> 61 </span><span class="Delimiter">:(scenario store_to_0_fails)</span> <span id="L62" class="LineNr"> 62 </span><span class="Special">% Hide_errors = true;</span> <span id="L63" class="LineNr"> 63 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L64" class="LineNr"> 64 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> <span id="L65" class="LineNr"> 65 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:num/lookup<span class="Special"> &lt;- </span>copy <span class="Constant">34</span> <span id="L66" class="LineNr"> 66 </span>] <span id="L67" class="LineNr"> 67 </span><span class="traceAbsent">-mem: storing 34 in location 0</span> <span id="L68" class="LineNr"> 68 </span><span class="traceContains">+error: can't write to location 0 in '1:<a href='043space.cc.html#L82'>address</a>:num/lookup &lt;- copy 34'</span> <span id="L69" class="LineNr"> 69 </span> <span id="L70" class="LineNr"> 70 </span><span class="Comment">//: attempts to /lookup address 0 always loudly fail</span> <span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(scenario lookup_0_fails)</span> <span id="L72" class="LineNr"> 72 </span><span class="Special">% Hide_errors = true;</span> <span id="L73" class="LineNr"> 73 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L74" class="LineNr"> 74 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:num<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> <span id="L75" class="LineNr"> 75 </span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:num/lookup <span id="L76" class="LineNr"> 76 </span>] <span id="L77" class="LineNr"> 77 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: tried to /lookup 0 in '2:num &lt;- copy 1:address:num/lookup'</span> <span id="L78" class="LineNr"> 78 </span> <span id="L79" class="LineNr"> 79 </span><span class="Delimiter">:(code)</span> <span id="L80" class="LineNr"> 80 </span><span class="Normal">void</span> canonize<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L81" class="LineNr"> 81 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L82" class="LineNr"> 82 </span> <span class="Comment">// Begin canonize(x) Lookups</span> <span id="L83" class="LineNr"> 83 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">))</span> <span id="L84" class="LineNr"> 84 </span> <span class="Conceal">¦</span> lookup_memory<span class="Delimiter">(</span>x<span class="Delimiter">);</span> <span id="L85" class="LineNr"> 85 </span><span class="Delimiter">}</span> <span id="L86" class="LineNr"> 86 </span> <span id="L87" class="LineNr"> 87 </span><span class="Normal">void</span> lookup_memory<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L88" class="LineNr"> 88 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type || x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom || x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value != get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L89" class="LineNr"> 89 </span> <span class="Conceal">¦</span> <a href='003trace.cc.html#L174'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span><a href='026call.cc.html#L87'>current_recipe_name</a><span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to /lookup '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' but it isn't an address</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span> <span id="L90" class="LineNr"> 90 </span> <span class="Conceal">¦</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L91" class="LineNr"> 91 </span> <span class="Delimiter">}</span> <span id="L92" class="LineNr"> 92 </span> <span class="Comment">// compute value</span> <span id="L93" class="LineNr"> 93 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L94" class="LineNr"> 94 </span> <span class="Conceal">¦</span> <a href='003trace.cc.html#L174'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span><a href='026call.cc.html#L87'>current_recipe_name</a><span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to /lookup 0</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; <a href='003trace.cc.html#L203'>end</a><span class="Delimiter">();</span> <span id="L95" class="LineNr"> 95 </span> <span class="Conceal">¦</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L96" class="LineNr"> 96 </span> <span class="Delimiter">}</span> <span id="L97" class="LineNr"> 97 </span> lookup_memory_core<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">check_for_null</span><span class="Comment">*/</span><span class="Constant">true</span><span class="Delimiter">);</span> <span id="L98" class="LineNr"> 98 </span><span class="Delimiter">}</span> <span id="L99" class="LineNr"> 99 </span> <span id="L100" class="LineNr">100 </span><span class="Normal">void</span> lookup_memory_core<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">bool</span> check_for_null<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L101" class="LineNr">101 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L102" class="LineNr">102 </span> <a href='003trace.cc.html#L167'>trace</a><span class="Delimiter">(</span><span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;location &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>value &lt;&lt; <span class="Constant">&quot; is &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L229'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> x<span class="Delimiter">.</span>value<span class="Delimiter">))</span> &lt;&lt; <a href='003trace.cc.html#L203'>end</a><span class="Delimiter">();</span> <span id="L103" class="LineNr">103 </span> x<span class="Delimiter">.</span><a href='010vm.cc.html#L65'>set_value</a><span class="Delimiter">(</span><a href='001help.cc.html#L229'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> x<span class="Delimiter">.</span>value<span class="Delimiter">));</span> <span id="L104" class="LineNr">104 </span> drop_from_type<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">);</span> <span id="L105" class="LineNr">105 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>value<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L106" class="LineNr">106 </span> <span class="Conceal">¦</span> <a href='003trace.cc.html#L167'>trace</a><span class="Delimiter">(</span><span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;skipping refcount at &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>value &lt;&lt; <a href='003trace.cc.html#L203'>end</a><span class="Delimiter">();</span> <span id="L107" class="LineNr">107 </span> <span class="Conceal">¦</span> x<span class="Delimiter">.</span><a href='010vm.cc.html#L65'>set_value</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>value+<span class="Constant">1</span><span class="Delimiter">);</span> <span class="Comment">// skip refcount</span> <span id="L108" class="LineNr">108 </span> <span class="Delimiter">}</span> <span id="L109" class="LineNr">109 </span> <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>check_for_null<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L110" class="LineNr">110 </span> <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">)</span> <span id="L111" class="LineNr">111 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <a href='003trace.cc.html#L174'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span><a href='026call.cc.html#L87'>current_recipe_name</a><span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to /lookup 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; <a href='003trace.cc.html#L203'>end</a><span class="Delimiter">();</span> <span id="L112" class="LineNr">112 </span> <span class="Conceal">¦</span> <span class="Normal">else</span> <span id="L113" class="LineNr">113 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <a href='003trace.cc.html#L174'>raise</a> &lt;&lt; <span class="Constant">&quot;tried to /lookup 0</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; <a href='003trace.cc.html#L203'>end</a><span class="Delimiter">();</span> <span id="L114" class="LineNr">114 </span> <span class="Delimiter">}</span> <span id="L115" class="LineNr">115 </span> drop_one_lookup<span class="Delimiter">(</span>x<span class="Delimiter">);</span> <span id="L116" class="LineNr">116 </span><span class="Delimiter">}</span> <span id="L117" class="LineNr">117 </span> <span id="L118" class="LineNr">118 </span><span class="Normal">void</span> test_lookup_address_skips_refcount<span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L119" class="LineNr">119 </span> reagent x<span class="Delimiter">(</span><span class="Constant">&quot;*x:<a href='043space.cc.html#L82'>address</a>:num&quot;</span><span class="Delimiter">);</span> <span id="L120" class="LineNr">120 </span> x<span class="Delimiter">.</span><a href='010vm.cc.html#L65'>set_value</a><span class="Delimiter">(</span><span class="Constant">34</span><span class="Delimiter">);</span> <span class="Comment">// unsafe</span> <span id="L121" class="LineNr">121 </span> <a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">1000</span><span class="Delimiter">);</span> <span id="L122" class="LineNr">122 </span> lookup_memory<span class="Delimiter">(</span>x<span class="Delimiter">);</span> <span id="L123" class="LineNr">123 </span> <a href='003trace.cc.html#L232'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span><span class="Constant">&quot;mem: skipping refcount at 1000&quot;</span><span class="Delimiter">);</span> <span id="L124" class="LineNr">124 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>value<span class="Delimiter">,</span> <span class="Constant">1001</span><span class="Delimiter">);</span> <span id="L125" class="LineNr">125 </span><span class="Delimiter">}</span> <span id="L126" class="LineNr">126 </span> <span id="L127" class="LineNr">127 </span><span class="Normal">void</span> test_lookup_zero_address_does_not_skip_refcount<span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L128" class="LineNr">128 </span> Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L129" class="LineNr">129 </span> reagent x<span class="Delimiter">(</span><span class="Constant">&quot;*x:<a href='043space.cc.html#L82'>address</a>:num&quot;</span><span class="Delimiter">);</span> <span id="L130" class="LineNr">130 </span> x<span class="Delimiter">.</span><a href='010vm.cc.html#L65'>set_value</a><span class="Delimiter">(</span><span class="Constant">34</span><span class="Delimiter">);</span> <span class="Comment">// unsafe</span> <span id="L131" class="LineNr">131 </span> <a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L132" class="LineNr">132 </span> lookup_memory<span class="Delimiter">(</span>x<span class="Delimiter">);</span> <span id="L133" class="LineNr">133 </span> <a href='003trace.cc.html#L252'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;mem: skipping refcount at 0&quot;</span><span class="Delimiter">);</span> <span id="L134" class="LineNr">134 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>value<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L135" class="LineNr">135 </span><span class="Delimiter">}</span> <span id="L136" class="LineNr">136 </span> <span id="L137" class="LineNr">137 </span><span class="Delimiter">:(before &quot;End Preprocess types_strictly_match(reagent to, reagent from)&quot;)</span> <span id="L138" class="LineNr">138 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L139" class="LineNr">139 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>from<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L140" class="LineNr">140 </span> <span id="L141" class="LineNr">141 </span><span class="Delimiter">:(before &quot;End Preprocess is_mu_array(reagent r)&quot;)</span> <span id="L142" class="LineNr">142 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L143" class="LineNr">143 </span> <span id="L144" class="LineNr">144 </span><span class="Delimiter">:(before &quot;End Preprocess is_mu_address(reagent r)&quot;)</span> <span id="L145" class="LineNr">145 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L146" class="LineNr">146 </span> <span id="L147" class="LineNr">147 </span><span class="Delimiter">:(before &quot;End Preprocess is_mu_number(reagent r)&quot;)</span> <span id="L148" class="LineNr">148 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L149" class="LineNr">149 </span><span class="Delimiter">:(before &quot;End Preprocess is_mu_boolean(reagent r)&quot;)</span> <span id="L150" class="LineNr">150 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L151" class="LineNr">151 </span><span class="Delimiter">:(before &quot;End Preprocess is_mu_character(reagent r)&quot;)</span> <span id="L152" class="LineNr">152 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L153" class="LineNr">153 </span> <span id="L154" class="LineNr">154 </span><span class="Delimiter">:(after &quot;Update product While Type-checking Merge&quot;)</span> <span id="L155" class="LineNr">155 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L156" class="LineNr">156 </span> <span id="L157" class="LineNr">157 </span><span class="Delimiter">:(before &quot;End Compute Call Ingredient&quot;)</span> <span id="L158" class="LineNr">158 </span>canonize_type<span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span> <span id="L159" class="LineNr">159 </span><span class="Delimiter">:(before &quot;End Preprocess NEXT_INGREDIENT product&quot;)</span> <span id="L160" class="LineNr">160 </span>canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">);</span> <span id="L161" class="LineNr">161 </span><span class="Delimiter">:(before &quot;End Check RETURN Copy(lhs, rhs)</span> <span id="L162" class="LineNr">162 </span>canonize_type<span class="Delimiter">(</span>lhs<span class="Delimiter">);</span> <span id="L163" class="LineNr">163 </span>canonize_type<span class="Delimiter">(</span>rhs<span class="Delimiter">);</span> <span id="L164" class="LineNr">164 </span> <span id="L165" class="LineNr">165 </span><span class="Delimiter">:(before &quot;Compute Container Size(reagent rcopy)&quot;)</span> <span id="L166" class="LineNr">166 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>rcopy<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L167" class="LineNr">167 </span> <span id="L168" class="LineNr">168 </span><span class="Delimiter">:(before &quot;Compute Container Size(element, full_type)&quot;)</span> <span id="L169" class="LineNr">169 </span>assert<span class="Delimiter">(</span>!has_property<span class="Delimiter">(</span>element<span class="Delimiter">,</span> <span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">));</span> <span id="L170" class="LineNr">170 </span><span class="Delimiter">:(before &quot;Compute Exclusive Container Size(element, full_type)&quot;)</span> <span id="L171" class="LineNr">171 </span>assert<span class="Delimiter">(</span>!has_property<span class="Delimiter">(</span>element<span class="Delimiter">,</span> <span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">));</span> <span id="L172" class="LineNr">172 </span> <span id="L173" class="LineNr">173 </span><span class="Delimiter">:(code)</span> <span id="L174" class="LineNr">174 </span><span class="Normal">bool</span> canonize_type<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L175" class="LineNr">175 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L176" class="LineNr">176 </span> <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type || r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom || !r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left || !r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom || r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>value != get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L177" class="LineNr">177 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <a href='003trace.cc.html#L174'>raise</a> &lt;&lt; <span class="Constant">&quot;cannot perform lookup on '&quot;</span> &lt;&lt; r<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' because it has non-address type &quot;</span> &lt;&lt; <a href='028call_return.cc.html#L163'>to_string</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L203'>end</a><span class="Delimiter">();</span> <span id="L178" class="LineNr">178 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L179" class="LineNr">179 </span> <span class="Conceal">¦</span> <span class="Delimiter">}</span> <span id="L180" class="LineNr">180 </span> <span class="Conceal">¦</span> drop_from_type<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;address&quot;</span><span class="Delimiter">);</span> <span id="L181" class="LineNr">181 </span> <span class="Conceal">¦</span> drop_one_lookup<span class="Delimiter">(</span>r<span class="Delimiter">);</span> <span id="L182" class="LineNr">182 </span> <span class="Delimiter">}</span> <span id="L183" class="LineNr">183 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L184" class="LineNr">184 </span><span class="Delimiter">}</span> <span id="L185" class="LineNr">185 </span> <span id="L186" class="LineNr">186 </span><span class="Normal">void</span> drop_one_lookup<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L187" class="LineNr">187 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector&lt;pair&lt;string<span class="Delimiter">,</span> string_tree*&gt; &gt;::iterator p = r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span><a href='003trace.cc.html#L203'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L188" class="LineNr">188 </span> <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>first == <span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L189" class="LineNr">189 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>p<span class="Delimiter">);</span> <span id="L190" class="LineNr">190 </span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L191" class="LineNr">191 </span> <span class="Conceal">¦</span> <span class="Delimiter">}</span> <span id="L192" class="LineNr">192 </span> <span class="Delimiter">}</span> <span id="L193" class="LineNr">193 </span> assert<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span> <span id="L194" class="LineNr">194 </span><span class="Delimiter">}</span> <span id="L195" class="LineNr">195 </span> <span id="L196" class="LineNr">196 </span><span class="Comment">//: Tedious fixup to support addresses in container/array instructions of previous layers.</span> <span id="L197" class="LineNr">197 </span><span class="Comment">//: Most instructions don't require fixup if they use the 'ingredients' and</span> <span id="L198" class="LineNr">198 </span><span class="Comment">//: 'products' variables in run_current_routine().</span> <span id="L199" class="LineNr">199 </span> <span id="L200" class="LineNr">200 </span><span class="Delimiter">:(scenario get_indirect)</span> <span id="L201" class="LineNr">201 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L202" class="LineNr">202 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe <span id="L203" class="LineNr">203 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L204" class="LineNr">204 </span> <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span> <span id="L205" class="LineNr">205 </span> <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span> <span id="L206" class="LineNr">206 </span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:point/lookup<span class="Delimiter">,</span> <span class="Constant">0:offset</span> <span id="L207" class="LineNr">207 </span>] <span id="L208" class="LineNr">208 </span><span class="traceContains">+mem: storing 34 in location 2</span> <span id="L209" class="LineNr">209 </span> <span id="L210" class="LineNr">210 </span><span class="Delimiter">:(scenario get_indirect2)</span> <span id="L211" class="LineNr">211 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L212" class="LineNr">212 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe <span id="L213" class="LineNr">213 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L214" class="LineNr">214 </span> <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span> <span id="L215" class="LineNr">215 </span> <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span> <span id="L216" class="LineNr">216 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L82'>address</a>:num<span class="Special"> &lt;- </span>copy <span class="Constant">20</span>/unsafe <span id="L217" class="LineNr">217 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L82'>address</a>:num/lookup<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:point/lookup<span class="Delimiter">,</span> <span class="Constant">0:offset</span> <span id="L218" class="LineNr">218 </span>] <span id="L219" class="LineNr">219 </span><span class="traceContains">+mem: storing 34 in location 21</span> <span id="L220" class="LineNr">220 </span> <span id="L221" class="LineNr">221 </span><span class="Delimiter">:(scenario include_nonlookup_properties)</span> <span id="L222" class="LineNr">222 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L223" class="LineNr">223 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe <span id="L224" class="LineNr">224 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L225" class="LineNr">225 </span> <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span> <span id="L226" class="LineNr">226 </span> <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span> <span id="L227" class="LineNr">227 </span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:point/lookup/foo<span class="Delimiter">,</span> <span class="Constant">0:offset</span> <span id="L228" class="LineNr">228 </span>] <span id="L229" class="LineNr">229 </span><span class="traceContains">+mem: storing 34 in location 2</span> <span id="L230" class="LineNr">230 </span> <span id="L231" class="LineNr">231 </span><span class="Delimiter">:(after &quot;Update GET base in Check&quot;)</span> <span id="L232" class="LineNr">232 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L233" class="LineNr">233 </span><span class="Delimiter">:(after &quot;Update GET product in Check&quot;)</span> <span id="L234" class="LineNr">234 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L235" class="LineNr">235 </span><span class="Delimiter">:(after &quot;Update GET base in Run&quot;)</span> <span id="L236" class="LineNr">236 </span>canonize<span class="Delimiter">(</span>base<span class="Delimiter">);</span> <span id="L237" class="LineNr">237 </span> <span id="L238" class="LineNr">238 </span><span class="Delimiter">:(scenario put_indirect)</span> <span id="L239" class="LineNr">239 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L240" class="LineNr">240 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe <span id="L241" class="LineNr">241 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L242" class="LineNr">242 </span> <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span> <span id="L243" class="LineNr">243 </span> <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span> <span id="L244" class="LineNr">244 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:point/lookup<span class="Special"> &lt;- </span><a href='001help.cc.html#L221'>put</a> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:point/lookup<span class="Delimiter">,</span> <span class="Constant">0:offset</span><span class="Delimiter">,</span> <span class="Constant">36</span> <span id="L245" class="LineNr">245 </span>] <span id="L246" class="LineNr">246 </span><span class="traceContains">+mem: storing 36 in location 11</span> <span id="L247" class="LineNr">247 </span> <span id="L248" class="LineNr">248 </span><span class="Delimiter">:(after &quot;Update PUT base in Check&quot;)</span> <span id="L249" class="LineNr">249 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L250" class="LineNr">250 </span><span class="Delimiter">:(after &quot;Update PUT offset in Check&quot;)</span> <span id="L251" class="LineNr">251 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>offset<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L252" class="LineNr">252 </span><span class="Delimiter">:(after &quot;Update PUT base in Run&quot;)</span> <span id="L253" class="LineNr">253 </span>canonize<span class="Delimiter">(</span>base<span class="Delimiter">);</span> <span id="L254" class="LineNr">254 </span> <span id="L255" class="LineNr">255 </span><span class="Delimiter">:(scenario put_product_error_with_lookup)</span> <span id="L256" class="LineNr">256 </span><span class="Special">% Hide_errors = true;</span> <span id="L257" class="LineNr">257 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L258" class="LineNr">258 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe <span id="L259" class="LineNr">259 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L260" class="LineNr">260 </span> <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span> <span id="L261" class="LineNr">261 </span> <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span> <span id="L262" class="LineNr">262 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:point<span class="Special"> &lt;- </span><a href='001help.cc.html#L221'>put</a> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:point/lookup<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">36</span> <span id="L263" class="LineNr">263 </span>] <span id="L264" class="LineNr">264 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: product of 'put' must be first ingredient '1:address:point/lookup', but got '1:address:point'</span> <span id="L265" class="LineNr">265 </span> <span id="L266" class="LineNr">266 </span><span class="Delimiter">:(before &quot;End PUT Product Checks&quot;)</span> <span id="L267" class="LineNr">267 </span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> p = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span id="L268" class="LineNr">268 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>p<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// error raised elsewhere</span> <span id="L269" class="LineNr">269 </span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> i = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span id="L270" class="LineNr">270 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>i<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// error raised elsewhere</span> <span id="L271" class="LineNr">271 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match<span class="Delimiter">(</span>p<span class="Delimiter">,</span> i<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L272" class="LineNr">272 </span> <a href='003trace.cc.html#L174'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product of 'put' must be first ingredient '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; <a href='003trace.cc.html#L203'>end</a><span class="Delimiter">();</span> <span id="L273" class="LineNr">273 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L274" class="LineNr">274 </span><span class="Delimiter">}</span> <span id="L275" class="LineNr">275 </span> <span id="L276" class="LineNr">276 </span><span class="Delimiter">:(scenario new_error)</span> <span id="L277" class="LineNr">277 </span><span class="Special">% Hide_errors = true;</span> <span id="L278" class="LineNr">278 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L279" class="LineNr">279 </span> <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L280" class="LineNr">280 </span>] <span id="L281" class="LineNr">281 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: product of 'new' has incorrect type: '1:num/raw &lt;- new number:type'</span> <span id="L282" class="LineNr">282 </span> <span id="L283" class="LineNr">283 </span><span class="Delimiter">:(after &quot;Update NEW product in Check&quot;)</span> <span id="L284" class="LineNr">284 </span>canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">);</span> <span id="L285" class="LineNr">285 </span> <span id="L286" class="LineNr">286 </span><span class="Delimiter">:(scenario copy_array_indirect)</span> <span id="L287" class="LineNr">287 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L288" class="LineNr">288 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L289" class="LineNr">289 </span> <span class="Constant">11</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array <span id="L290" class="LineNr">290 </span> <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span> <span id="L291" class="LineNr">291 </span> <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span> <span id="L292" class="LineNr">292 </span> <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span> <span id="L293" class="LineNr">293 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe <span id="L294" class="LineNr">294 </span> <span class="Constant">2</span>:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:array:num/lookup <span id="L295" class="LineNr">295 </span>] <span id="L296" class="LineNr">296 </span><span class="traceContains">+mem: storing 3 in location 2</span> <span id="L297" class="LineNr">297 </span><span class="traceContains">+mem: storing 14 in location 3</span> <span id="L298" class="LineNr">298 </span><span class="traceContains">+mem: storing 15 in location 4</span> <span id="L299" class="LineNr">299 </span><span class="traceContains">+mem: storing 16 in location 5</span> <span id="L300" class="LineNr">300 </span> <span id="L301" class="LineNr">301 </span><span class="Delimiter">:(scenario create_array_indirect)</span> <span id="L302" class="LineNr">302 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L303" class="LineNr">303 </span> <span class="Constant">1000</span>:num/<span class="Special">raw &lt;- </span>copy <span class="Constant">1</span> <span class="Comment"># pretend refcount</span> <span id="L304" class="LineNr">304 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>copy <span class="Constant">1000</span>/unsafe <span class="Comment"># pretend allocation</span> <span id="L305" class="LineNr">305 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:array:num:<span class="Constant">3</span>/lookup<span class="Special"> &lt;- </span>create-array <span id="L306" class="LineNr">306 </span>] <span id="L307" class="LineNr">307 </span><span class="traceContains">+mem: storing 3 in location 1001</span> <span id="L308" class="LineNr">308 </span> <span id="L309" class="LineNr">309 </span><span class="Delimiter">:(after &quot;Update CREATE_ARRAY product in Check&quot;)</span> <span id="L310" class="LineNr">310 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L311" class="LineNr">311 </span><span class="Delimiter">:(after &quot;Update CREATE_ARRAY product in Run&quot;)</span> <span id="L312" class="LineNr">312 </span>canonize<span class="Delimiter">(</span>product<span class="Delimiter">);</span> <span id="L313" class="LineNr">313 </span> <span id="L314" class="LineNr">314 </span><span class="Delimiter">:(scenario index_indirect)</span> <span id="L315" class="LineNr">315 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L316" class="LineNr">316 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L317" class="LineNr">317 </span> <span class="Constant">11</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array <span id="L318" class="LineNr">318 </span> <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span> <span id="L319" class="LineNr">319 </span> <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span> <span id="L320" class="LineNr">320 </span> <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span> <span id="L321" class="LineNr">321 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe <span id="L322" class="LineNr">322 </span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>index <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:array:num/lookup<span class="Delimiter">,</span> <span class="Constant">1</span> <span id="L323" class="LineNr">323 </span>] <span id="L324" class="LineNr">324 </span><span class="traceContains">+mem: storing 15 in location 2</span> <span id="L325" class="LineNr">325 </span> <span id="L326" class="LineNr">326 </span><span class="Delimiter">:(before &quot;Update INDEX base in Check&quot;)</span> <span id="L327" class="LineNr">327 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L328" class="LineNr">328 </span><span class="Delimiter">:(before &quot;Update INDEX index in Check&quot;)</span> <span id="L329" class="LineNr">329 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>index<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L330" class="LineNr">330 </span><span class="Delimiter">:(before &quot;Update INDEX product in Check&quot;)</span> <span id="L331" class="LineNr">331 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L332" class="LineNr">332 </span> <span id="L333" class="LineNr">333 </span><span class="Delimiter">:(before &quot;Update INDEX base in Run&quot;)</span> <span id="L334" class="LineNr">334 </span>canonize<span class="Delimiter">(</span>base<span class="Delimiter">);</span> <span id="L335" class="LineNr">335 </span><span class="Delimiter">:(before &quot;Update INDEX index in Run&quot;)</span> <span id="L336" class="LineNr">336 </span>canonize<span class="Delimiter">(</span>index<span class="Delimiter">);</span> <span id="L337" class="LineNr">337 </span> <span id="L338" class="LineNr">338 </span><span class="Delimiter">:(scenario put_index_indirect)</span> <span id="L339" class="LineNr">339 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L340" class="LineNr">340 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L341" class="LineNr">341 </span> <span class="Constant">11</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array <span id="L342" class="LineNr">342 </span> <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span> <span id="L343" class="LineNr">343 </span> <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span> <span id="L344" class="LineNr">344 </span> <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span> <span id="L345" class="LineNr">345 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe <span id="L346" class="LineNr">346 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:array:num/lookup<span class="Special"> &lt;- </span>put-index <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:array:num/lookup<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L347" class="LineNr">347 </span>] <span id="L348" class="LineNr">348 </span><span class="traceContains">+mem: storing 34 in location 13</span> <span id="L349" class="LineNr">349 </span> <span id="L350" class="LineNr">350 </span><span class="Delimiter">:(scenario put_index_indirect_2)</span> <span id="L351" class="LineNr">351 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L352" class="LineNr">352 </span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array <span id="L353" class="LineNr">353 </span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span> <span id="L354" class="LineNr">354 </span> <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span> <span id="L355" class="LineNr">355 </span> <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span> <span id="L356" class="LineNr">356 </span> <span class="Constant">5</span>:<a href='043space.cc.html#L82'>address</a>:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe <span id="L357" class="LineNr">357 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L358" class="LineNr">358 </span> <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span> <span id="L359" class="LineNr">359 </span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>put-index <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span>:<a href='043space.cc.html#L82'>address</a>:num/lookup<span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L360" class="LineNr">360 </span>] <span id="L361" class="LineNr">361 </span><span class="traceContains">+mem: storing 34 in location 3</span> <span id="L362" class="LineNr">362 </span> <span id="L363" class="LineNr">363 </span><span class="Delimiter">:(scenario put_index_product_error_with_lookup)</span> <span id="L364" class="LineNr">364 </span><span class="Special">% Hide_errors = true;</span> <span id="L365" class="LineNr">365 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L366" class="LineNr">366 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L367" class="LineNr">367 </span> <span class="Constant">11</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array <span id="L368" class="LineNr">368 </span> <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span> <span id="L369" class="LineNr">369 </span> <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span> <span id="L370" class="LineNr">370 </span> <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span> <span id="L371" class="LineNr">371 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe <span id="L372" class="LineNr">372 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:array:num<span class="Special"> &lt;- </span>put-index <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:array:num/lookup<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L373" class="LineNr">373 </span>] <span id="L374" class="LineNr">374 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: product of 'put-index' must be first ingredient '1:address:array:num/lookup', but got '1:address:array:num'</span> <span id="L375" class="LineNr">375 </span> <span id="L376" class="LineNr">376 </span><span class="Delimiter">:(before &quot;End PUT_INDEX Product Checks&quot;)</span> <span id="L377" class="LineNr">377 </span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> p = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span id="L378" class="LineNr">378 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>p<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// error raised elsewhere</span> <span id="L379" class="LineNr">379 </span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> i = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span id="L380" class="LineNr">380 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>i<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// error raised elsewhere</span> <span id="L381" class="LineNr">381 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!types_strictly_match<span class="Delimiter">(</span>p<span class="Delimiter">,</span> i<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L382" class="LineNr">382 </span> <a href='003trace.cc.html#L174'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product of 'put-index' must be first ingredient '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; <a href='003trace.cc.html#L203'>end</a><span class="Delimiter">();</span> <span id="L383" class="LineNr">383 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L384" class="LineNr">384 </span><span class="Delimiter">}</span> <span id="L385" class="LineNr">385 </span> <span id="L386" class="LineNr">386 </span><span class="Delimiter">:(scenario dilated_reagent_in_static_array)</span> <span id="L387" class="LineNr">387 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L388" class="LineNr">388 </span> <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>array <span class="Delimiter">(</span><a href='043space.cc.html#L82'>address</a> number<span class="Delimiter">)</span> <span class="Constant">3</span><span class="Delimiter">)}</span><span class="Special"> &lt;- </span>create-array <span id="L389" class="LineNr">389 </span> <span class="Constant">5</span>:<a href='043space.cc.html#L82'>address</a>:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L390" class="LineNr">390 </span> <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>array <span class="Delimiter">(</span><a href='043space.cc.html#L82'>address</a> number<span class="Delimiter">)</span> <span class="Constant">3</span><span class="Delimiter">)}</span><span class="Special"> &lt;- </span>put-index <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>array <span class="Delimiter">(</span><a href='043space.cc.html#L82'>address</a> number<span class="Delimiter">)</span> <span class="Constant">3</span><span class="Delimiter">)},</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">5</span>:<a href='043space.cc.html#L82'>address</a>:num <span id="L391" class="LineNr">391 </span> *<span class="Constant">5</span>:<a href='043space.cc.html#L82'>address</a>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span> <span id="L392" class="LineNr">392 </span> <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy *<span class="Constant">5</span>:<a href='043space.cc.html#L82'>address</a>:num <span id="L393" class="LineNr">393 </span>] <span id="L394" class="LineNr">394 </span><span class="traceContains">+run: creating array of size 4</span> <span id="L395" class="LineNr">395 </span><span class="traceContains">+mem: storing 34 in location 6</span> <span id="L396" class="LineNr">396 </span> <span id="L397" class="LineNr">397 </span><span class="Delimiter">:(before &quot;Update PUT_INDEX base in Check&quot;)</span> <span id="L398" class="LineNr">398 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L399" class="LineNr">399 </span><span class="Delimiter">:(before &quot;Update PUT_INDEX index in Check&quot;)</span> <span id="L400" class="LineNr">400 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>index<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L401" class="LineNr">401 </span><span class="Delimiter">:(before &quot;Update PUT_INDEX value in Check&quot;)</span> <span id="L402" class="LineNr">402 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>value<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L403" class="LineNr">403 </span> <span id="L404" class="LineNr">404 </span><span class="Delimiter">:(before &quot;Update PUT_INDEX base in Run&quot;)</span> <span id="L405" class="LineNr">405 </span>canonize<span class="Delimiter">(</span>base<span class="Delimiter">);</span> <span id="L406" class="LineNr">406 </span><span class="Delimiter">:(before &quot;Update PUT_INDEX index in Run&quot;)</span> <span id="L407" class="LineNr">407 </span>canonize<span class="Delimiter">(</span>index<span class="Delimiter">);</span> <span id="L408" class="LineNr">408 </span> <span id="L409" class="LineNr">409 </span><span class="Delimiter">:(scenario length_indirect)</span> <span id="L410" class="LineNr">410 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L411" class="LineNr">411 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L412" class="LineNr">412 </span> <span class="Constant">11</span>:array:num:<span class="Constant">3</span><span class="Special"> &lt;- </span>create-array <span id="L413" class="LineNr">413 </span> <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">14</span> <span id="L414" class="LineNr">414 </span> <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">15</span> <span id="L415" class="LineNr">415 </span> <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">16</span> <span id="L416" class="LineNr">416 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:array:num<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe <span id="L417" class="LineNr">417 </span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>length <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:array:num/lookup <span id="L418" class="LineNr">418 </span>] <span id="L419" class="LineNr">419 </span><span class="traceContains">+mem: storing 3 in location 2</span> <span id="L420" class="LineNr">420 </span> <span id="L421" class="LineNr">421 </span><span class="Delimiter">:(before &quot;Update LENGTH array in Check&quot;)</span> <span id="L422" class="LineNr">422 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>array<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L423" class="LineNr">423 </span><span class="Delimiter">:(before &quot;Update LENGTH array in Run&quot;)</span> <span id="L424" class="LineNr">424 </span>canonize<span class="Delimiter">(</span>array<span class="Delimiter">);</span> <span id="L425" class="LineNr">425 </span> <span id="L426" class="LineNr">426 </span><span class="Delimiter">:(scenario maybe_convert_indirect)</span> <span id="L427" class="LineNr">427 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L428" class="LineNr">428 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L429" class="LineNr">429 </span> <span class="Constant">11</span>:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/number<span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L430" class="LineNr">430 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe <span id="L431" class="LineNr">431 </span> <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:number-<span class="Normal">or</span>-point/lookup<span class="Delimiter">,</span> <span class="Constant">i:variant</span> <span id="L432" class="LineNr">432 </span>] <span id="L433" class="LineNr">433 </span><span class="traceContains">+mem: storing 1 in location 3</span> <span id="L434" class="LineNr">434 </span><span class="traceContains">+mem: storing 34 in location 2</span> <span id="L435" class="LineNr">435 </span> <span id="L436" class="LineNr">436 </span><span class="Delimiter">:(scenario maybe_convert_indirect_2)</span> <span id="L437" class="LineNr">437 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L438" class="LineNr">438 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L439" class="LineNr">439 </span> <span class="Constant">11</span>:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/number<span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L440" class="LineNr">440 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe <span id="L441" class="LineNr">441 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L82'>address</a>:num<span class="Special"> &lt;- </span>copy <span class="Constant">20</span>/unsafe <span id="L442" class="LineNr">442 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L82'>address</a>:num/lookup<span class="Delimiter">,</span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>maybe-convert <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:number-<span class="Normal">or</span>-point/lookup<span class="Delimiter">,</span> <span class="Constant">i:variant</span> <span id="L443" class="LineNr">443 </span>] <span id="L444" class="LineNr">444 </span><span class="traceContains">+mem: storing 1 in location 3</span> <span id="L445" class="LineNr">445 </span><span class="traceContains">+mem: storing 34 in location 21</span> <span id="L446" class="LineNr">446 </span> <span id="L447" class="LineNr">447 </span><span class="Delimiter">:(scenario maybe_convert_indirect_3)</span> <span id="L448" class="LineNr">448 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L449" class="LineNr">449 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L450" class="LineNr">450 </span> <span class="Constant">11</span>:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/number<span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L451" class="LineNr">451 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe <span id="L452" class="LineNr">452 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L82'>address</a>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy <span class="Constant">20</span>/unsafe <span id="L453" class="LineNr">453 </span> <span class="Constant">3</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:<a href='043space.cc.html#L82'>address</a>:<span class="Normal">bool</span>/lookup<span class="Special"> &lt;- </span>maybe-convert <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:number-<span class="Normal">or</span>-point/lookup<span class="Delimiter">,</span> <span class="Constant">i:variant</span> <span id="L454" class="LineNr">454 </span>] <span id="L455" class="LineNr">455 </span><span class="traceContains">+mem: storing 1 in location 21</span> <span id="L456" class="LineNr">456 </span><span class="traceContains">+mem: storing 34 in location 3</span> <span id="L457" class="LineNr">457 </span> <span id="L458" class="LineNr">458 </span><span class="Delimiter">:(before &quot;Update MAYBE_CONVERT base in Check&quot;)</span> <span id="L459" class="LineNr">459 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>base<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L460" class="LineNr">460 </span><span class="Delimiter">:(before &quot;Update MAYBE_CONVERT product in Check&quot;)</span> <span id="L461" class="LineNr">461 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L462" class="LineNr">462 </span><span class="Delimiter">:(before &quot;Update MAYBE_CONVERT status in Check&quot;)</span> <span id="L463" class="LineNr">463 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>status<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L464" class="LineNr">464 </span> <span id="L465" class="LineNr">465 </span><span class="Delimiter">:(before &quot;Update MAYBE_CONVERT base in Run&quot;)</span> <span id="L466" class="LineNr">466 </span>canonize<span class="Delimiter">(</span>base<span class="Delimiter">);</span> <span id="L467" class="LineNr">467 </span><span class="Delimiter">:(before &quot;Update MAYBE_CONVERT product in Run&quot;)</span> <span id="L468" class="LineNr">468 </span>canonize<span class="Delimiter">(</span>product<span class="Delimiter">);</span> <span id="L469" class="LineNr">469 </span><span class="Delimiter">:(before &quot;Update MAYBE_CONVERT status in Run&quot;)</span> <span id="L470" class="LineNr">470 </span>canonize<span class="Delimiter">(</span>status<span class="Delimiter">);</span> <span id="L471" class="LineNr">471 </span> <span id="L472" class="LineNr">472 </span><span class="Delimiter">:(scenario merge_exclusive_container_indirect)</span> <span id="L473" class="LineNr">473 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L474" class="LineNr">474 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:number-<span class="Normal">or</span>-point<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe <span id="L475" class="LineNr">475 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:number-<span class="Normal">or</span>-point/lookup<span class="Special"> &lt;- </span>merge <span class="Constant">0</span>/number<span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L476" class="LineNr">476 </span>] <span id="L477" class="LineNr">477 </span><span class="Comment"># skip 10 for refcount</span> <span id="L478" class="LineNr">478 </span><span class="traceContains">+mem: storing 0 in location 11</span> <span id="L479" class="LineNr">479 </span><span class="traceContains">+mem: storing 34 in location 12</span> <span id="L480" class="LineNr">480 </span> <span id="L481" class="LineNr">481 </span><span class="Delimiter">:(before &quot;Update size_mismatch Check for MERGE(x)</span> <span id="L482" class="LineNr">482 </span>canonize<span class="Delimiter">(</span>x<span class="Delimiter">);</span> <span id="L483" class="LineNr">483 </span> <span id="L484" class="LineNr">484 </span><span class="Comment">//: abbreviation for '/lookup': a prefix '*'</span> <span id="L485" class="LineNr">485 </span> <span id="L486" class="LineNr">486 </span><span class="Delimiter">:(scenario lookup_abbreviation)</span> <span id="L487" class="LineNr">487 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L488" class="LineNr">488 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:number<span class="Special"> &lt;- </span>copy <span class="Constant">10</span>/unsafe <span id="L489" class="LineNr">489 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L490" class="LineNr">490 </span> <span class="Constant">11</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">34</span> <span id="L491" class="LineNr">491 </span> <span class="Constant">3</span>:number<span class="Special"> &lt;- </span>copy *<span class="Constant">1</span>:<a href='043space.cc.html#L82'>address</a>:number <span id="L492" class="LineNr">492 </span>] <span id="L493" class="LineNr">493 </span><span class="traceContains">+parse: ingredient: {1: (&quot;address&quot; &quot;number&quot;), &quot;lookup&quot;: ()}</span> <span id="L494" class="LineNr">494 </span><span class="traceContains">+mem: storing 34 in location 3</span> <span id="L495" class="LineNr">495 </span> <span id="L496" class="LineNr">496 </span><span class="Delimiter">:(before &quot;End Parsing reagent&quot;)</span> <span id="L497" class="LineNr">497 </span><span class="Delimiter">{</span> <span id="L498" class="LineNr">498 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L77'>starts_with</a><span class="Delimiter">(</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;*&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L499" class="LineNr">499 </span> <span class="Conceal">¦</span> name<span class="Delimiter">.</span>erase<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> <span id="L500" class="LineNr">500 </span> <span class="Conceal">¦</span> properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;string<span class="Delimiter">,</span> string_tree*&gt;<span class="Delimiter">(</span><span class="Constant">&quot;lookup&quot;</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span> <span id="L501" class="LineNr">501 </span> <span class="Delimiter">}</span> <span id="L502" class="LineNr">502 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span id="L503" class="LineNr">503 </span> <span class="Conceal">¦</span> <a href='003trace.cc.html#L174'>raise</a> &lt;&lt; <span class="Constant">&quot;illegal name '&quot;</span> &lt;&lt; original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; <a href='003trace.cc.html#L203'>end</a><span class="Delimiter">();</span> <span id="L504" class="LineNr">504 </span><span class="Delimiter">}</span> <span id="L505" class="LineNr">505 </span> <span id="L506" class="LineNr">506 </span><span class="SalientComment">//:: helpers for debugging</span> <span id="L507" class="LineNr">507 </span> <span id="L508" class="LineNr">508 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span> <span id="L509" class="LineNr">509 </span>_DUMP<span class="Delimiter">,</span> <span id="L510" class="LineNr">510 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span> <span id="L511" class="LineNr">511 </span><a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$dump&quot;</span><span class="Delimiter">,</span> _DUMP<span class="Delimiter">);</span> <span id="L512" class="LineNr">512 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span> <span id="L513" class="LineNr">513 </span><span class="Normal">case</span> _DUMP: <span class="Delimiter">{</span> <span id="L514" class="LineNr">514 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> after_canonize = <a href='026call.cc.html#L89'>current_instruction</a><span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span id="L515" class="LineNr">515 </span> canonize<span class="Delimiter">(</span>after_canonize<span class="Delimiter">);</span> <span id="L516" class="LineNr">516 </span> cerr &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span><a href='026call.cc.html#L87'>current_recipe_name</a><span class="Delimiter">())</span> &lt;&lt; <a href='026call.cc.html#L89'>current_instruction</a><span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">' '</span> &lt;&lt; no_scientific<span class="Delimiter">(</span><a href='026call.cc.html#L89'>current_instruction</a><span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>value<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>after_canonize<span class="Delimiter">.</span>value<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L229'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> after_canonize<span class="Delimiter">.</span>value<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L517" class="LineNr">517 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L518" class="LineNr">518 </span><span class="Delimiter">}</span> <span id="L519" class="LineNr">519 </span> <span id="L520" class="LineNr">520 </span><span class="Comment">//: grab an address, and then dump its value at intervals</span> <span id="L521" class="LineNr">521 </span><span class="Comment">//: useful for tracking down memory corruption (writing to an out-of-bounds address)</span> <span id="L522" class="LineNr">522 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span> <span id="L523" class="LineNr">523 </span><span class="Normal">int</span> Bar = -<span class="Constant">1</span><span class="Delimiter">;</span> <span id="L524" class="LineNr">524 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span> <span id="L525" class="LineNr">525 </span>_BAR<span class="Delimiter">,</span> <span id="L526" class="LineNr">526 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span> <span id="L527" class="LineNr">527 </span><a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$bar&quot;</span><span class="Delimiter">,</span> _BAR<span class="Delimiter">);</span> <span id="L528" class="LineNr">528 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span> <span id="L529" class="LineNr">529 </span><span class="Normal">case</span> _BAR: <span class="Delimiter">{</span> <span id="L530" class="LineNr">530 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='026call.cc.html#L89'>current_instruction</a><span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> <span id="L531" class="LineNr">531 </span> <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>Bar != -<span class="Constant">1</span><span class="Delimiter">)</span> cerr &lt;&lt; Bar &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L229'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> Bar<span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L532" class="LineNr">532 </span> <span class="Conceal">¦</span> <span class="Normal">else</span> cerr &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L533" class="LineNr">533 </span> <span class="Delimiter">}</span> <span id="L534" class="LineNr">534 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> <span id="L535" class="LineNr">535 </span> <span class="Conceal">¦</span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> tmp = <a href='026call.cc.html#L89'>current_instruction</a><span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span id="L536" class="LineNr">536 </span> <span class="Conceal">¦</span> canonize<span class="Delimiter">(</span>tmp<span class="Delimiter">);</span> <span id="L537" class="LineNr">537 </span> <span class="Conceal">¦</span> Bar = tmp<span class="Delimiter">.</span>value<span class="Delimiter">;</span> <span id="L538" class="LineNr">538 </span> <span class="Delimiter">}</span> <span id="L539" class="LineNr">539 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L540" class="LineNr">540 </span><span class="Delimiter">}</span> </pre> </body> </html> <!-- vim: set foldmethod=manual : -->