diff options
Diffstat (limited to 'tnslc/compile/scope.tnsl')
| -rw-r--r-- | tnslc/compile/scope.tnsl | 261 |
1 files changed, 185 insertions, 76 deletions
diff --git a/tnslc/compile/scope.tnsl b/tnslc/compile/scope.tnsl index 7822125..1afaeab 100644 --- a/tnslc/compile/scope.tnsl +++ b/tnslc/compile/scope.tnsl @@ -1,123 +1,232 @@ struct Scope { ~uint8 name, - - utils.Vector - stack_vars, - reg_vars, + ~Module mod, + ~CompBuf cb, ~Scope parent, - - int - next_const, - next_bool -} -/; method Scope - /; init (~uint8 name) - self.name = name + utils.Vector vars, - Variable v - self.stack_vars.init(len v) - self.reg_vars.init(len v) + int unique +} + +/; _recursive_mod_name(~Module mod, ~utils.Vector vec) + ~Module p = mod`.parent + /; if (p !== NULL) + _recursive_mod_name(p, vec) + /; if (vec`.count !== 0) + vec`.push_char('.') + ;/ + ;/ + vec`.push_cstr(mod`.name) +;/ - self.next_const = 0 - self.next_bool = 0 +/; _recursive_scope_name(~Scope s, ~utils.Vector vec) + ~void p = s`.parent + /; if (p == NULL) + ~void m = s`.mod + /; if (m !== NULL) + _recursive_mod_name(m, vec) + /; if (vec`.count > 0) + vec`.push_char('.') + ;/ + ;/ + ;; else + _recursive_scope_name(p, vec) ;/ + vec`.push_cstr(s`.name) +;/ +/; method Scope + /; init (~Module mod, ~CompBuf cb, ~uint8 name) + self.name = utils.strcpy(name) + self.mod = mod + self.cb = cb + self.parent = NULL + self.unique = 0 + + Var v + self.vars.init(len v) + ;/ + /; end _delete(self.name) - ~Variable v - /; loop (int i = 0; i < self.stack_vars.count) [i++] - v = self.stack_vars.get(i) + ~Var v + /; loop (int i = 0; i < self.vars.count) [i++] + v = self.vars.get(i) v`.end() ;/ + self.vars.end() + ;/ - /; loop (int i = 0; i < self.reg_vars.count) [i++] - v = self.reg_vars.get(i) - v`.end() + # + # Make variables + # + + /; _next_reg_slot [uint] + uint out = 9 + /; if (self.parent !== NULL) + out = self.parent`._next_reg_slot() + ;/ + + /; if (out == 0) + return out ;/ + + ~Var v + /; loop (int i = 0; i < self.vars.count) [i++] + v = self.vars.get(i) + /; if (v`.loc > 0) + out++ + /; if (out > 16) + return 0 + ;/ + ;/ + ;/ + + return out ;/ - /; _name_rec (~utils.Vector out) + /; _next_stack_slot [uint] + uint out = 0 /; if (self.parent !== NULL) - self.parent`._name_rec(out) - out`.push_cstr("#") + out = self.parent`._next_stack_slot() + ;/ + + ~Var v + /; loop (int i = 0; i < self.vars.count) [i++] + v = self.vars.get(i) + /; if (v`.loc < 0) + out = out - v`.actual_size() + ;/ + ;/ + + return out + ;/ + + /; mk_set_var (~Var src) + Var out = src`.copy() + + /; if (src`.is_reg_passed() == true) + out.loc = self._next_reg_slot() + /; if (out.loc == 0) + out.loc = self._next_stack_slot() + ;/ + ;; else + out.loc = self._next_stack_slot() + ;/ + + ~int32 p = out.top_ptrc() + /; if (p == NULL) + out.set(self.cb, src) + ;; else if (p` == 0) + out.set_ref(self.cb, src) + ;; else + out.set(self.cb, src) ;/ - out`.push_cstr(self.name) + self.vars.push(~out) + ;/ + + # + # Sub scope + # + + /; mk_sub (~uint8 name) [Scope] + Scope out + out.init(self.mod, self.cb, name) + out.parent = ~self + return out + ;/ + + # Generate a garantueed unique name for the sub scope, using + # the provided name as a base + /; gen_sub(~uint8 name) [Scope] + utils.Vector true_name + true_name.init(1) + + # Append a 'unique' number + ~uint8 u = utils.int_to_str(self.unique) + true_name.push_char('#') + true_name.push_cstr(u) + true_name.push_char('#') + true_name.push_cstr(name) + _delete(u) + + Scope out = self.mk_sub(true_name.as_cstr()) + true_name.end() + + # Inc for subsequent names + self.unique++ + + return out ;/ + + # + # Label generation + # + + /; _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) + _recursive_scope_name(~self, ~out) return out ;/ - /; label_start [~uint8] - utils.Vector base = self._base_label() - base.push_cstr("#start\0") - return base.as_cstr() + /; base_label [~uint8] + utils.Vector v = self._base_label() + return v.as_cstr() ;/ - /; label_rep [~uint8] - utils.Vector base = self._base_label() - base.push_cstr("#rep\0") - return base.as_cstr() + /; place_base_label + ~uint8 bl = self.base_label() + self.cb`.add_c(bl) + self.cb`.add_c(":\n\0") + _delete(bl) ;/ - /; label_end [~uint8] - utils.Vector base = self._base_label() - base.push_cstr("#end\0") - return base.as_cstr() + /; start_label [~uint8] + utils.Vector v = self._base_label() + v.push_cstr("#start\0") + return v.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() + /; place_start_label + ~uint8 sl = self.start_label() + self.cb`.add_c(sl) + self.cb`.add_c(":\n\0") + _delete(sl) ;/ - /; 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() + /; rep_label [~uint8] + utils.Vector v = self._base_label() + v.push_cstr("#rep\0") + return v.as_cstr() ;/ - /; label_bool_adv - self.next_bool++ + /; place_rep_label + ~uint8 rl = self.rep_label() + self.cb`.add_c(rl) + self.cb`.add_c(":\n\0") + _delete(rl) ;/ - /; 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 + /; end_label [~uint8] + utils.Vector v = self._base_label() + v.push_cstr("#end\0") + return v.as_cstr() + ;/ - return out + /; place_end_label + ~uint8 el = self.end_label() + self.cb`.add_c(el) + self.cb`.add_c(":\n\0") + _delete(el) ;/ ;/ |