@fink/loxia
Version:
A fink to JavaScript compiler.
123 lines (104 loc) • 3.06 kB
JavaScript
const {
_in_
} = require("@fink/js-interop/runtime.js");
const {
reverse: reverse_0
} = require("@fink/std-lib/iter.js");
const {
is_unused: is_unused_0
} = require("../ir/context.js");
const {
dec_refs: dec_refs_0
} = require("../ir/context.js");
const get_ref_args_0 = dlst_0 => {
const drec_0 = dlst_0[0];
const op_0 = drec_0.f;
const args_1 = drec_0.args;
/* istanbul ignore else */
if (true === _in_(op_0, [`int`, `float`, `str`])) {
return [];
}
/* istanbul ignore else */
if (true === _in_(op_0, [`tpl_i`, `tpl_s`])) {
return [args_1[0]];
}
return args_1;
};
const remove_unused_0 = (...args_2) => {
remove_unused_0: do {
const dlst_2 = args_2[0];
const hdm_0 = dlst_2[0];
const expr_0 = undefined === hdm_0 ? false : hdm_0;
const tail_4 = dlst_2.slice(1);
const ctx_0 = args_2[1];
const out_0 = args_2[2];
/* istanbul ignore else */
if (expr_0 === false) {
return [out_0, ctx_0];
}
/* istanbul ignore else */
if (null != expr_0) {
const itm_4 = expr_0[0];
/* istanbul ignore else */
if (null != itm_4) {
/* istanbul ignore else */
if (true === _in_(itm_4.f, [`mod`, `imp`, `af`, `ac`, `cc`, `cif`, `cf`])) {
args_2 = [tail_4, ctx_0, [expr_0, ...out_0]];
continue remove_unused_0;
}
}
}
/* istanbul ignore else */
if (null != expr_0) {
const itm_2 = expr_0[1];
/* istanbul ignore else */
if (null != itm_2) {
const val_6 = is_unused_0(itm_2[0], ctx_0);
/* istanbul ignore else */
if (true === val_6) {
const args_4 = get_ref_args_0(expr_0);
const next_ctx_1 = dec_refs_0(args_4, ctx_0);
args_2 = [tail_4, next_ctx_1, out_0];
continue remove_unused_0;
}
}
}
/* istanbul ignore else */
if (null != expr_0) {
const itm_0 = expr_0[0];
/* istanbul ignore else */
if (null != itm_0) {
/* istanbul ignore else */
if (true === _in_(itm_0.f, [`fn`, `cn`])) {
const drec_1 = expr_0[0];
const key_7 = `f`;
const key_8 = `args`;
const val_3 = drec_1.args;
const {
f: _key_7,
args: _key_8,
...rest_0
} = drec_1;
const rbody_0 = reverse_0(val_3[1]);
const dlst_4 = remove_unused_0(rbody_0, ctx_0, []);
args_2 = [tail_4, dlst_4[1], [[{
f: drec_1.f,
args: [val_3[0], dlst_4[0]],
...rest_0
}, expr_0[1]], ...out_0]];
continue remove_unused_0;
}
}
}
args_2 = [tail_4, ctx_0, [expr_0, ...out_0]];
continue remove_unused_0;
} while (true);
};
const optimize_unused_0 = (exprs_1, ctx_1) => {
const rexprs_0 = reverse_0(exprs_1);
const result_18 = remove_unused_0(rexprs_0, ctx_1, []);
return result_18;
};
exports.get_ref_args = get_ref_args_0;
exports.remove_unused = remove_unused_0;
exports.optimize_unused = optimize_unused_0;