aboutsummaryrefslogtreecommitdiff
path: root/src/env.cff
blob: d1eab0794545581c3f26235b246839900eaab097 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import "cffc.hff";
import "map.hff";
import "util.hff";

struct StringKeyTraits {
   fn hash(s *const u8) u32 { return fnv1a_s(FNV1A_INI, s); }
   fn eq(a *const u8, b *const u8) bool { return streq(a, b); }
}

struct Env {
   parent *Env,
   alloc *Allocator,
   decls Map<*const u8, *DeclList, StringKeyTraits>,
}

extern fn mkenv(parent *Env, alloc *Allocator) *Env {
   let env *Env = xmalloc(sizeof Env);
   *env = { parent, alloc };
   return env;
}

extern fn envput(env *Env, decl *const Decl) *Decl {
   let l **DeclList = env.decls->get_slot(decl.name);
   let n *DeclList = env.alloc->alloc(sizeof *DeclList);
   n.link = *l;
   n.decl = *decl;
   *l = n;
   return &n.decl;
}