Skip to content

Commit 86d5311

Browse files
committed
Don't parse param init when = is required but missing
Makes another test case pass that was taking exponential time to parse, because now it notices that the = is not present and doesn't even try to parse the initialiser expression.
1 parent 3a25650 commit 86d5311

File tree

5 files changed

+739
-3
lines changed

5 files changed

+739
-3
lines changed

src/compiler/parser.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3025,9 +3025,8 @@ namespace ts {
30253025
return undefined;
30263026
}
30273027
if (inParameter && requireEqualsToken) {
3028-
// this occurs with speculative parsing of lambdas, so try to consume the initializer,
3029-
// but signal that the parameter was missing the equals sign so it can abort if it wants
3030-
parseAssignmentExpressionOrHigher();
3028+
// = is required when speculatively parsing arrow function parameters,
3029+
// so return a fake initializer as a signal that the equals token was missing
30313030
const result = createNode(SyntaxKind.Identifier, scanner.getStartPos()) as Identifier;
30323031
result.escapedText = "= not found" as __String;
30333032
return result;
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
//// [parserRegularExpressionDivideAmbiguity6.ts]
2+
function c255lsqr8h(a7, a6, a5, a4, a3, a2, a1, a0) {
3+
let r = [];
4+
let v;
5+
r[0] = (v = a0*a0) & 0xFFFF;
6+
r[1] = (v = ((v / 0x10000) | 0) + 2*a0*a1) & 0xFFFF;
7+
r[2] = (v = ((v / 0x10000) | 0) + 2*a0*a2 + a1*a1) & 0xFFFF;
8+
r[3] = (v = ((v / 0x10000) | 0) + 2*a0*a3 + 2*a1*a2) & 0xFFFF;
9+
r[4] = (v = ((v / 0x10000) | 0) + 2*a0*a4 + 2*a1*a3 + a2*a2) & 0xFFFF;
10+
r[5] = (v = ((v / 0x10000) | 0) + 2*a0*a5 + 2*a1*a4 + 2*a2*a3) & 0xFFFF;
11+
r[6] = (v = ((v / 0x10000) | 0) + 2*a0*a6 + 2*a1*a5 + 2*a2*a4 + a3*a3) & 0xFFFF;
12+
r[7] = (v = ((v / 0x10000) | 0) + 2*a0*a7 + 2*a1*a6 + 2*a2*a5 + 2*a3*a4) & 0xFFFF;
13+
r[8] = (v = ((v / 0x10000) | 0) + 2*a1*a7 + 2*a2*a6 + 2*a3*a5 + a4*a4) & 0xFFFF;
14+
r[9] = (v = ((v / 0x10000) | 0) + 2*a2*a7 + 2*a3*a6 + 2*a4*a5) & 0xFFFF;
15+
r[10] = (v = ((v / 0x10000) | 0) + 2*a3*a7 + 2*a4*a6 + a5*a5) & 0xFFFF;
16+
r[11] = (v = ((v / 0x10000) | 0) + 2*a4*a7 + 2*a5*a6) & 0xFFFF;
17+
r[12] = (v = ((v / 0x10000) | 0) + 2*a5*a7 + a6*a6) & 0xFFFF;
18+
r[13] = (v = ((v / 0x10000) | 0) + 2*a6*a7) & 0xFFFF;
19+
r[14] = (v = ((v / 0x10000) | 0) + a7*a7) & 0xFFFF;
20+
r[15] = ((v / 0x10000) | 0);
21+
return r;
22+
}
23+
24+
25+
//// [parserRegularExpressionDivideAmbiguity6.js]
26+
function c255lsqr8h(a7, a6, a5, a4, a3, a2, a1, a0) {
27+
var r = [];
28+
var v;
29+
r[0] = (v = a0 * a0) & 0xFFFF;
30+
r[1] = (v = ((v / 0x10000) | 0) + 2 * a0 * a1) & 0xFFFF;
31+
r[2] = (v = ((v / 0x10000) | 0) + 2 * a0 * a2 + a1 * a1) & 0xFFFF;
32+
r[3] = (v = ((v / 0x10000) | 0) + 2 * a0 * a3 + 2 * a1 * a2) & 0xFFFF;
33+
r[4] = (v = ((v / 0x10000) | 0) + 2 * a0 * a4 + 2 * a1 * a3 + a2 * a2) & 0xFFFF;
34+
r[5] = (v = ((v / 0x10000) | 0) + 2 * a0 * a5 + 2 * a1 * a4 + 2 * a2 * a3) & 0xFFFF;
35+
r[6] = (v = ((v / 0x10000) | 0) + 2 * a0 * a6 + 2 * a1 * a5 + 2 * a2 * a4 + a3 * a3) & 0xFFFF;
36+
r[7] = (v = ((v / 0x10000) | 0) + 2 * a0 * a7 + 2 * a1 * a6 + 2 * a2 * a5 + 2 * a3 * a4) & 0xFFFF;
37+
r[8] = (v = ((v / 0x10000) | 0) + 2 * a1 * a7 + 2 * a2 * a6 + 2 * a3 * a5 + a4 * a4) & 0xFFFF;
38+
r[9] = (v = ((v / 0x10000) | 0) + 2 * a2 * a7 + 2 * a3 * a6 + 2 * a4 * a5) & 0xFFFF;
39+
r[10] = (v = ((v / 0x10000) | 0) + 2 * a3 * a7 + 2 * a4 * a6 + a5 * a5) & 0xFFFF;
40+
r[11] = (v = ((v / 0x10000) | 0) + 2 * a4 * a7 + 2 * a5 * a6) & 0xFFFF;
41+
r[12] = (v = ((v / 0x10000) | 0) + 2 * a5 * a7 + a6 * a6) & 0xFFFF;
42+
r[13] = (v = ((v / 0x10000) | 0) + 2 * a6 * a7) & 0xFFFF;
43+
r[14] = (v = ((v / 0x10000) | 0) + a7 * a7) & 0xFFFF;
44+
r[15] = ((v / 0x10000) | 0);
45+
return r;
46+
}
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
=== tests/cases/conformance/parser/ecmascript5/RegularExpressions/parserRegularExpressionDivideAmbiguity6.ts ===
2+
function c255lsqr8h(a7, a6, a5, a4, a3, a2, a1, a0) {
3+
>c255lsqr8h : Symbol(c255lsqr8h, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 0))
4+
>a7 : Symbol(a7, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 20))
5+
>a6 : Symbol(a6, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 23))
6+
>a5 : Symbol(a5, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 27))
7+
>a4 : Symbol(a4, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 31))
8+
>a3 : Symbol(a3, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 35))
9+
>a2 : Symbol(a2, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 39))
10+
>a1 : Symbol(a1, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 43))
11+
>a0 : Symbol(a0, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 47))
12+
13+
let r = [];
14+
>r : Symbol(r, Decl(parserRegularExpressionDivideAmbiguity6.ts, 1, 7))
15+
16+
let v;
17+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
18+
19+
r[0] = (v = a0*a0) & 0xFFFF;
20+
>r : Symbol(r, Decl(parserRegularExpressionDivideAmbiguity6.ts, 1, 7))
21+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
22+
>a0 : Symbol(a0, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 47))
23+
>a0 : Symbol(a0, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 47))
24+
25+
r[1] = (v = ((v / 0x10000) | 0) + 2*a0*a1) & 0xFFFF;
26+
>r : Symbol(r, Decl(parserRegularExpressionDivideAmbiguity6.ts, 1, 7))
27+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
28+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
29+
>a0 : Symbol(a0, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 47))
30+
>a1 : Symbol(a1, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 43))
31+
32+
r[2] = (v = ((v / 0x10000) | 0) + 2*a0*a2 + a1*a1) & 0xFFFF;
33+
>r : Symbol(r, Decl(parserRegularExpressionDivideAmbiguity6.ts, 1, 7))
34+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
35+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
36+
>a0 : Symbol(a0, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 47))
37+
>a2 : Symbol(a2, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 39))
38+
>a1 : Symbol(a1, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 43))
39+
>a1 : Symbol(a1, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 43))
40+
41+
r[3] = (v = ((v / 0x10000) | 0) + 2*a0*a3 + 2*a1*a2) & 0xFFFF;
42+
>r : Symbol(r, Decl(parserRegularExpressionDivideAmbiguity6.ts, 1, 7))
43+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
44+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
45+
>a0 : Symbol(a0, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 47))
46+
>a3 : Symbol(a3, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 35))
47+
>a1 : Symbol(a1, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 43))
48+
>a2 : Symbol(a2, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 39))
49+
50+
r[4] = (v = ((v / 0x10000) | 0) + 2*a0*a4 + 2*a1*a3 + a2*a2) & 0xFFFF;
51+
>r : Symbol(r, Decl(parserRegularExpressionDivideAmbiguity6.ts, 1, 7))
52+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
53+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
54+
>a0 : Symbol(a0, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 47))
55+
>a4 : Symbol(a4, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 31))
56+
>a1 : Symbol(a1, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 43))
57+
>a3 : Symbol(a3, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 35))
58+
>a2 : Symbol(a2, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 39))
59+
>a2 : Symbol(a2, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 39))
60+
61+
r[5] = (v = ((v / 0x10000) | 0) + 2*a0*a5 + 2*a1*a4 + 2*a2*a3) & 0xFFFF;
62+
>r : Symbol(r, Decl(parserRegularExpressionDivideAmbiguity6.ts, 1, 7))
63+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
64+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
65+
>a0 : Symbol(a0, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 47))
66+
>a5 : Symbol(a5, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 27))
67+
>a1 : Symbol(a1, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 43))
68+
>a4 : Symbol(a4, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 31))
69+
>a2 : Symbol(a2, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 39))
70+
>a3 : Symbol(a3, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 35))
71+
72+
r[6] = (v = ((v / 0x10000) | 0) + 2*a0*a6 + 2*a1*a5 + 2*a2*a4 + a3*a3) & 0xFFFF;
73+
>r : Symbol(r, Decl(parserRegularExpressionDivideAmbiguity6.ts, 1, 7))
74+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
75+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
76+
>a0 : Symbol(a0, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 47))
77+
>a6 : Symbol(a6, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 23))
78+
>a1 : Symbol(a1, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 43))
79+
>a5 : Symbol(a5, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 27))
80+
>a2 : Symbol(a2, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 39))
81+
>a4 : Symbol(a4, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 31))
82+
>a3 : Symbol(a3, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 35))
83+
>a3 : Symbol(a3, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 35))
84+
85+
r[7] = (v = ((v / 0x10000) | 0) + 2*a0*a7 + 2*a1*a6 + 2*a2*a5 + 2*a3*a4) & 0xFFFF;
86+
>r : Symbol(r, Decl(parserRegularExpressionDivideAmbiguity6.ts, 1, 7))
87+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
88+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
89+
>a0 : Symbol(a0, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 47))
90+
>a7 : Symbol(a7, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 20))
91+
>a1 : Symbol(a1, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 43))
92+
>a6 : Symbol(a6, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 23))
93+
>a2 : Symbol(a2, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 39))
94+
>a5 : Symbol(a5, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 27))
95+
>a3 : Symbol(a3, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 35))
96+
>a4 : Symbol(a4, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 31))
97+
98+
r[8] = (v = ((v / 0x10000) | 0) + 2*a1*a7 + 2*a2*a6 + 2*a3*a5 + a4*a4) & 0xFFFF;
99+
>r : Symbol(r, Decl(parserRegularExpressionDivideAmbiguity6.ts, 1, 7))
100+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
101+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
102+
>a1 : Symbol(a1, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 43))
103+
>a7 : Symbol(a7, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 20))
104+
>a2 : Symbol(a2, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 39))
105+
>a6 : Symbol(a6, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 23))
106+
>a3 : Symbol(a3, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 35))
107+
>a5 : Symbol(a5, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 27))
108+
>a4 : Symbol(a4, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 31))
109+
>a4 : Symbol(a4, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 31))
110+
111+
r[9] = (v = ((v / 0x10000) | 0) + 2*a2*a7 + 2*a3*a6 + 2*a4*a5) & 0xFFFF;
112+
>r : Symbol(r, Decl(parserRegularExpressionDivideAmbiguity6.ts, 1, 7))
113+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
114+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
115+
>a2 : Symbol(a2, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 39))
116+
>a7 : Symbol(a7, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 20))
117+
>a3 : Symbol(a3, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 35))
118+
>a6 : Symbol(a6, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 23))
119+
>a4 : Symbol(a4, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 31))
120+
>a5 : Symbol(a5, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 27))
121+
122+
r[10] = (v = ((v / 0x10000) | 0) + 2*a3*a7 + 2*a4*a6 + a5*a5) & 0xFFFF;
123+
>r : Symbol(r, Decl(parserRegularExpressionDivideAmbiguity6.ts, 1, 7))
124+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
125+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
126+
>a3 : Symbol(a3, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 35))
127+
>a7 : Symbol(a7, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 20))
128+
>a4 : Symbol(a4, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 31))
129+
>a6 : Symbol(a6, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 23))
130+
>a5 : Symbol(a5, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 27))
131+
>a5 : Symbol(a5, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 27))
132+
133+
r[11] = (v = ((v / 0x10000) | 0) + 2*a4*a7 + 2*a5*a6) & 0xFFFF;
134+
>r : Symbol(r, Decl(parserRegularExpressionDivideAmbiguity6.ts, 1, 7))
135+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
136+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
137+
>a4 : Symbol(a4, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 31))
138+
>a7 : Symbol(a7, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 20))
139+
>a5 : Symbol(a5, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 27))
140+
>a6 : Symbol(a6, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 23))
141+
142+
r[12] = (v = ((v / 0x10000) | 0) + 2*a5*a7 + a6*a6) & 0xFFFF;
143+
>r : Symbol(r, Decl(parserRegularExpressionDivideAmbiguity6.ts, 1, 7))
144+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
145+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
146+
>a5 : Symbol(a5, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 27))
147+
>a7 : Symbol(a7, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 20))
148+
>a6 : Symbol(a6, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 23))
149+
>a6 : Symbol(a6, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 23))
150+
151+
r[13] = (v = ((v / 0x10000) | 0) + 2*a6*a7) & 0xFFFF;
152+
>r : Symbol(r, Decl(parserRegularExpressionDivideAmbiguity6.ts, 1, 7))
153+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
154+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
155+
>a6 : Symbol(a6, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 23))
156+
>a7 : Symbol(a7, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 20))
157+
158+
r[14] = (v = ((v / 0x10000) | 0) + a7*a7) & 0xFFFF;
159+
>r : Symbol(r, Decl(parserRegularExpressionDivideAmbiguity6.ts, 1, 7))
160+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
161+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
162+
>a7 : Symbol(a7, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 20))
163+
>a7 : Symbol(a7, Decl(parserRegularExpressionDivideAmbiguity6.ts, 0, 20))
164+
165+
r[15] = ((v / 0x10000) | 0);
166+
>r : Symbol(r, Decl(parserRegularExpressionDivideAmbiguity6.ts, 1, 7))
167+
>v : Symbol(v, Decl(parserRegularExpressionDivideAmbiguity6.ts, 2, 7))
168+
169+
return r;
170+
>r : Symbol(r, Decl(parserRegularExpressionDivideAmbiguity6.ts, 1, 7))
171+
}
172+

0 commit comments

Comments
 (0)