Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Back parser state exportedIdentifiers by set #13406

Merged
merged 3 commits into from Jun 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
@@ -0,0 +1,34 @@
import Benchmark from "benchmark";
import baseline from "@babel-baseline/parser";
import current from "../../lib/index.js";
import { report } from "../util.mjs";

const suite = new Benchmark.Suite();
// All codepoints in [0x4e00, 0x9ffc] are valid identifier name per Unicode 13
function createInput(length) {
if (length > 0x9ffc - 0x4e00) {
throw new Error(
`Length greater than ${
0x9ffc - 0x4e00
} is not supported! Consider modify the \`createInput\`.`
);
}
let source = "export { ";
for (let i = 0; i < length; i++) {
source += String.fromCharCode(0x4e00 + i) + ",";
}
return source + " } from './foo'";
}
function benchCases(name, implementation, options) {
for (const length of [256, 512, 1024, 2048]) {
const input = createInput(length);
suite.add(`${name} ${length} length-1 named export`, () => {
implementation.parse(input, options);
});
}
}

benchCases("baseline", baseline, { sourceType: "module" });
benchCases("current", current, { sourceType: "module" });

suite.on("cycle", report).run();
2 changes: 1 addition & 1 deletion packages/babel-parser/package.json
Expand Up @@ -33,7 +33,7 @@
"node": ">=6.0.0"
},
"devDependencies": {
"@babel-baseline/parser": "npm:@babel/parser@^7.14.0",
"@babel-baseline/parser": "npm:@babel/parser@^7.14.4",
"@babel/code-frame": "workspace:*",
"@babel/helper-fixtures": "workspace:*",
"@babel/helper-validator-identifier": "workspace:*",
Expand Down
3 changes: 3 additions & 0 deletions packages/babel-parser/src/parser/base.js
Expand Up @@ -18,6 +18,9 @@ export default class BaseParser {
declare expressionScope: ExpressionScopeHandler;
declare plugins: PluginsMap;
declare filename: ?string;
// Names of exports store. `default` is stored as a name for both
// `export default foo;` and `export { foo as default };`.
declare exportedIdentifiers: Set<string>;
sawUnambiguousESM: boolean = false;
ambiguousScriptDifferentAst: boolean = false;

Expand Down
4 changes: 2 additions & 2 deletions packages/babel-parser/src/parser/statement.js
Expand Up @@ -2114,7 +2114,7 @@ export default class StatementParser extends ExpressionParser {
| N.ExportDefaultSpecifier,
name: string,
): void {
if (this.state.exportedIdentifiers.indexOf(name) > -1) {
if (this.exportedIdentifiers.has(name)) {
this.raise(
node.start,
name === "default"
Expand All @@ -2123,7 +2123,7 @@ export default class StatementParser extends ExpressionParser {
name,
);
}
this.state.exportedIdentifiers.push(name);
this.exportedIdentifiers.add(name);
}

// Parses a comma-separated list of module exports.
Expand Down
6 changes: 3 additions & 3 deletions packages/babel-parser/src/parser/util.js
Expand Up @@ -349,8 +349,8 @@ export default class UtilParser extends Tokenizer {
const oldLabels = this.state.labels;
this.state.labels = [];

const oldExportedIdentifiers = this.state.exportedIdentifiers;
this.state.exportedIdentifiers = [];
const oldExportedIdentifiers = this.exportedIdentifiers;
this.exportedIdentifiers = new Set();

// initialize scopes
const oldInModule = this.inModule;
Expand All @@ -372,7 +372,7 @@ export default class UtilParser extends Tokenizer {
return () => {
// Revert state
this.state.labels = oldLabels;
this.state.exportedIdentifiers = oldExportedIdentifiers;
this.exportedIdentifiers = oldExportedIdentifiers;

// Revert scopes
this.inModule = oldInModule;
Expand Down
4 changes: 0 additions & 4 deletions packages/babel-parser/src/tokenizer/state.js
Expand Up @@ -148,10 +148,6 @@ export default class State {
// after a non-directive is parsed
strictErrors: Map<number, ErrorTemplate> = new Map();

// Names of exports store. `default` is stored as a name for both
// `export default foo;` and `export { foo as default };`.
exportedIdentifiers: Array<string> = [];

// Tokens length in token store
tokensLength: number = 0;

Expand Down
19 changes: 14 additions & 5 deletions yarn.lock
Expand Up @@ -5,12 +5,12 @@ __metadata:
version: 4
cacheKey: 7

"@babel-baseline/parser@npm:@babel/parser@^7.14.0, npm-babel-parser@npm:@babel/parser@^7.14.0":
version: 7.14.0
resolution: "@babel/parser@npm:7.14.0"
"@babel-baseline/parser@npm:@babel/parser@^7.14.4":
version: 7.14.4
resolution: "@babel/parser@npm:7.14.4"
bin:
parser: ./bin/babel-parser.js
checksum: ef6165f3038b9f8761a02768ab14034f4935baf2e050a2924aa093f54e3164732bce7fee81b3c8ff3be03048091e4ea208a72b23a3715debf7fd06b79495c9e9
checksum: 3bc067c1ee0e0178d365e1b2988ea1a0d6d37af37870ea1a7e80729b3bdc40acda083cac44ce72f63a5b31a489e35120f617bd41f312dec4c86cf814cff8e64a
languageName: node
linkType: hard

Expand Down Expand Up @@ -963,7 +963,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@babel/parser@workspace:packages/babel-parser"
dependencies:
"@babel-baseline/parser": "npm:@babel/parser@^7.14.0"
"@babel-baseline/parser": "npm:@babel/parser@^7.14.4"
"@babel/code-frame": "workspace:*"
"@babel/helper-fixtures": "workspace:*"
"@babel/helper-validator-identifier": "workspace:*"
Expand Down Expand Up @@ -11641,6 +11641,15 @@ fsevents@^1.2.7:
languageName: node
linkType: hard

"npm-babel-parser@npm:@babel/parser@^7.14.0":
version: 7.14.0
resolution: "@babel/parser@npm:7.14.0"
bin:
parser: ./bin/babel-parser.js
checksum: ef6165f3038b9f8761a02768ab14034f4935baf2e050a2924aa093f54e3164732bce7fee81b3c8ff3be03048091e4ea208a72b23a3715debf7fd06b79495c9e9
languageName: node
linkType: hard

"npm-run-path@npm:^2.0.0":
version: 2.0.2
resolution: "npm-run-path@npm:2.0.2"
Expand Down