diff options
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/019address | 35 | ||||
-rw-r--r-- | cpp/020array | 4 |
2 files changed, 8 insertions, 31 deletions
diff --git a/cpp/019address b/cpp/019address index a642ceb1..07487499 100644 --- a/cpp/019address +++ b/cpp/019address @@ -12,24 +12,8 @@ recipe main [ +mem: location 2 is 34 +mem: storing 34 in location 3 -:(replace{} "vector<int> read_memory(reagent x)") -vector<int> read_memory(reagent x) { - vector<int> result; - if (isa_literal(x)) { - result.push_back(x.value); - return result; - } - x = canonize(x); - int base = x.value; -//? cout << "base: " << base << '\n'; //? 1 - size_t size = size_of(x); - for (size_t offset = 0; offset < size; ++offset) { - int val = Memory[base+offset]; - trace("mem") << "location " << base+offset << " is " << val; - result.push_back(val); - } - return result; -} +:(before "int base = x.value" following "vector<int> read_memory(reagent x)") +x = canonize(x); //: similarly, write to addresses pointing at other locations using the //: 'deref' property @@ -42,19 +26,8 @@ recipe main [ +mem: location 1 is 2 +mem: storing 34 in location 2 -:(replace{} "void write_memory(reagent x, vector<int> data)") -void write_memory(reagent x, vector<int> data) { - if (x.name == "_") return; // dummy results are never stored - x = canonize(x); -//? cout << x.to_string() << '\n'; //? 1 - int base = x.value; - if (!Type[x.types[0]].is_array && size_of(x) != data.size()) - raise << "size mismatch in storing to " << x.to_string(); - for (size_t offset = 0; offset < data.size(); ++offset) { - trace("mem") << "storing " << data[offset] << " in location " << base+offset; - Memory[base+offset] = data[offset]; - } -} +:(before "int base = x.value" following "void write_memory(reagent x, vector<int> data)") +x = canonize(x); :(code) reagent canonize(reagent x) { diff --git a/cpp/020array b/cpp/020array index aafeacf8..96591366 100644 --- a/cpp/020array +++ b/cpp/020array @@ -6,6 +6,10 @@ Type[integer_array].is_array = true; Type[integer_array].element.push_back(integer); Type[integer_array].name = "integer-array"; +//: update size mismatch check +:(replace "if (size_of(x) != data.size())" following "void write_memory(reagent x, vector<int> data)") +if (!Type[x.types[0]].is_array && size_of(x) != data.size()) + //: Arrays can be copied around with a single instruction just like integers, //: no matter how large they are. |