about summary refs log tree commit diff stats
path: root/cpp/020array
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/020array')
-rw-r--r--cpp/020array42
1 files changed, 31 insertions, 11 deletions
diff --git a/cpp/020array b/cpp/020array
index c310aff4..4a84af10 100644
--- a/cpp/020array
+++ b/cpp/020array
@@ -41,14 +41,29 @@ recipe main [
   5:integer <- index 1:array:integer, 0:literal
 ]
 +run: instruction main/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 14 in location 5
 
+//: array elements are accessed using 'index'
+:(scenario "index_direct_offset")
+recipe main [
+  1:integer <- copy 3:literal
+  2:integer <- copy 14:literal
+  3:integer <- copy 15:literal
+  4:integer <- copy 16:literal
+  5:integer <- copy 0:literal
+  6:integer <- index 1:array:integer, 5:integer
+]
++run: instruction main/5
++run: address to copy is 2
++run: its type is 1
++mem: location 2 is 14
++run: product 0 is 14
++mem: storing 14 in location 6
+
 :(before "End Globals")
 // Operator to look at elements of arrays.
 const int INDEX = 20;
@@ -59,22 +74,28 @@ Next_recipe_number++;
 :(before "End Primitive Recipe Implementations")
 case INDEX: {
   static const int ARRAY = Type_number["array"];
-  trace("run") << "ingredient 0 is " << instructions[pc].ingredients[0].name;
+//?   if (Trace_stream) Trace_stream->dump_layer = "run"; //? 1
+  trace("run") << "ingredient 0 is " << instructions[pc].ingredients[0].to_string();
   reagent base = canonize(instructions[pc].ingredients[0]);
+//?   trace("run") << "ingredient 0 after canonize: " << instructions[pc].ingredients[0].to_string(); //? 1
   int base_address = base.value;
   assert(base.types[0] == ARRAY);
-  trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].name;
-  size_t offset = instructions[pc].ingredients[1].value;
+  trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].to_string();
+  reagent offset = canonize(instructions[pc].ingredients[1]);
+  vector<int> offset_val(read_memory(offset));
   vector<type_number> element_type = array_element(base.types);
-  int src = base_address + 1 + offset*size_of(element_type);
+  int src = base_address + 1 + offset_val[0]*size_of(element_type);
   trace("run") << "address to copy is " << src;
   trace("run") << "its type is " << element_type[0];
   reagent tmp;
   tmp.set_value(src);
   copy(element_type.begin(), element_type.end(), inserter(tmp.types, tmp.types.begin()));
+  tmp.properties.push_back(pair<string, vector<string> >("raw", vector<string>()));
+//?   cout << "AAA: " << tmp.to_string() << '\n'; //? 2
   vector<int> result(read_memory(tmp));
   trace("run") << "product 0 is " << result[0];
   write_memory(instructions[pc].products[0], result);
+//?   if (Trace_stream) Trace_stream->dump_layer = ""; //? 1
   break;
 }
 
@@ -92,8 +113,6 @@ recipe main [
   5:integer <- index-address 1:array:integer, 0:literal
 ]
 +run: instruction main/4
-+run: ingredient 0 is 1
-+run: ingredient 1 is 0
 +run: address to copy is 2
 +mem: storing 2 in location 5
 
@@ -111,10 +130,11 @@ case INDEX_ADDRESS: {
   reagent base = canonize(instructions[pc].ingredients[0]);
   int base_address = base.value;
   assert(base.types[0] == ARRAY);
-  trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].name;
-  size_t offset = instructions[pc].ingredients[1].value;
+  trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].to_string();
+  reagent offset = canonize(instructions[pc].ingredients[1]);
+  vector<int> offset_val(read_memory(offset));
   vector<type_number> element_type = array_element(base.types);
-  int src = base_address + 1 + offset*size_of(element_type);
+  int src = base_address + 1 + offset_val[0]*size_of(element_type);
   trace("run") << "address to copy is " << src;
   vector<int> result;
   result.push_back(src);