repl: fix top level await with surrogate characters

Fixes: https://github.com/nodejs/node/issues/39929

PR-URL: https://github.com/nodejs/node/pull/39931
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Shingo Inoue <leko.noor@gmail.com>
This commit is contained in:
Mestery 2021-08-29 16:03:36 +02:00 committed by Michaël Zasso
parent 7d51c6a58c
commit addb30f0c9
No known key found for this signature in database
GPG Key ID: 770F7A9A5AE15600
2 changed files with 19 additions and 2 deletions

View File

@ -1,7 +1,6 @@
'use strict';
const {
ArrayFrom,
ArrayPrototypeForEach,
ArrayPrototypeIncludes,
ArrayPrototypeJoin,
@ -155,7 +154,7 @@ for (const nodeType of ObjectKeys(walk.base)) {
function processTopLevelAwait(src) {
const wrapPrefix = '(async () => { ';
const wrapped = `${wrapPrefix}${src} })()`;
const wrappedArray = ArrayFrom(wrapped);
const wrappedArray = StringPrototypeSplit(wrapped, '');
let root;
try {
root = parser.parse(wrapped, { ecmaVersion: 'latest' });

View File

@ -9,17 +9,31 @@ const { processTopLevelAwait } = require('internal/repl/await');
// This test was created based on
// https://cs.chromium.org/chromium/src/third_party/WebKit/LayoutTests/http/tests/inspector-unit/preprocess-top-level-awaits.js?rcl=358caaba5e763e71c4abb9ada2d9cd8b1188cac9
const surrogate = (
'"\u{1F601}\u{1f468}\u200d\u{1f469}\u200d\u{1f467}\u200d\u{1f466}"'
);
const testCases = [
[ '0',
null ],
[ 'await 0',
'(async () => { return (await 0) })()' ],
[ `await ${surrogate}`,
`(async () => { return (await ${surrogate}) })()` ],
[ 'await 0;',
'(async () => { return (await 0); })()' ],
[ `await ${surrogate};`,
`(async () => { return (await ${surrogate}); })()` ],
[ `await ${surrogate};`,
`(async () => { return (await ${surrogate}); })()` ],
[ '(await 0)',
'(async () => { return ((await 0)) })()' ],
[ `(await ${surrogate})`,
`(async () => { return ((await ${surrogate})) })()` ],
[ '(await 0);',
'(async () => { return ((await 0)); })()' ],
[ `(await ${surrogate});`,
`(async () => { return ((await ${surrogate})); })()` ],
[ 'async function foo() { await 0; }',
null ],
[ 'async () => await 0',
@ -28,8 +42,12 @@ const testCases = [
null ],
[ 'await 0; return 0;',
null ],
[ `await ${surrogate}; await ${surrogate};`,
`(async () => { await ${surrogate}; return (await ${surrogate}); })()` ],
[ 'var a = await 1',
'var a; (async () => { void (a = await 1) })()' ],
[ `var a = await ${surrogate}`,
`var a; (async () => { void (a = await ${surrogate}) })()` ],
[ 'let a = await 1',
'let a; (async () => { void (a = await 1) })()' ],
[ 'const a = await 1',