summaryrefslogtreecommitdiff
path: root/tnslc/compile/module.tnsl
blob: 41890b38f461d273a2f058f428f73764c979d37d (plain)
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
struct Module {
	~uint8 name,
	~Module parent,
	utils.Vector vars, funcs, submods,
	bool exported
}

/; method Module
	/; init (~uint8 name, ~Module parent, bool exported)
		self.parent = parent
		self.exported = exported
		self.name = utils.strclone(name)

		Variable v
		self.vars.init(len v)
		Function f
		self.funcs.init(len f)
		Module m
		self.submods.init(len m)
	;/

	# Assumes that variable will be freed by this module
	/; add_var (~Variable v)
		self.vars.push(v)
	;/

	# Assumes that function will be freed by this module
	/; add_func (~Function f)
		self.funcs.push(f)
	;/

	# Assumes that submod will be freed by this module
	/; add_sub (~Module s)
		self.submods.push(s)
	;/

	# Free all contained substructures
	/; end
		_delete(self.name)
		
		~Variable v
		/; loop (int i = 0; i < self.vars.count) [i++]
			v = self.vars.get(i)
			v`.end()
		;/

		~Function f
		/; loop (int i = 0; i < self.funcs.count) [i++]
			f = self.funcs.get(i)
			f`.end()
		;/

		~Module s
		/; loop (int i = 0; i < self.submods.count) [i++]
			s = self.submods.get(i)
			s`.end()
		;/

		self.vars.end()
		self.funcs.end()
		self.submods.end()
	;/
;/