about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-03-26 20:24:38 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-03-26 20:24:38 -0700
commit3076bab4b62ce2b56c53db6d0b1715429c5bda27 (patch)
tree08c0da74ffee65301953c1186bb7aef1970db16d
parent62ed0e4728ab0238c47f03dea38782a599bff3fb (diff)
downloadmu-3076bab4b62ce2b56c53db6d0b1715429c5bda27.tar.gz
979
-rw-r--r--cpp/013run5
-rw-r--r--cpp/018record12
-rw-r--r--cpp/019address10
-rw-r--r--cpp/020array23
4 files changed, 18 insertions, 32 deletions
diff --git a/cpp/013run b/cpp/013run
index ef608cb6..9790bfdd 100644
--- a/cpp/013run
+++ b/cpp/013run
@@ -147,7 +147,10 @@ void write_memory(reagent x, vector<int> data) {
 
 :(code)
 size_t size_of(const reagent& r) {
-  type_info t = Type[r.types[0]];
+  return size_of(r.types);
+}
+size_t size_of(const vector<type_number>& types) {
+  type_info t = Type[types[0]];
   // End size_of Cases.
   return t.size;
 }
diff --git a/cpp/018record b/cpp/018record
index 5c1715a4..55c4df0d 100644
--- a/cpp/018record
+++ b/cpp/018record
@@ -43,9 +43,7 @@ case GET: {
   size_t offset = instructions[pc].ingredients[1].value;
   int src = base_address;
   for (size_t i = 0; i < offset; ++i) {
-    reagent tmp;
-    tmp.types.push_back(Type[base_type].elements[i][0]);
-    src += size_of(tmp);
+    src += size_of(Type[base_type].elements[i]);
   }
   trace("run") << "address to copy is " << src;
   assert(Type[base_type].elements.size() > offset);
@@ -121,9 +119,7 @@ case GET_ADDRESS: {
   size_t offset = instructions[pc].ingredients[1].value;
   int src = base_address;
   for (size_t i = 0; i < offset; ++i) {
-    reagent tmp;
-    tmp.types.push_back(Type[base_type].elements[i][0]);
-    src += size_of(tmp);
+    src += size_of(Type[base_type].elements[i]);
   }
   trace("run") << "address to copy is " << src;
   vector<int> result;
@@ -158,9 +154,7 @@ recipe main [
 if (t.is_record) {
   size_t result = 0;
   for (size_t i = 0; i < t.elements.size(); ++i) {
-    reagent x;
-    x.types.push_back(t.elements[i][0]);
-    result += size_of(x);
+    result += size_of(t.elements[i]);
   }
   return result;
 }
diff --git a/cpp/019address b/cpp/019address
index be1ce74c..13d59465 100644
--- a/cpp/019address
+++ b/cpp/019address
@@ -49,7 +49,7 @@ bool has_property(reagent x, string name) {
 reagent deref(reagent x) {
 //?   cout << "deref\n"; //? 1
   static const int ADDRESS = Type_number["address"];
-  reagent result("");
+  reagent result;
   assert(x.types[0] == ADDRESS);
 
   // compute value
@@ -110,9 +110,7 @@ case GET: {
   size_t offset = instructions[pc].ingredients[1].value;
   int src = base_address;
   for (size_t i = 0; i < offset; ++i) {
-    reagent tmp;
-    tmp.types.push_back(Type[base_type].elements[i][0]);
-    src += size_of(tmp);
+    src += size_of(Type[base_type].elements[i]);
   }
   trace("run") << "address to copy is " << src;
   assert(Type[base_type].is_record);
@@ -152,9 +150,7 @@ case GET_ADDRESS: {
   size_t offset = instructions[pc].ingredients[1].value;
   int src = base_address;
   for (size_t i = 0; i < offset; ++i) {
-    reagent tmp;
-    tmp.types.push_back(Type[base_type].elements[i][0]);
-    src += size_of(tmp);
+    src += size_of(Type[base_type].elements[i]);
   }
   trace("run") << "address to copy is " << src;
   vector<int> result;
diff --git a/cpp/020array b/cpp/020array
index 96591366..5e086ebc 100644
--- a/cpp/020array
+++ b/cpp/020array
@@ -32,15 +32,12 @@ recipe main [
 +mem: storing 15 in location 7
 +mem: storing 16 in location 8
 
-:(before "End size_of Cases")
-if (t.is_array) {
-  int base = r.value;
-  if (Memory[base] == 0) return 0;
-  reagent x;
-  x.set_value(base+1);
-  x.types.push_back(t.element[0]);
-  return 1 + Memory[base]*size_of(x);
-}
+:(after "size_t size_of(const reagent& r)")
+  const type_info& t = Type[r.types[0]];
+  if (t.is_array) {
+    int base = r.value;
+    return 1 + Memory[base]*size_of(t.element);
+  }
 
 :(before "End Globals")
 // Operator to look at elements of arrays.
@@ -58,9 +55,7 @@ case INDEX: {
   assert(Type[base_type].is_array);
   trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].name;
   size_t offset = instructions[pc].ingredients[1].value;
-  reagent elem;
-  elem.types.push_back(Type[base_type].element[0]);
-  int src = base_address + 1 + offset*size_of(elem);
+  int src = base_address + 1 + offset*size_of(Type[base_type].element);
   trace("run") << "address to copy is " << src;
   int src_type = Type[base_type].element[0];
   trace("run") << "its type is " << src_type;
@@ -106,9 +101,7 @@ case INDEX_ADDRESS: {
   assert(Type[base_type].is_array);
   trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].name;
   size_t offset = instructions[pc].ingredients[1].value;
-  reagent elem;
-  elem.types.push_back(Type[base_type].element[0]);
-  int src = base_address + 1 + offset*size_of(elem);
+  int src = base_address + 1 + offset*size_of(Type[base_type].element);
   trace("run") << "address to copy is " << src;
   vector<int> result;
   result.push_back(src);