about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--043space.cc45
1 files changed, 25 insertions, 20 deletions
diff --git a/043space.cc b/043space.cc
index 06cd09b1..51c84af6 100644
--- a/043space.cc
+++ b/043space.cc
@@ -211,12 +211,13 @@ def foo [
 # both calls to foo should have received the same default-space
 +mem: storing 1 in location 3
 
-:(scenario local_scope_frees_up_allocations)
-def main [
-  local-scope
-  x:address:shared:array:character <- new [abc]
-]
-+mem: clearing x:address:shared:array:character
+:(code)  // pending test
+//? :(scenario local_scope_frees_up_allocations)
+//? def main [
+//?   local-scope
+//?   x:address:shared:array:character <- new [abc]
+//? ]
+//? +mem: clearing x:address:shared:array:character
 
 //: todo: do this in a transform, rather than magically in the reply instruction
 :(after "Falling Through End Of Recipe")
@@ -240,20 +241,24 @@ void try_reclaim_locals() {
   const instruction& inst = exiting_recipe.steps.at(0);
   if (inst.old_name != "local-scope") return;
   // reclaim any local variables unless they're being returned
-  vector<double> zero;
-  zero.push_back(0);
-  for (int i = /*leave default space for last*/1; i < SIZE(exiting_recipe.steps); ++i) {
-    const instruction& inst = exiting_recipe.steps.at(i);
-    for (int i = 0; i < SIZE(inst.products); ++i) {
-      if (!is_mu_address(inst.products.at(i))) continue;
-      // local variables only
-      if (has_property(inst.products.at(i), "space")) continue;
-      if (has_property(inst.products.at(i), "lookup")) continue;
-      if (escaping(inst.products.at(i))) continue;
-      trace(9999, "mem") << "clearing " << inst.products.at(i).original_string << end();
-      write_memory(inst.products.at(i), zero);
-    }
-  }
+  // TODO: this isn't working yet. Doesn't handle address:shared stored in
+  // containers created by 'copy' or 'merge'. We'd end up deleting the address
+  // even if some container containing it was returned.
+  // This might doom our whole refcounting-based approach :/
+//?   vector<double> zero;
+//?   zero.push_back(0);
+//?   for (int i = /*leave default space for last*/1; i < SIZE(exiting_recipe.steps); ++i) {
+//?     const instruction& inst = exiting_recipe.steps.at(i);
+//?     for (int i = 0; i < SIZE(inst.products); ++i) {
+//?       if (!is_mu_address(inst.products.at(i))) continue;
+//?       // local variables only
+//?       if (has_property(inst.products.at(i), "space")) continue;
+//?       if (has_property(inst.products.at(i), "lookup")) continue;
+//?       if (escaping(inst.products.at(i))) continue;
+//?       trace(9999, "mem") << "clearing " << inst.products.at(i).original_string << end();
+//?       write_memory(inst.products.at(i), zero);
+//?     }
+//?   }
   abandon(current_call().default_space,
           /*refcount*/1 + /*array length*/1 + /*number-of-locals*/Name[r][""]);
 }