From a79a6d8f9be059b2bf2c1fc6548592546322f53d Mon Sep 17 00:00:00 2001 From: Kai Gunger Date: Sun, 14 Jun 2026 03:24:29 -0400 Subject: [tnslc] string literal gen in func scope --- tnslc/compile/function.tnsl | 57 ++++++++++++++++++++++------------------- tnslc/compile/scope.tnsl | 6 ++--- tnslc/compile/var.tnsl | 25 +++++------------- tnslc/test.tnsl | 16 +++++------- tnslc/utils/c_wrap_linux.tnsl | 8 +++--- tnslc/utils/c_wrap_windows.tnsl | 8 +++--- 6 files changed, 54 insertions(+), 66 deletions(-) (limited to 'tnslc') 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) ;/ -- cgit v1.2.3