diff options
| author | Kyle Gunger <kgunger12@gmail.com> | 2022-12-15 16:52:01 -0500 | 
|---|---|---|
| committer | Kyle Gunger <kgunger12@gmail.com> | 2022-12-15 16:52:01 -0500 | 
| commit | ffe718d1eb8e451ffdaf3259d2c919d5d445bf5e (patch) | |
| tree | e860259a46b979f6af7833acb53a6df5ebca3d96 /tnslc | |
| parent | aa5db10e7b653d9f6c3bda0c55b770f1f66a922f (diff) | |
is_call and get_function_label
Diffstat (limited to 'tnslc')
| -rw-r--r-- | tnslc/compile/compile.tnsl | 45 | 
1 files changed, 41 insertions, 4 deletions
| diff --git a/tnslc/compile/compile.tnsl b/tnslc/compile/compile.tnsl index 921e6cd..14916b5 100644 --- a/tnslc/compile/compile.tnsl +++ b/tnslc/compile/compile.tnsl @@ -446,14 +446,34 @@  	;/  ;/ +/; get_function_label(~int cur, ~{}Token data) [{}charp] +	/; if (string_equate(data`{cur` + 1}.data`, "(")) +		;return data`{cur`}.data` +	;/ + +	;{}{}charp func_path = {} + +	/; loop (cur` < len data`) [cur`++] +		/; if (token_is(cur, data, "(")) +			;break +		;; else if (!token_is(cur, data, ".")) +			;func_path.append(data`{cur`}.data`) +		;/ +	;/ +	;{}charp out = "_." +	;{}charp jn_tmp = join(func_path, '.') +	;add_strings(~out, ~jn_tmp) +	;return out +;/ +  # Sets up a call and reports back where the return value is stored  /; eval_call (~int cur, ~{}Token data, ~VTrack tab, gsc, ~{}charp hsec, csec, dsec) [{}charp]  		# Store the name of the function we are calling -	;{}charp to_call = data`{cur`}.data` - +	;{}charp to_call = get_function_label(cur, data) +	;tnsl.io.println(to_call)  		# Set read head to first parameter -	;cur` = cur` + 2 +	;cur`++  	;int reg = 0  	/; loop (!token_is(cur, data, ")"))  		/; if (token_is(cur, data, ",")) @@ -468,6 +488,7 @@  			;/  		;/  	;/ +	;cur`++  	;{}charp call_ist = call_asm(to_call) @@ -506,6 +527,22 @@  	;add_strings(csec, ~tmp)  ;/ +/; is_call (~int cur, ~{}Token data) [bool] +	;bool look_def = true +	/; loop (int i = cur`; i < len data`) [i++] +		/; if (look_def && data`{i}.token_type == TOKEN_TYPE.DEFWORD) +			;look_def = false +		;; else if (!look_def && token_is(~i, data, ".")) +			;look_def = true +		;; else if (!look_def && token_is(~i, data, "(")) +			;return true +		;; else +			;break +		;/ +	;/ +	;return false +;/ +  # Compile a statement in a function  /; compile_statement (~int cur, ~{}Token data, ~VTrack tab, gsc, ~{}charp hsec, csec, dsec) [bool]  	;cur`++ @@ -527,7 +564,7 @@  			;tail_guard(csec)  			;add_strings(csec, ~(tnslc.COMMON_ASM{0}))  			;return true -		;; else if (string_equate(data`{cur`+1}.data`, "(")) +		;; else if (is_call(cur, data))  			# Function call  			;eval_call(cur, data, tab, gsc, hsec, csec, dsec)  		;; else if (name_to_index(data`{cur`}.data`, tab) !< 0) |