summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Gunger <kgunger12@gmail.com>2026-06-14 03:24:29 -0400
committerKai Gunger <kgunger12@gmail.com>2026-06-14 03:24:29 -0400
commita79a6d8f9be059b2bf2c1fc6548592546322f53d (patch)
treedb99ee1b932c2e668929c02098fd5c78e0ee6cb6
parent20b9f5a8418670665ff5c5d3f5de538d35ec161b (diff)
[tnslc] string literal gen in func scopedevel
-rw-r--r--tnslc/compile/function.tnsl57
-rw-r--r--tnslc/compile/scope.tnsl6
-rw-r--r--tnslc/compile/var.tnsl25
-rw-r--r--tnslc/test.tnsl16
-rw-r--r--tnslc/utils/c_wrap_linux.tnsl8
-rw-r--r--tnslc/utils/c_wrap_windows.tnsl8
6 files changed, 54 insertions, 66 deletions
diff --git a/tnslc/compile/function.tnsl b/tnslc/compile/function.tnsl
index 4947d75..29ec748 100644
--- a/tnslc/compile/function.tnsl
+++ b/tnslc/compile/function.tnsl
@@ -239,7 +239,7 @@ struct Function {
set = set - 1
ptc` = set
;/
- out.mk_set_var(in)
+ out.mk_set_var(in, in)
;/
return out
@@ -844,11 +844,7 @@ struct Function {
/; if (sub`.sub.count > 0)
sub = sub`.sub.get(0)
Var val = self._compile_value(s, sub)
- # Need var name correct
- _delete(val.name)
- ~uint8 name = utils.strcpy(v`.name)
- val.name = name
- s`.mk_set_var(~val)
+ s`.mk_set_var(v, ~val)
val.end()
;; else
s`.mk_var(v)
@@ -1664,6 +1660,7 @@ struct Function {
# If we are setting
/; if (utils.strcmp(n`.data, "=\0") == true)
Var lhs = self._compile_value(s, lhn)
+ lhs._print(0)
/; if (s`.is_tmp(~lhs) == true)
s`.free_after(~lhs, true)
@@ -1828,19 +1825,22 @@ struct Function {
uint8 val = utils.unquote_cha(dat)
out.offset = val
;; else if (n`.data{0} == '\"')
- ~Struct t = self._find_literal_type(s, "uint8\0")
~uint8 dlab = s`.gen_const_name()
- out._init(t)
- _delete(out.name)
- out.name = dlab
- out.ptr_push(1)
+ utils.Vector vout = utils.unquote_str(n`.data)
+
+ # Data label (array)
~CompBuf buf = s`.cb
buf`.add_d(dlab)
- buf`.add_d(":\n db \0")
+ buf`.add_d(":\n dq \0")
- utils.Vector vout = utils.unquote_str(n`.data)
+ # Initial data gen (size)
+ ~uint8 tmp = utils.int_to_str(vout.count)
+ buf`.add_d(tmp)
+ buf`.add_d("\n db \0")
+ _delete(tmp)
+ # Initial data gen (string)
/; loop (int i = 1; i < vout.count) [i++]
~uint8 uptr = vout.get(i - 1)
uint8 utmp = uptr`
@@ -1850,6 +1850,7 @@ struct Function {
_delete(tmp)
;/
+ # Finish data gen (string)
/; if (vout.count > 0)
int i = vout.count
~uint8 uptr = vout.get(i - 1)
@@ -1862,21 +1863,25 @@ struct Function {
;/
buf`.add_d("\n\0")
-
- # Generate response text
vout.end()
- tmp = self._global_ptr()
- vout.from_cstr(" dq \0")
- vout.push_cstr(tmp)
- _delete(tmp)
- int idx = self.ptrc.count - 1
- idx = idx - depth
- ~int32 pc = self.ptrc.get(idx)
- /; if (pc` < 1)
- vout.push_cstr(" + 8\0")
- ;/
- vout.push_cstr("\n\0")
+ # Generate ptr to data
+ vout.from_cstr(dlab)
+ vout.push_cstr("#ptr\0")
+ tmp = vout.as_cstr()
+ buf`.add_d(tmp)
+ buf`.add_d(":\n dq \0")
+ buf`.add_d(dlab)
+ buf`.add_d(" + 8\n\0")
+
+ ~Struct t = self._find_literal_type(s, "uint8\0")
+ out._init(t)
+ _delete(out.name)
+ out.name = vout.as_cstr()
+ out.ptr_push(1)
+ out.loc = out.loc - 2
+
+ _delete(dlab)
;; else
~Struct t = self._find_literal_type(s, "int\0")
diff --git a/tnslc/compile/scope.tnsl b/tnslc/compile/scope.tnsl
index 35f6b8b..dda3d9c 100644
--- a/tnslc/compile/scope.tnsl
+++ b/tnslc/compile/scope.tnsl
@@ -334,7 +334,7 @@ struct Scope {
return v
;/
- /; mk_set_var (~Var src) [~Var]
+ /; mk_set_var (~Var src, ~Var set) [~Var]
~Var v = self.mk_var(src)
/; if (v == NULL)
@@ -344,9 +344,9 @@ struct Scope {
/; if (v`.is_ref() == true)
int rc = v`.max_ref()
rc = rc - 1
- v`.set_ref(self.cb, src, rc)
+ v`.set_ref(self.cb, set, rc)
;; else
- v`.set(self.cb, src)
+ v`.set(self.cb, set)
;/
return v
diff --git a/tnslc/compile/var.tnsl b/tnslc/compile/var.tnsl
index 3ec7e8d..a840437 100644
--- a/tnslc/compile/var.tnsl
+++ b/tnslc/compile/var.tnsl
@@ -276,6 +276,7 @@ struct Var {
return 0
;/
+ idx++
int count = self.ptrc.count - idx
~int32 out = self.ptrc.get(count)
return out`
@@ -1170,24 +1171,6 @@ struct Var {
~uint8 out = self._set_prim_l(buf)
- /; if (self.in_mem() == true)
- utils.Vector vout
- uint ts = self.type_size()
- /; if (ts == 1)
- vout.from_cstr("byte \0")
- ;; else if (ts == 2)
- vout.from_cstr("word \0")
- ;; else if (ts == 4)
- vout.from_cstr("dword \0")
- ;; else if (ts == 8)
- vout.from_cstr("qword \0")
- ;/
- vout.push_cstr(out)
-
- _delete(out)
- out = vout.as_cstr()
- ;/
-
# Sign extend if required
bool ext = false
uint R = self.type_size()
@@ -1746,7 +1729,8 @@ struct Var {
self.offset++
return
;/
-
+
+ self._print(0)
/; if (self.first_non_ref() < 0)
int idx = self.first_non_ref_idx()
Var vv
@@ -1927,6 +1911,9 @@ struct Var {
istr = self.ptrc.get(i)
_print_num("%d \0", istr`)
;/
+ /; if (self.ptrc.count < 1)
+ _printf("(nil)\0")
+ ;/
_printf("\n\0")
_indent(idt + 1)
diff --git a/tnslc/test.tnsl b/tnslc/test.tnsl
index 896897e..77e1777 100644
--- a/tnslc/test.tnsl
+++ b/tnslc/test.tnsl
@@ -1,16 +1,12 @@
-/; five [int]
- return 5
+/; get_first (~uint8 str) [uint8]
+ return str{0}
;/
/; main (int argc, ~~uint8 argv) [int]
- # Mov input from C
- asm "mov r10, rdi"
- asm "mov r11, rsi"
+ int a, b
+ get_first(a + b, 1)
- /; if (argc < 5 && argc > 1)
- return argc
- ;/
-
- return five()
+ return get_first("1234")
;/
+
diff --git a/tnslc/utils/c_wrap_linux.tnsl b/tnslc/utils/c_wrap_linux.tnsl
index 97a93ba..71a5b47 100644
--- a/tnslc/utils/c_wrap_linux.tnsl
+++ b/tnslc/utils/c_wrap_linux.tnsl
@@ -1,9 +1,9 @@
# Must be included at the top of the file
asm "extern malloc, realloc, free, printf, putchar, open, close, read, write, lseek, perror"
-{}uint8 _alert = "Alert!\n\0"
-{}uint8 _dec = "%d\n\0"
-{}uint8 _ptr = "%p\n\0"
+~uint8 _alert = "Alert!\n\0"
+~uint8 _dec = "%d\n\0"
+~uint8 _ptr = "%p\n\0"
~void NULL = 0
@@ -275,5 +275,5 @@ asm "extern malloc, realloc, free, printf, putchar, open, close, read, write, ls
;/
/; print_alert
- _printf(~_alert{0})
+ _printf(_alert)
;/
diff --git a/tnslc/utils/c_wrap_windows.tnsl b/tnslc/utils/c_wrap_windows.tnsl
index 577ca25..839c976 100644
--- a/tnslc/utils/c_wrap_windows.tnsl
+++ b/tnslc/utils/c_wrap_windows.tnsl
@@ -10,9 +10,9 @@ asm "extern ReadFile"
asm "extern WriteFile"
asm "extern CloseHandle"
-{}uint8 _alert = "Alert!\n\0"
-{}uint8 _dec = "%d\n\0"
-{}uint8 _ptr = "%p\n\0"
+~uint8 _alert = "Alert!\n\0"
+~uint8 _dec = "%d\n\0"
+~uint8 _ptr = "%p\n\0"
/; _alloc (uint size) [~void]
~void out
@@ -280,5 +280,5 @@ asm "extern CloseHandle"
;/
/; print_alert
- _printf(~_alert{0})
+ _printf(_alert)
;/