From cbca8b454309122632615f0bcb787bc898503df9 Mon Sep 17 00:00:00 2001 From: WormHeamer Date: Sat, 30 Aug 2025 23:20:51 -0400 Subject: separate IR graph parts of Proc into a Graph struct --- proc.h | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 proc.h (limited to 'proc.h') diff --git a/proc.h b/proc.h new file mode 100644 index 0000000..ec3687f --- /dev/null +++ b/proc.h @@ -0,0 +1,51 @@ +#ifndef PROC_H +#define PROC_H + +#include "ir.h" + +typedef struct NameBinding { + struct NameBinding *prev; + LexSpan src_pos; + Str name; + Node *node; +} NameBinding; + +typedef struct ScopeFrame { + struct ScopeFrame *prev; + NameBinding *latest; +} ScopeFrame; + +typedef struct { + Arena *arena; + ScopeFrame *tail, *free_scope; + NameBinding *free_bind; +} Scope; + +typedef struct { + Str name; + Node *node; +} ScopeName; + +typedef DYNARR(ScopeName) ScopeNameList; + +typedef struct { + Str name; + Type ret_type; + Arena perm, scratch; + NodePool pool; + Graph graph; + Scope scope; +} Proc; + +void proc_init(Proc *proc, Str name); +void proc_free(Proc *proc); + +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); +void scope_collect(Scope *scope, Graph *g, ScopeNameList *nl, Arena *arena); +void scope_uncollect(Scope *scope, Graph *g, ScopeNameList *nl); + +#endif -- cgit v1.2.3