diff options
-rw-r--r-- | cpp/013run | 5 | ||||
-rw-r--r-- | cpp/018record | 12 | ||||
-rw-r--r-- | cpp/019address | 10 | ||||
-rw-r--r-- | cpp/020array | 23 |
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); |