1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
const testCases = [
// Label identifier.
id => `${id}: ;`,
// Binding identifier.
id => `var ${id};`,
id => `let ${id};`,
id => `const ${id} = 0;`,
// Binding identifier in binding pattern.
id => `var [${id}] = [];`,
id => `var [${id} = 0] = [];`,
id => `var [...${id}] = [];`,
id => `var {a: ${id}} = {};`,
id => `var {${id}} = {};`,
id => `var {${id} = 0} = {};`,
id => `let [${id}] = [];`,
id => `let [${id} = 0] = [];`,
id => `let [...${id}] = [];`,
id => `let {a: ${id}} = {};`,
id => `let {${id}} = {};`,
id => `let {${id} = 0} = {};`,
id => `const [${id}] = [];`,
id => `const [${id} = 0] = [];`,
id => `const [...${id}] = [];`,
id => `const {a: ${id}} = {};`,
id => `const {${id}} = {};`,
id => `const {${id} = 0} = {};`,
// Identifier reference.
id => `void ${id};`,
];
const strictReservedWords = [
"implements",
"interface",
"package",
"private",
"protected",
"public",
];
function escapeWord(s) {
return "\\u00" + s.charCodeAt(0).toString(16) + s.substring(1);
}
for (let strictReservedWordOrYield of [...strictReservedWords, "yield"]) {
let escapedStrictReservedWordOrYield = escapeWord(strictReservedWordOrYield);
for (let testCase of testCases) {
eval(testCase(strictReservedWordOrYield));
eval(testCase(escapedStrictReservedWordOrYield));
assertThrowsInstanceOf(() => eval(String.raw`
"use strict";
${testCase(strictReservedWordOrYield)}
`), SyntaxError);
assertThrowsInstanceOf(() => eval(String.raw`
"use strict";
${testCase(escapedStrictReservedWordOrYield)}
`), SyntaxError);
}
}
// |yield| is always a keyword in generator functions.
for (let testCase of testCases) {
let yield = "yield";
let escapedYield = escapeWord("yield");
assertThrowsInstanceOf(() => eval(String.raw`
function* g() {
${testCase(yield)}
}
`), SyntaxError);
assertThrowsInstanceOf(() => eval(String.raw`
function* g() {
${testCase(escapedYield)}
}
`), SyntaxError);
assertThrowsInstanceOf(() => eval(String.raw`
"use strict";
function* g() {
${testCase(yield)}
}
`), SyntaxError);
assertThrowsInstanceOf(() => eval(String.raw`
"use strict";
function* g() {
${testCase(escapedYield)}
}
`), SyntaxError);
}
if (typeof reportCompare === "function")
reportCompare(0, 0, "ok");
|