From ed7da0d9e31e8dd6847e2e603f0d1943330cf4d0 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Fri, 13 Mar 2026 14:07:29 +0200 Subject: 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. --- src/ast.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src/ast.c') 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; +} -- cgit v1.2.3