summaryrefslogtreecommitdiff
path: root/tnslc/compile/scope.tnsl
diff options
context:
space:
mode:
authorKai Gunger <kgunger12@gmail.com>2025-12-07 18:32:35 -0500
committerKai Gunger <kgunger12@gmail.com>2025-12-07 18:32:35 -0500
commitdaedfe9e1684ae855e2a4cf21249e1274ff8484d (patch)
tree6cacc8e364efb9b1472dfeb48a02bd37e1866634 /tnslc/compile/scope.tnsl
parent9e8e52bf43b325ab636fc4de81acc89eb17a2c1d (diff)
parent17620a6aae801ff22e8eb6a95b30f6e830742542 (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.tnsl63
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
#