diff options
| author | Kai Gunger <kgunger12@gmail.com> | 2025-12-07 18:32:35 -0500 |
|---|---|---|
| committer | Kai Gunger <kgunger12@gmail.com> | 2025-12-07 18:32:35 -0500 |
| commit | daedfe9e1684ae855e2a4cf21249e1274ff8484d (patch) | |
| tree | 6cacc8e364efb9b1472dfeb48a02bd37e1866634 /tnslc/compile/scope.tnsl | |
| parent | 9e8e52bf43b325ab636fc4de81acc89eb17a2c1d (diff) | |
| parent | 17620a6aae801ff22e8eb6a95b30f6e830742542 (diff) | |
Merge branch 'origin' of cshift.net:git/tnsl-lang into origin
Diffstat (limited to 'tnslc/compile/scope.tnsl')
| -rw-r--r-- | tnslc/compile/scope.tnsl | 63 |
1 files changed, 61 insertions, 2 deletions
diff --git a/tnslc/compile/scope.tnsl b/tnslc/compile/scope.tnsl index 69e445c..7dcf0ea 100644 --- a/tnslc/compile/scope.tnsl +++ b/tnslc/compile/scope.tnsl @@ -5,8 +5,7 @@ struct Scope { ~Scope parent, - utils.Vector - vars, + utils.Vector vars, int unique } @@ -62,6 +61,66 @@ struct Scope { ;/ # + # 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 + ;/ + + /; _next_stack_slot [uint] + uint out = 0 + /; if (self.parent !== NULL) + 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 + + /; 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() + ;/ + + self.vars.push(~out) + ;/ + + # # Sub scope # |