summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Gunger <kgunger12@gmail.com>2025-12-29 00:12:15 -0500
committerKai Gunger <kgunger12@gmail.com>2025-12-29 00:12:15 -0500
commit3a98cbd4d96041e78cb8748d674e9d5ea311054e (patch)
tree96f5758082dcc8e1d778a14281675fe945a96298
parent053876f61cc07c0d4a57b7b64a85e6b5fc23509a (diff)
find existing uninitialized instead of copying new
-rw-r--r--tnslc/compile/scope.tnsl41
-rw-r--r--tnslc/compile/var.tnsl1
-rw-r--r--tnslc/test.tnsl20
3 files changed, 28 insertions, 34 deletions
diff --git a/tnslc/compile/scope.tnsl b/tnslc/compile/scope.tnsl
index 4b36932..900d626 100644
--- a/tnslc/compile/scope.tnsl
+++ b/tnslc/compile/scope.tnsl
@@ -134,12 +134,13 @@ struct Scope {
# Part 1: Add var
Var v
v.init(tp, n`.data)
+ v._resolve_type(self.mod)
# TODO: Make sure this works properly
/; if (v.regable() == true)
- v.loc = 0 - 1
- ;; else
v.loc = 1
+ ;; else
+ v.loc = 0 - 1
;/
v.offset = 0
@@ -164,7 +165,9 @@ struct Scope {
/; loop (int i = 0; i < self.vars.count) [i++]
v = self.vars.get(i)
/; if (utils.strcmp(v`.name, name) == true)
- return v
+ /; if (v`.loc > 1 || v`.offset !== 0)
+ return v
+ ;/
;/
;/
@@ -176,28 +179,32 @@ struct Scope {
;/
/; mk_set_var (~Var src)
- Var out = src`.copy()
+ ~Var v = self.find_var(src`.name)
- /; if (src`.regable() == true)
- out.loc = self._next_reg_slot()
- /; if (out.loc + 1 == 0)
- out.offset = self._next_stack_slot()
+ /; if (v == NULL)
+ return
+ ;/
+
+ /; if (v`.loc == 1)
+ v`.loc = self._next_reg_slot()
+ /; if (v`.loc + 1 == 0)
+ v`.offset = self._next_stack_slot()
+ ;/
+ ;; else if (v`.loc + 1 == 0)
+ /; if (v`.offset == 0)
+ v`.loc = 0 - 1
+ v`.offset = self._next_stack_slot()
;/
- ;; else
- out.loc = 0 - 1
- out.offset = self._next_stack_slot()
;/
- ~int32 p = out.top_ptrc()
+ ~int32 p = v`.top_ptrc()
/; if (p == NULL)
- out.set(self.cb, src)
+ v`.set(self.cb, src)
;; else if (p` == 0)
- out.set_ref(self.cb, src)
+ v`.set_ref(self.cb, src)
;; else
- out.set(self.cb, src)
+ v`.set(self.cb, src)
;/
-
- self.vars.push(~out)
;/
#
diff --git a/tnslc/compile/var.tnsl b/tnslc/compile/var.tnsl
index 0dc0586..3bf8b5e 100644
--- a/tnslc/compile/var.tnsl
+++ b/tnslc/compile/var.tnsl
@@ -174,6 +174,7 @@ struct Var {
self.ptrc.push(~ptr)
;/
+ # Whether the variable can be stored within a register
/; regable [bool]
~int p
/; loop (int i = 0; i < self.ptrc.count) [i++]
diff --git a/tnslc/test.tnsl b/tnslc/test.tnsl
index 59b337a..94c36f2 100644
--- a/tnslc/test.tnsl
+++ b/tnslc/test.tnsl
@@ -1,20 +1,6 @@
-struct str {
- ~uint8 a
-}
-
-/; method str
- /; str_get() [~uint8]
- return a
- ;/
-;/
-
-/; module moda
- /; method str
- /; str_set(~uint8 a)
- self.a = a
- ;/
- ;/
+/; main [int]
+ int a = 0
+ return a
;/
-