From d533dc560cf422043069feeb741b6f85579748b6 Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Mon, 22 Feb 2016 13:36:29 -0500 Subject: eshtrans/backend: Add support for static vars and functions --- (limited to 'eshtrans/backend/codegen.esh') diff --git a/eshtrans/backend/codegen.esh b/eshtrans/backend/codegen.esh index a9c3cef..e257990 100644 --- a/eshtrans/backend/codegen.esh +++ b/eshtrans/backend/codegen.esh @@ -19,6 +19,8 @@ # . sc= +tu_id= +static_fn_n= sgetc() { @@ -26,13 +28,30 @@ sgetc() sc="${sc%.}" } +add_static_fn() +{ + local fn="${1}" + + printf '__%s_static_fns="${__%s_static_fns} %s:__%s_fn%d"\n' \ + "${tu_id}" "${tu_id}" "${fn}" ${static_fn_n} + printf '__%s_fn%d' "${tu_id}" ${static_fn_n} + static_fn_n=$((${static_fn_n} + 1)) +} + codegen_sub() { local array="${1}" shift 1 local ionum= + local static= + local static_fname= + local fname= ionum=false + static=false + static_fname=false + fname='' + IFS="${RS}" for t in ${array}; do if ${ionum}; then @@ -43,7 +62,43 @@ codegen_sub() esac ionum=false fi + + # State machine for static variables and functions + case "${t%${US}*}" in + T_STATIC) + static=true + continue + ;; + esac + if ${static}; then + static=false + case "${t%${US}*}" in + T_FNAME) + static_fname=true + fname="${t}" + continue + ;; + *) + toktext T_STATIC + printf ' ' + ;; + esac + elif ${static_fname}; then + static_fname=false + case "${t%${US}*}" in + T_LPAREN) + add_static_fn "${fname#*${US}}" + ;; + *) + toktext T_STATIC + printf ' ' + toktext "${fname}" + ;; + esac + fi + toktext "${t}" + case "${t%${US}*}" in T_NEWLINE|T_LPAREN) # Indenting lines can mess up here-documents. @@ -119,3 +174,11 @@ sh_set_tu_id() return 0 } + +sh_start_tu() +{ + printf '__tu=%s\n' "${tu_id}" + printf '__%s_static_vars=\n' "${tu_id}" + printf '__%s_static_fns=\n' "${tu_id}" + static_fn_n=0 +} -- cgit v0.9.1