summaryrefslogtreecommitdiff
path: root/tnslc/compile/scope.tnsl
blob: 7822125d7f2ef099ced4f1256b16409f5ca29c21 (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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
struct Scope {
	~uint8 name,

	utils.Vector
		stack_vars,
		reg_vars,
	
	~Scope parent,
	
	int
		next_const,
		next_bool
}

/; method Scope
	/; init (~uint8 name)
		self.name = name

		Variable v
		self.stack_vars.init(len v)
		self.reg_vars.init(len v)

		self.next_const = 0
		self.next_bool = 0
	;/

	/; end
		_delete(self.name)

		~Variable v
		/; loop (int i = 0; i < self.stack_vars.count) [i++]
			v = self.stack_vars.get(i)
			v`.end()
		;/

		/; loop (int i = 0; i < self.reg_vars.count) [i++]
			v = self.reg_vars.get(i)
			v`.end()
		;/
	;/

	/; _name_rec (~utils.Vector out)
		/; if (self.parent !== NULL)
			self.parent`._name_rec(out)
			out`.push_cstr("#")
		;/

		out`.push_cstr(self.name)
	;/

	/; _base_label [utils.Vector]
		utils.Vector out
		out.init(1)
		
		~uint8 mod_str = self.current.label_prefix()
		out.push_cstr(mod_str)
		_delete(mod_str)

		self._name_rec(~out)

		return out
	;/

	/; label_start [~uint8]
		utils.Vector base = self._base_label()
		base.push_cstr("#start\0")
		return base.as_cstr()
	;/

	/; label_rep [~uint8]
		utils.Vector base = self._base_label()
		base.push_cstr("#rep\0")
		return base.as_cstr()
	;/

	/; label_end [~uint8]
		utils.Vector base = self._base_label()
		base.push_cstr("#end\0")
		return base.as_cstr()
	;/
	
	/; label_next_const [~uint8]
		utils.Vector base = self._base_label()
		base.push_cstr("#const\0")
		
		~uint8 str = utils.int_to_str(self.next_const)
		base.push_cstr(str)
		self.next_const++
		_delete(str)

		return base.as_cstr()
	;/

	/; label_bool [~uint8]
		utils.Vector base = self._base_label()
		base.push_cstr("#bool\0")
		
		~uint8 str = utils.int_to_str(self.next_bool)
		base.push_cstr(str)
		self.next_bool++
		_delete(str)

		return base.as_cstr()
	;/

	/; label_bool_adv
		self.next_bool++
	;/

	/; subscope (~uint8 name) [Scope]
        Scope out
        
		utils.Vector str
		str.from_cstr(name)
		_delete(name)

    out.init(str.as_cstr(), self.current)
    out.parent = ~self

    return out
	;/
;/