summaryrefslogtreecommitdiff
path: root/proc.h
diff options
context:
space:
mode:
authorWormHeamer2025-10-21 05:47:19 -0400
committerWormHeamer2025-10-21 05:47:19 -0400
commit3ca04326ddb36b8551acf417ef195d1572bb3d47 (patch)
tree5b9d1d7bf90fcf60f883ca7ebe864b3a2281e2a5 /proc.h
parentac15eb8b0ca41d502d8a26c360ff65f2b4a18d88 (diff)
almost there...
Diffstat (limited to 'proc.h')
-rw-r--r--proc.h28
1 files changed, 15 insertions, 13 deletions
diff --git a/proc.h b/proc.h
index 0aaa5dc..3ef49a9 100644
--- a/proc.h
+++ b/proc.h
@@ -9,6 +9,7 @@ typedef struct NameBinding {
LexSpan src_pos;
Str name;
Node *node;
+ unsigned nestlvl;
} NameBinding;
typedef struct ScopeFrame {
@@ -17,35 +18,36 @@ typedef struct ScopeFrame {
} ScopeFrame;
typedef struct {
- Str name;
- Value *from, *to;
+ NameBinding *bind;
+ Node *from, *to;
LexSpan from_pos, to_pos;
} ScopeChange;
-typedef XAR(ScopeChange) ScopeChangeList;
-
-typedef struct {
- Str name;
- Value *from, *to;
- LexSpan from_pos, to_pos;
-} ScopeChange;
-
-typedef struct {
- Arena *arena;
+typedef struct ScopeChangeList {
XAR(ScopeChange);
+ struct ScopeChangeList *prev;
+ Arena *arena;
} ScopeChangeList;
typedef struct {
Arena *arena;
ScopeFrame *tail, *free_scope;
NameBinding *free_bind;
+ ScopeChangeList *changes;
+ unsigned nestlvl;
} Scope;
ScopeFrame *scope_push(Scope *scope);
ScopeFrame *scope_pop(Scope *scope, Graph *g);
NameBinding *scope_find(Scope *scope, Str name);
NameBinding *scope_bind(Scope *scope, Str name, Node *value, LexSpan pos, Graph *g);
-NameBinding *scope_update(NameBinding *b, Node *to, Graph *g);
+NameBinding *scope_update(Scope *scope, NameBinding *b, Node *to, Graph *g);
+
+void scope_changelist_update(ScopeChangeList *l, NameBinding *b, Node *from, Node *to, Graph *g);
+void scope_changelist_push(Scope *scope, ScopeChangeList *l, Arena *a);
+void scope_changelist_pop(Scope *scope, Graph *g);
+void scope_changelist_merge(Scope *scope, ScopeChangeList *y, ScopeChangeList *n, Node *region, Graph *graph, Arena *scratch);
+void scope_changelist_discard(ScopeChangeList *l, Graph *g);
typedef struct {
Str name;