summaryrefslogtreecommitdiff
path: root/proc.h
diff options
context:
space:
mode:
Diffstat (limited to 'proc.h')
-rw-r--r--proc.h51
1 files changed, 51 insertions, 0 deletions
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