about summary refs log tree commit diff stats
path: root/045closure_name.cc
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2016-01-19 23:18:03 -0800
committerKartik K. Agaram <vc@akkartik.com>2016-01-19 23:18:03 -0800
commit455fbac64f101b05f7eaca89b84470569e4df3fd (patch)
tree32cfd5b092ad86086e4d15992bb10fd06a12bf13 /045closure_name.cc
parent7163e18a774781c62f0c0542e4cb9037f6a71d22 (diff)
downloadmu-455fbac64f101b05f7eaca89b84470569e4df3fd.tar.gz
2576 - distinguish allocated addresses from others
This is the one major refinement on the C programming model I'm planning
to introduce in mu. Instead of Rust's menagerie of pointer types and
static checking, I want to introduce just one new type, and use it to
perform ref-counting at runtime.

So far all we're doing is updating new's interface. The actual
ref-counting implementation is next.

One implication: I might sometimes need duplicate implementations for a
recipe with allocated vs vanilla addresses of the same type. So far it
seems I can get away with just always passing in allocated addresses;
the situations when you want to pass an unallocated address to a recipe
should be few and far between.
Diffstat (limited to '045closure_name.cc')
-rw-r--r--045closure_name.cc26
1 files changed, 14 insertions, 12 deletions
diff --git a/045closure_name.cc b/045closure_name.cc
index 682c163f..714d14d1 100644
--- a/045closure_name.cc
+++ b/045closure_name.cc
@@ -5,22 +5,22 @@
 
 :(scenario closure)
 recipe main [
-  default-space:address:array:location <- new location:type, 30
-  1:address:array:location/names:new-counter <- new-counter
-  2:number/raw <- increment-counter 1:address:array:location/names:new-counter
-  3:number/raw <- increment-counter 1:address:array:location/names:new-counter
+  default-space:address:shared:array:location <- new location:type, 30
+  1:address:shared:array:location/names:new-counter <- new-counter
+  2:number/raw <- increment-counter 1:address:shared:array:location/names:new-counter
+  3:number/raw <- increment-counter 1:address:shared:array:location/names:new-counter
 ]
 
 recipe new-counter [
-  default-space:address:array:location <- new location:type, 30
+  default-space:address:shared:array:location <- new location:type, 30
   x:number <- copy 23
   y:number <- copy 3  # variable that will be incremented
-  reply default-space:address:array:location
+  reply default-space:address:shared:array:location
 ]
 
 recipe increment-counter [
-  default-space:address:array:location <- new location:type, 30
-  0:address:array:location/names:new-counter <- next-ingredient  # outer space must be created by 'new-counter' above
+  default-space:address:shared:array:location <- new location:type, 30
+  0:address:shared:array:location/names:new-counter <- next-ingredient  # outer space must be created by 'new-counter' above
   y:number/space:1 <- add y:number/space:1, 1  # increment
   y:number <- copy 234  # dummy
   reply y:number/space:1
@@ -52,11 +52,13 @@ void collect_surrounding_spaces(const recipe_ordinal r) {
       if (!type
           || type->value != get(Type_ordinal, "address")
           || !type->right
-          || type->right->value != get(Type_ordinal, "array")
+          || type->right->value != get(Type_ordinal, "shared")
           || !type->right->right
-          || type->right->right->value != get(Type_ordinal, "location")
-          || type->right->right->right) {
-        raise_error << "slot 0 should always have type address:array:location, but is " << inst.products.at(j).to_string() << '\n' << end();
+          || type->right->right->value != get(Type_ordinal, "array")
+          || !type->right->right->right
+          || type->right->right->right->value != get(Type_ordinal, "location")
+          || type->right->right->right->right) {
+        raise_error << "slot 0 should always have type address:shared:array:location, but is " << inst.products.at(j).to_string() << '\n' << end();
         continue;
       }
       string_tree* s = property(inst.products.at(j), "names");