struct Scope { ~uint8 name, ~Module mod, ~CompBuf cb, ~Scope parent, utils.Vector vars, 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) ;/ /; _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) ~Var v /; loop (int i = 0; i < self.vars.count) [i++] v = self.vars.get(i) v`.end() ;/ self.vars.end() ;/ # # 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) _recursive_scope_name(~self, ~out) return out ;/ /; base_label [~uint8] utils.Vector v = self._base_label() return v.as_cstr() ;/ /; place_base_label ~uint8 bl = self.base_label() self.cb`.add_c(bl) self.cb`.add_c(":\n\0") _delete(bl) ;/ /; start_label [~uint8] utils.Vector v = self._base_label() v.push_cstr("#start\0") return v.as_cstr() ;/ /; place_start_label ~uint8 sl = self.start_label() self.cb`.add_c(sl) self.cb`.add_c(":\n\0") _delete(sl) ;/ /; rep_label [~uint8] utils.Vector v = self._base_label() v.push_cstr("#rep\0") return v.as_cstr() ;/ /; place_rep_label ~uint8 rl = self.rep_label() self.cb`.add_c(rl) self.cb`.add_c(":\n\0") _delete(rl) ;/ /; end_label [~uint8] utils.Vector v = self._base_label() v.push_cstr("#end\0") return v.as_cstr() ;/ /; place_end_label ~uint8 el = self.end_label() self.cb`.add_c(el) self.cb`.add_c(":\n\0") _delete(el) ;/ ;/