From aab648543af3d874667041349b1a22ae19dde30b Mon Sep 17 00:00:00 2001 From: Kyle Gunger Date: Mon, 15 May 2023 19:26:57 -0400 Subject: Fix initial struct calling --- tnslc/README.md | 2 +- tnslc/hello.tnsl | 8 ++++++++ tnslc/simple.tnsl | 18 +++++++++--------- tnslc/tnslc.tnsl | 24 +++++++++++++----------- 4 files changed, 31 insertions(+), 21 deletions(-) create mode 100644 tnslc/hello.tnsl diff --git a/tnslc/README.md b/tnslc/README.md index da461e2..e0f9a61 100644 --- a/tnslc/README.md +++ b/tnslc/README.md @@ -11,7 +11,7 @@ Examples: - `./run.sh dummy.tnsl` - Run the compiler on the dummy file - `./run.sh "dummy.tnsl ../libtnsl/libtnsl.tnsl"` - Run the compiler on the dummy file but also link libtnsl -- `.\run.ps1 tnslc_wrapped.tnsl`: Run the compiler on the sample "Hello World" program +- `.\run.ps1 hello.tnsl`: Run the compiler on the sample "Hello World" program ### Credits diff --git a/tnslc/hello.tnsl b/tnslc/hello.tnsl new file mode 100644 index 0000000..8fb98a3 --- /dev/null +++ b/tnslc/hello.tnsl @@ -0,0 +1,8 @@ +:include "c_wrap.tnsl" + +{}uint8 hello = "Hello World!\n\0" + +/; main [int] + _printf(~hello{0}) + return 0 +;/ \ No newline at end of file diff --git a/tnslc/simple.tnsl b/tnslc/simple.tnsl index 5ef7946..1c54577 100644 --- a/tnslc/simple.tnsl +++ b/tnslc/simple.tnsl @@ -2,17 +2,17 @@ {}uint8 str1 = "abcd" struct Stress { - int i + int i, j, k } struct Test { - Stress s + ~Stress s } -/; s_call () [Stress] - Stress a - a.i = 1 - return a +/; s_call (Test t) + t.s`.i = 1 + t.s`.j = 1 + t.s`.i + t.s`.k = t.s`.j + 1 ;/ /; main (int argc, ~~uint argv) [int] @@ -24,11 +24,11 @@ struct Test { Stress test Test stress - test.i = 1 + stress.s = ~test - stress.s = s_call() + s_call(stress) # return 3 - return stress.s.i + return stress.s`.k ;/ diff --git a/tnslc/tnslc.tnsl b/tnslc/tnslc.tnsl index e5b8d94..f75284d 100644 --- a/tnslc/tnslc.tnsl +++ b/tnslc/tnslc.tnsl @@ -1408,12 +1408,12 @@ ;out.data_type = out.data_type.members{i}.data_type ;out.data_type.ptr_chain.append(PTYPE.REFERENCE) - /; if (accum > 0) + /; if (accum > 0) ;data`.csec = string_join( { data`.csec, "\tadd rsi, ", int_to_string(accum), "\n" }, "") - ;/ + ;/ ;return out ;/ @@ -2696,18 +2696,18 @@ ;f = base.data_type.mod`.find_function( {name} ) ;/ ;Variable ctmp = {"#ctmp", NO_TYPE, 0-1, LOCATION.REGISTER} - + ;int old_start = start /; loop (int i = 0; i < len (f.inputs)) [i++] ;Type t = f.mod`.find_type(string_split(f.inputs{i}.name, '.'))` ;t.ptr_chain = f.inputs{i}.ptr_chain ;ctmp.data_type = t /; if (ctmp.is_ref()) - ;ctmp.data_type.ptr_chain{len (ctmp.data_type.ptr_chain)} = PTYPE.POINTER + ;ctmp.data_type.ptr_chain{len (ctmp.data_type.ptr_chain) - 1} = PTYPE.POINTER ;/ ;ctmp.data_type.ptr_chain.append(PTYPE.REFERENCE) - /; if (!(ctmp.is_prim()) || regs > 5) + /; if (!(ctmp.is_prim()) || regs !< 6) ;int layer = 0 ;Variable val = _eval_value(tok, start, _param_end(tok, start), out, mov, current, scope, t, ~layer) ;out`.csec = string_join( { @@ -2716,17 +2716,17 @@ }, "") ;scope`.tmp = scope`.tmp + ctmp.norm_size() ;ctmp.set(val, out) - ;start = _param_end(tok, start) + 1 ;; else ;regs++ ;/ + ;start = _param_end(tok, start) + 1 ;/ ;int regs = 1 /; if (string_equate(base.name, "")) ;regs = 0 ;/ - + ;start = old_start /; loop (int i = 0; i < len (f.inputs)) [i++] ;Type t = f.mod`.find_type(string_split(f.inputs{i}.name, '.'))` ;t.ptr_chain = f.inputs{i}.ptr_chain @@ -2751,10 +2751,10 @@ ;ctmp.set(val, out) ;regs++ - ;start = _param_end(tok, start) + 1 ;; else if (regs == 6) ;break ;/ + ;start = _param_end(tok, start) + 1 ;/ /; if (f.is_method()) @@ -2843,7 +2843,7 @@ ;wk = wk.member(tok`{start` + 1}.data, out) ;start` = start` + 2 ;/ - ;; if (tok`{start`}.cmp("(")) + ;; else if (tok`{start`}.cmp("(")) ;start` = start` - 1 ;; else if (tok`{start`}.cmp("`")) ;log_debug("Pre loop deref") @@ -2898,8 +2898,10 @@ ;scope`.tmp = scope`.tmp + 8 ;/ - ;Function to_call = _setup_call(tok, start`, wk, out, mov, current, scope) - ;wk = _perform_call(to_call, scope, out) + ;Scope call_sc = scope`.new_sub_cf("call") + ;Function to_call = _setup_call(tok, start`, wk, out, mov, current, ~call_sc) + ;wk = _perform_call(to_call, ~call_sc, out) + ;call_sc.clear_tmp(out) /; if (layer` > 2) ;out`.csec = string_join({ -- cgit v1.2.3