about summary refs log tree commit diff stats
path: root/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp')
-rw-r--r--cpp/.traces/index36
-rw-r--r--cpp/.traces/index_address34
-rw-r--r--cpp/019array84
3 files changed, 154 insertions, 0 deletions
diff --git a/cpp/.traces/index b/cpp/.traces/index
new file mode 100644
index 00000000..a23f11ab
--- /dev/null
+++ b/cpp/.traces/index
@@ -0,0 +1,36 @@
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "3", type: 0}
+parse/0:   product: {name: "1", type: 1}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "14", type: 0}
+parse/0:   product: {name: "2", type: 1}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "15", type: 0}
+parse/0:   product: {name: "3", type: 1}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "16", type: 0}
+parse/0:   product: {name: "4", type: 1}
+parse/0: instruction: 20
+parse/0:   ingredient: {name: "1", type: 6}
+parse/0:   ingredient: {name: "0", type: 0}
+parse/0:   product: {name: "5", type: 1}
+run/0: instruction 0
+run/0: ingredient 0 is 3
+mem/0: storing in location 1
+run/0: instruction 1
+run/0: ingredient 0 is 14
+mem/0: storing in location 2
+run/0: instruction 2
+run/0: ingredient 0 is 15
+mem/0: storing in location 3
+run/0: instruction 3
+run/0: ingredient 0 is 16
+mem/0: storing in location 4
+run/0: instruction 4
+run/0: ingredient 0 is 1
+run/0: ingredient 1 is 0
+run/0: address to copy is 2
+run/0: its type is 1
+mem/0: location 2 is 14
+run/0: product 0 is 14
+mem/0: storing in location 5
diff --git a/cpp/.traces/index_address b/cpp/.traces/index_address
new file mode 100644
index 00000000..bd407dda
--- /dev/null
+++ b/cpp/.traces/index_address
@@ -0,0 +1,34 @@
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "3", type: 0}
+parse/0:   product: {name: "1", type: 1}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "14", type: 0}
+parse/0:   product: {name: "2", type: 1}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "15", type: 0}
+parse/0:   product: {name: "3", type: 1}
+parse/0: instruction: 1
+parse/0:   ingredient: {name: "16", type: 0}
+parse/0:   product: {name: "4", type: 1}
+parse/0: instruction: 21
+parse/0:   ingredient: {name: "1", type: 6}
+parse/0:   ingredient: {name: "0", type: 0}
+parse/0:   product: {name: "5", type: 1}
+run/0: instruction 0
+run/0: ingredient 0 is 3
+mem/0: storing in location 1
+run/0: instruction 1
+run/0: ingredient 0 is 14
+mem/0: storing in location 2
+run/0: instruction 2
+run/0: ingredient 0 is 15
+mem/0: storing in location 3
+run/0: instruction 3
+run/0: ingredient 0 is 16
+mem/0: storing in location 4
+run/0: instruction 4
+run/0: ingredient 0 is 1
+run/0: ingredient 1 is 0
+run/0: address to copy is 2
+run/0: product 0 is 2
+mem/0: storing in location 5
diff --git a/cpp/019array b/cpp/019array
index d6ae0eae..51b6ea6b 100644
--- a/cpp/019array
+++ b/cpp/019array
@@ -53,3 +53,87 @@ size_t size_of(reagent r) {
   // scalar
   return t.size;
 }
+
+:(before "End Globals")
+// Operator to look at elements of arrays.
+const int INDEX = 20;
+:(before "End Primitive Recipe Numbers")
+Recipe_number["index"] = INDEX;
+Next_recipe_number++;
+:(before "End Primitive Recipe Implementations")
+case INDEX: {
+  trace("run") << "ingredient 0 is " << instructions[pc].ingredients[0].name;
+  reagent base = canonize(instructions[pc].ingredients[0]);
+  int base_address = to_int(base.name);
+  int base_type = base.types[0];
+  assert(Type[base_type].is_array);
+  trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].name;
+  size_t offset = to_int(instructions[pc].ingredients[1].name);
+  int src = base_address + 1 + offset*size_of(reagent(Type[base_type].element[0]));
+  trace("run") << "address to copy is " << src;
+  int src_type = Type[base_type].element[0];
+  trace("run") << "its type is " << src_type;
+  ostringstream s;
+  s << src;
+  reagent tmp(s.str());
+  tmp.types.push_back(src_type);
+  vector<int> result(read_memory(tmp));
+  trace("run") << "product 0 is " << result[0];
+  write_memory(instructions[pc].products[0], result);
+  break;
+}
+
+:(scenario "index")
+recipe main [
+  1:integer <- copy 3:literal
+  2:integer <- copy 14:literal
+  3:integer <- copy 15:literal
+  4:integer <- copy 16:literal
+  5:integer <- index 1:integer-array, 0:literal
+]
++run: instruction 4
++run: ingredient 0 is 1
++run: ingredient 1 is 0
++run: address to copy is 2
++run: its type is 1
++mem: location 2 is 14
++run: product 0 is 14
++mem: storing in location 5
+
+:(before "End Globals")
+// To write to fields of records, you need their address.
+const int INDEX_ADDRESS = 21;
+:(before "End Primitive Recipe Numbers")
+Recipe_number["index-address"] = INDEX_ADDRESS;
+Next_recipe_number++;
+:(before "End Primitive Recipe Implementations")
+case INDEX_ADDRESS: {
+  trace("run") << "ingredient 0 is " << instructions[pc].ingredients[0].name;
+  reagent base = canonize(instructions[pc].ingredients[0]);
+  int base_address = to_int(base.name);
+  int base_type = base.types[0];
+  assert(Type[base_type].is_array);
+  trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].name;
+  size_t offset = to_int(instructions[pc].ingredients[1].name);
+  int src = base_address + 1 + offset*size_of(reagent(Type[base_type].element[0]));
+  trace("run") << "address to copy is " << src;
+  vector<int> result;
+  result.push_back(src);
+  trace("run") << "product 0 is " << result[0];
+  write_memory(instructions[pc].products[0], result);
+  break;
+}
+
+:(scenario "index_address")
+recipe main [
+  1:integer <- copy 3:literal
+  2:integer <- copy 14:literal
+  3:integer <- copy 15:literal
+  4:integer <- copy 16:literal
+  5:integer <- index-address 1:integer-array, 0:literal
+]
++run: instruction 4
++run: ingredient 0 is 1
++run: ingredient 1 is 0
++run: address to copy is 2
++mem: storing in location 5