UNPKG

@fink/loxia

Version:

A fink to JavaScript compiler.

207 lines (180 loc) 5.83 kB
import { _in_ } from "@fink/js-interop/runtime.js"; import { get_value as get_value_0 } from "../ir/context.js"; import { update_value as update_value_0 } from "../ir/context.js"; const set_curr_fn_0 = (curr_fn_0, ctx_0) => { return { ...ctx_0, curr_fn: curr_fn_0 }; }; const get_curr_fn_0 = ctx_1 => { const hdm_0 = ctx_1.curr_fn; return undefined === hdm_0 ? [] : hdm_0; }; const optimize_body_0 = (dlst_0, ctx_2, optimize_tails_0) => { const expr_0 = dlst_0[0]; const val_1 = expr_0.args; const dlst_1 = optimize_tails_0(val_1[1], ctx_2, []); return [[[{ ...expr_0, args: [val_1[0], dlst_1[0]] }, dlst_0[1]]], dlst_1[1]]; }; const optimize_fn_0 = (dlst_2, ctx_3, optimize_tails_1) => { const expr_1 = dlst_2[0]; const val_3 = expr_1.args; const args_5 = val_3[0]; const fn_id_0 = args_5[2]; const prev_curr_fn_0 = get_curr_fn_0(ctx_3); const body_ctx_0 = set_curr_fn_0([fn_id_0, args_5[1]], ctx_3); const dlst_4 = optimize_tails_1(val_3[1], body_ctx_0, []); const o_body_1 = dlst_4[0]; const next_ctx_1 = dlst_4[1]; const value_0 = get_value_0(fn_id_0, next_ctx_1); let ret_3; ret_3: { /* istanbul ignore else */ if (null != value_0) { /* istanbul ignore else */ if (value_0.tco === true) { ret_3 = { ...expr_1, f: `fn`, args: [args_5, o_body_1], tco: true }; /* istanbul ignore next */ break ret_3; } } ret_3 = { ...expr_1, args: [args_5, o_body_1] }; /* istanbul ignore next */ break ret_3; } const opt_0 = ret_3; const end_ctx_0 = set_curr_fn_0(prev_curr_fn_0, next_ctx_1); return [[[opt_0, dlst_2[1]]], end_ctx_0]; }; const optimize_af_0 = (dlst_5, exprs_0, ctx_4) => { const expr_2 = dlst_5[0]; const val_9 = expr_2.args; const callee_id_0 = val_9[0]; const next_expr_0 = exprs_0[0]; const dlst_7 = get_curr_fn_0(ctx_4); const hdm_1 = dlst_7[0]; const curr_fn_id_0 = undefined === hdm_1 ? {} : hdm_1; const item_19 = callee_id_0.i; /* istanbul ignore else */ if (null != [item_19, next_expr_0]) { /* istanbul ignore else */ if (item_19 === curr_fn_id_0.i) { /* istanbul ignore else */ if (null != next_expr_0) { const itm_3 = next_expr_0[0]; /* istanbul ignore else */ if (null != itm_3) { /* istanbul ignore else */ if (itm_3.f === `cc`) { const itm_5 = itm_3.args; /* istanbul ignore else */ if (null != itm_5) { const itm_6 = itm_5[0]; /* istanbul ignore else */ if (null != itm_6) { /* istanbul ignore else */ if (itm_6.i === dlst_7[1].i) { const next_ctx_2 = update_value_0(curr_fn_id_0, { tco: true }, ctx_4); return [[[{ ...expr_2, f: `cf`, args: [callee_id_0, ...val_9.slice(1)] }, []]], exprs_0.slice(1), next_ctx_2]; } } } } } } } } return [[[expr_2, dlst_5[1]]], exprs_0, ctx_4]; }; const optimize_tails_2 = (...args_8) => { optimize_tails_2: do { const dlst_8 = args_8[0]; const hdm_2 = dlst_8[0]; const expr_3 = undefined === hdm_2 ? false : hdm_2; const tail_38 = dlst_8.slice(1); const ctx_5 = args_8[1]; const hdm_3 = args_8[2]; const out_0 = undefined === hdm_3 ? [] : hdm_3; /* istanbul ignore else */ if (expr_3 === false) { return [out_0, ctx_5]; } /* istanbul ignore else */ if (null != expr_3) { const itm_12 = expr_3[0]; /* istanbul ignore else */ if (null != itm_12) { /* istanbul ignore else */ if (itm_12.f === `fn`) { const itm_14 = itm_12.args; /* istanbul ignore else */ if (null != itm_14) { const itm_15 = itm_14[0]; /* istanbul ignore else */ if (null != itm_15) { /* istanbul ignore else */ if (undefined !== itm_15[0]) { /* istanbul ignore else */ if (undefined !== itm_15[1]) { /* istanbul ignore else */ if (undefined !== itm_15[2]) { const dlst_11 = optimize_fn_0(expr_3, ctx_5, optimize_tails_2); args_8 = [tail_38, dlst_11[1], [...out_0, ...dlst_11[0]]]; continue optimize_tails_2; } } } } } } } } /* istanbul ignore else */ if (null != expr_3) { const itm_10 = expr_3[0]; /* istanbul ignore else */ if (null != itm_10) { /* istanbul ignore else */ if (true === _in_(itm_10.f, [`cn`, `fn`])) { const dlst_10 = optimize_body_0(expr_3, ctx_5, optimize_tails_2); args_8 = [tail_38, dlst_10[1], [...out_0, ...dlst_10[0]]]; continue optimize_tails_2; } } } /* istanbul ignore else */ if (null != expr_3) { const itm_8 = expr_3[0]; /* istanbul ignore else */ if (null != itm_8) { /* istanbul ignore else */ if (itm_8.f === `af`) { const dlst_9 = optimize_af_0(expr_3, tail_38, ctx_5); args_8 = [dlst_9[1], dlst_9[2], [...out_0, ...dlst_9[0]]]; continue optimize_tails_2; } } } args_8 = [tail_38, ctx_5, [...out_0, expr_3]]; continue optimize_tails_2; } while (true); }; export const set_curr_fn = set_curr_fn_0, get_curr_fn = get_curr_fn_0, optimize_body = optimize_body_0, optimize_fn = optimize_fn_0, optimize_af = optimize_af_0, optimize_tails = optimize_tails_2;