| | |
| | | let processed = state.get("processed"); |
| | | |
| | | if (!processed) { |
| | | processed = new Map(); |
| | | processed = new WeakSet(); |
| | | state.set("processed", processed); |
| | | } |
| | | |
| | |
| | | // identity`a${0}` |
| | | |
| | | |
| | | const template = t.taggedTemplateExpression(identity, t.templateLiteral(path.node.quasi.quasis, expressions.map(() => t.numericLiteral(0)))); |
| | | processed.set(template, true); // Install an inline cache at the callsite using the global variable: |
| | | const template = t.taggedTemplateExpression(t.cloneNode(identity), t.templateLiteral(path.node.quasi.quasis, expressions.map(() => t.numericLiteral(0)))); |
| | | processed.add(template); // Install an inline cache at the callsite using the global variable: |
| | | // _t || (_t = identity`a${0}`) |
| | | |
| | | const ident = path.scope.getProgramParent().generateDeclaredUidIdentifier("t"); |
| | | path.scope.getBinding(ident.name).path.parent.kind = "let"; |
| | | const inlineCache = t.logicalExpression("||", ident, t.assignmentExpression("=", ident, template)); // The original tag function becomes a plain function call. |
| | | const inlineCache = t.logicalExpression("||", ident, t.assignmentExpression("=", t.cloneNode(ident), template)); // The original tag function becomes a plain function call. |
| | | // The expressions omitted from the cached Strings tag are directly applied as arguments. |
| | | // tag(_t || (_t = Object`a${0}`), 'hello') |
| | | |