aboutsummaryrefslogtreecommitdiff
path: root/src/ast.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2026-03-13 14:07:29 +0200
committerKimplul <kimi.h.kuparinen@gmail.com>2026-03-13 14:09:53 +0200
commited7da0d9e31e8dd6847e2e603f0d1943330cf4d0 (patch)
tree16e4785bd92f43a37bed6b0028b0f239faa00d51 /src/ast.c
parent25b8db28cf87708808744b97774c2a8427e129e2 (diff)
downloadfwd-ed7da0d9e31e8dd6847e2e603f0d1943330cf4d0.tar.gz
fwd-ed7da0d9e31e8dd6847e2e603f0d1943330cf4d0.zip
add initial reference invalidation
+ Makes vec example actually memory safe, which is cool + Specify owner > sub relationships with ">" in closure parameter lists, uses the same group idea as closure calls + Relies on users implementing functions in a consistent manner, since you can kind of do whatever with pointers. Presumably there would be a stdlib of vec/map/set etc. which applications could then use and by proxy be memory safe. Although some more checks wouldn't hurt, I suppose? + Not sure I like having reference invalidation be 'just a move', seems to work alright but the semantics of it are a bit muddy.
Diffstat (limited to 'src/ast.c')
-rw-r--r--src/ast.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/ast.c b/src/ast.c
index d7d97e0..4573d3e 100644
--- a/src/ast.c
+++ b/src/ast.c
@@ -123,6 +123,8 @@ struct ast *gen_ast(enum ast_kind kind,
n->s = s;
n->v = v;
n->d = d;
+ n->or = NULL;
+ n->ol = NULL;
n->loc = loc;
return n;
}
@@ -139,6 +141,7 @@ struct type *tgen_type(enum type_kind kind,
n->k = kind;
n->t0 = t0;
n->id = id;
+ n->or = NULL;
n->loc = loc;
return n;
}
@@ -378,6 +381,7 @@ struct type *clone_type(struct type *type)
if (type->t0)
new->t0 = clone_type_list(type->t0);
+ new->or = type->or;
new->group = type->group;
new->loc = type->loc;
return new;
@@ -752,3 +756,11 @@ void opt_group(struct ast *a, struct ast *b)
a->or = b;
b->ol = a;
}
+
+void own_type_group(struct type *owner, struct type *sub)
+{
+ /* sub does not get a reference to owner so if owner is moved, only the
+ * sub is marked as used. sub is still allowed to be passed around
+ * freely */
+ owner->or = sub;
+}