#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