From 0edd9b9fc60440213e4df926ea511419ee291f1e Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Fri, 15 Jun 2018 22:12:03 -0700 Subject: 4257 - abortive attempt at safe fat pointers I've been working on this slowly over several weeks, but it's too hard to support 0 as the null value for addresses. I constantly have to add exceptions for scalar value corresponding to an address type (now occupying 2 locations). The final straw is the test for 'reload': x:num <- reload text 'reload' returns an address. But there's no way to know that for arbitrary instructions. New plan: let's put this off for a bit and first create support for literals. Then use 'null' instead of '0' for addresses everywhere. Then it'll be easy to just change what 'null' means. --- 089scenario_filesystem.cc | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to '089scenario_filesystem.cc') diff --git a/089scenario_filesystem.cc b/089scenario_filesystem.cc index f14534ac..bacb61be 100644 --- a/089scenario_filesystem.cc +++ b/089scenario_filesystem.cc @@ -71,7 +71,7 @@ scenario escaping-file-contents [ ] :(before "End Globals") -extern const int RESOURCES = Next_predefined_global_for_scenarios++; +extern const int RESOURCES = next_predefined_global_for_scenarios(/*size_of(address:resources)*/2); //: give 'resources' a fixed location in scenarios :(before "End Special Scenario Variable Names(r)") Name[r]["resources"] = RESOURCES; @@ -203,26 +203,28 @@ string munge_resources_contents(const string& data, const string& filename, cons } void construct_resources_object(const map& contents) { - int resources_data_address = allocate(SIZE(contents)*2 + /*array length*/1); - int curr = resources_data_address + /*skip length*/1; + int resources_data_address = allocate(SIZE(contents) * /*size of resource*/4 + /*array length*/1); + int curr = resources_data_address + /*skip alloc id*/1 + /*skip array length*/1; for (map::const_iterator p = contents.begin(); p != contents.end(); ++p) { + ++curr; // skip alloc id of resource.name put(Memory, curr, new_mu_text(p->first)); trace("mem") << "storing file name " << get(Memory, curr) << " in location " << curr << end(); ++curr; + ++curr; // skip alloc id of resource.contents put(Memory, curr, new_mu_text(p->second)); trace("mem") << "storing file contents " << get(Memory, curr) << " in location " << curr << end(); ++curr; } - curr = resources_data_address; - put(Memory, curr, SIZE(contents)); // size of array + curr = resources_data_address + /*skip alloc id of resources.data*/1; + put(Memory, curr, SIZE(contents)); // array length trace("mem") << "storing resources size " << get(Memory, curr) << " in location " << curr << end(); // wrap the resources data in a 'resources' object int resources_address = allocate(size_of_resources()); - curr = resources_address+/*offset of 'data' element*/1; + curr = resources_address+/*alloc id*/1+/*offset of 'data' element*/1+/*skip alloc id of 'data' element*/1; put(Memory, curr, resources_data_address); trace("mem") << "storing resources data address " << resources_data_address << " in location " << curr << end(); // save in product - put(Memory, RESOURCES, resources_address); + put(Memory, RESOURCES+/*skip alloc id*/1, resources_address); trace("mem") << "storing resources address " << resources_address << " in location " << RESOURCES << end(); } -- cgit 1.4.1-2-gfad0