UNPKG

@effectful/transducers-loose

Version:

@effectful/transducers built with faster generators

397 lines (396 loc) 12.7 kB
"use strict"; exports.__esModule = true; exports.default = void 0; var _core = require("../core"); var Kit = require("../kit"); var M = require("@effectful/es-rt/opts/loose"); var _default = exports.default = Kit.pipe(Kit.wrap("instrumentation", function (s) { var curId, src, walk = function walk1(pn, fv) { var i, n, nm, sn, ln, id, nl, lab, j, expr, _walk = M.generator(), loop, r, p; _walk.step = walk_1; _walk.$step = 3; return _walk; function walk_1(p) { var a, b, c; for (;;) { switch (_walk.$cur = _walk.$step) { case 3: loop = M.iterator(s.sub()); _walk.$step = 4; _walk.$step = 4; continue; case 4: if (!(loop = loop.step()).done) { i = loop.value; switch (i.type) { case _core.Tag.Identifier: //TODO: needs checking if arguments variable not in scope if (fv != null && i.pos !== _core.Tag.key && i.pos !== _core.Tag.property && i.value.node.name === "arguments") { fv.hasArgs = true; Kit.skip(s.copy(i)); a = s.tok(i.pos, _core.Tag.Identifier, { node: { name: "e$y$arguments" } }); _walk.$step = 4; _walk.value = a; return _walk; } else { _walk.$step = 23; _walk.$step = 23; continue; } case _core.Tag.ThisExpression: if (fv) { fv.hasThis = true; Kit.skip(s.copy(i)); b = s.tok(i.pos, _core.Tag.Identifier, { node: { name: "e$y$this" } }); _walk.$step = 4; _walk.value = b; return _walk; } else { _walk.$step = 4; _walk.$step = 4; continue; } case _core.Tag.Class: case _core.Tag.ClassDeclaration: if (i.enter) { if (i.value.node.id != null) { _walk.$step = 5; _walk.value = i; return _walk; } else { _walk.$step = 23; _walk.$step = 23; continue; } } else { _walk.$step = 23; _walk.$step = 23; continue; } case _core.Tag.FunctionDeclaration: case _core.Tag.FunctionExpression: case _core.Tag.ObjectMethod: case _core.Tag.ClassMethod: case _core.Tag.ArrowFunctionExpression: if (i.enter) { n = i.value.node; if (Kit.hasAnnot(n, "@NOPROF")) { _walk.$step = 23; _walk.$step = 23; continue; } else { nm = void 0; sn = void 0; ln = "?"; id = n.id || n.key; if (id != null && id.name != null) { sn = id.name; } else { sn = `F${curId++}`; } nl = pn.concat(sn); nm = nl.join("."); nm += "@" + src; if (n.loc != null) { ln = `${n.loc.start.line}[${n.loc.start.column}]`; } lab = s.label(); c = s.peel(i); _walk.$step = 6; _walk.value = c; return _walk; } } else { _walk.$step = 23; _walk.$step = 23; continue; } default: _walk.$step = 23; _walk.$step = 23; continue; } } else { _walk.$step = 0; _walk.value = void 0; _walk.done = true; return _walk; } case 5: a = walk(pn.concat([i.value.node.id.name])); _walk.$step = 4; return _walk.$delegate(a); case 6: a = s.findPos(_core.Tag.body); _walk.$step = 7; return _walk.$delegate(a); case 7: j = p; expr = j.type !== _core.Tag.BlockStatement; if (expr) { i.value.node.expression = false; a = s.enter(_core.Tag.body, _core.Tag.BlockStatement); _walk.$step = 8; _walk.value = a; return _walk; } else { b = s.peel(j); _walk.$step = 9; _walk.value = b; return _walk; } case 8: a = s.enter(_core.Tag.body, _core.Tag.Array); _walk.$step = 10; _walk.value = a; return _walk; case 9: a = s.peelTo(_core.Tag.body); _walk.$step = 10; return _walk.$delegate(a); case 10: a = s.enter(_core.Tag.push, _core.Tag.ReturnStatement); _walk.$step = 11; _walk.value = a; return _walk; case 11: a = s.enter(_core.Tag.argument, _core.Tag.CallExpression); _walk.$step = 12; _walk.value = a; return _walk; case 12: a = s.tok(_core.Tag.callee, _core.Tag.Identifier, { node: { name: n.generator ? "e$y$prof$g" : "e$y$prof" } }); _walk.$step = 13; _walk.value = a; return _walk; case 13: a = s.enter(_core.Tag.arguments, _core.Tag.Array); _walk.$step = 14; _walk.value = a; return _walk; case 14: a = s.tok(_core.Tag.push, _core.Tag.StringLiteral, { node: { value: nm } }); _walk.$step = 15; _walk.value = a; return _walk; case 15: a = s.tok(_core.Tag.push, _core.Tag.StringLiteral, { node: { value: ln } }); _walk.$step = 16; _walk.value = a; return _walk; case 16: a = s.enter(_core.Tag.push, _core.Tag.FunctionExpression, { node: { params: [], generator: n.generator } }); _walk.$step = 17; _walk.value = a; return _walk; case 17: n.generator = false; a = s.enter(_core.Tag.body, _core.Tag.BlockStatement); _walk.$step = 18; _walk.value = a; return _walk; case 18: a = s.enter(_core.Tag.body, _core.Tag.Array); _walk.$step = 19; _walk.value = a; return _walk; case 19: if (expr) { a = s.enter(_core.Tag.push, _core.Tag.ReturnStatement); _walk.$step = 20; _walk.value = a; return _walk; } else { _walk.$step = 21; _walk.$step = 21; continue; } case 20: a = s.peel(Kit.setPos(j, _core.Tag.argument)); _walk.$step = 21; _walk.value = a; return _walk; case 21: a = walk(nl, i.value); _walk.$step = 22; return _walk.$delegate(a); case 22: a = lab(); _walk.$step = 4; return _walk.$delegate(a); case 23: _walk.$step = 4; _walk.value = i; return _walk; case 0: _walk.$step = 0; _walk.value = p; _walk.done = true; return _walk; case 1: _walk.$step = 0; throw p; case 2: return _walk.$redir(p); default: throw new Error("invalid state"); } } } }; curId = 0; src = s.opts.file && s.opts.file.filenameRelative || "?"; return walk([]); }), Array.from, //TODO: common pass Kit.wrap("instrumentation-spec-vars", function (s) { var walk = function walk1() { var i, lab, _walk = M.generator(), loop, r, p; _walk.step = walk_1; _walk.$step = 3; return _walk; function walk_1(p) { var a; for (;;) { switch (_walk.$cur = _walk.$step) { case 3: loop = M.iterator(s.sub()); _walk.$step = 4; _walk.$step = 4; continue; case 4: if (!(loop = loop.step()).done) { i = loop.value; _walk.$step = 5; _walk.value = i; return _walk; } else { _walk.$step = 0; _walk.value = void 0; _walk.done = true; return _walk; } case 5: if (i.enter) { switch (i.type) { case _core.Tag.FunctionDeclaration: case _core.Tag.FunctionExpression: case _core.Tag.ArrowFunctionExpression: case _core.Tag.ClassMethod: case _core.Tag.ObjectMethod: if (i.value.hasThis || i.value.hasArgs) { lab = s.label(); a = s.peelTo(_core.Tag.body); _walk.$step = 6; return _walk.$delegate(a); } else { _walk.$step = 4; _walk.$step = 4; continue; } default: _walk.$step = 4; _walk.$step = 4; continue; } } else { _walk.$step = 4; _walk.$step = 4; continue; } case 6: a = s.peelTo(_core.Tag.body); _walk.$step = 7; return _walk.$delegate(a); case 7: //TODO: uniq names if (i.value.hasThis) { a = s.toks(_core.Tag.push, "const e$y$this = this"); _walk.$step = 8; return _walk.$delegate(a); } else { _walk.$step = 8; _walk.$step = 8; continue; } case 8: if (i.value.hasArgs) { a = s.toks(_core.Tag.push, "const e$y$arguments = arguments"); _walk.$step = 9; return _walk.$delegate(a); } else { _walk.$step = 9; _walk.$step = 9; continue; } case 9: a = walk(true); _walk.$step = 10; return _walk.$delegate(a); case 10: a = lab(); _walk.$step = 4; return _walk.$delegate(a); case 0: _walk.$step = 0; _walk.value = p; _walk.done = true; return _walk; case 1: _walk.$step = 0; throw p; case 2: return _walk.$redir(p); default: throw new Error("invalid state"); } } } }; return walk(false); }));