@fink/loxia
Version:
A fink to JavaScript compiler.
207 lines (180 loc) • 5.83 kB
JavaScript
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;