@effectful/transducers-loose
Version:
@effectful/transducers built with faster generators
397 lines (396 loc) • 12.7 kB
JavaScript
"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);
}));