Skip to content

Commit 1671a06

Browse files
committed
Test: object literal assignments->expanding arrays
Previously, the compiler would run out of memory for more than 13 or 14 of these assignments.
1 parent 5c2091a commit 1671a06

File tree

4 files changed

+406
-0
lines changed

4 files changed

+406
-0
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
//// [assignmentToExpandingArrayType.ts]
2+
// Fixes exponential time/space in #14628
3+
let x = []
4+
x[0] = { foo: 'hi' }
5+
x[0] = { foo: 'hi' }
6+
x[0] = { foo: 'hi' }
7+
x[0] = { foo: 'hi' }
8+
x[0] = { foo: 'hi' }
9+
x[0] = { foo: 'hi' }
10+
x[0] = { foo: 'hi' }
11+
x[0] = { foo: 'hi' }
12+
x[0] = { foo: 'hi' }
13+
x[0] = { foo: 'hi' }
14+
x[0] = { foo: 'hi' }
15+
x[0] = { foo: 'hi' }
16+
x[0] = { foo: 'hi' } // previously ran out of memory here
17+
x[0] = { foo: 'hi' }
18+
x[0] = { foo: 'hi' }
19+
x[0] = { foo: 'hi' }
20+
x[0] = { foo: 'hi' }
21+
x[0] = { foo: 'hi' }
22+
x[0] = { foo: 'hi' }
23+
x[0] = { foo: 'hi' }
24+
x[0] = { foo: 'hi' }
25+
x[0] = { foo: 'hi' }
26+
x[0] = { foo: 'hi' }
27+
x[0] = { foo: 'hi' }
28+
29+
30+
//// [assignmentToExpandingArrayType.js]
31+
// Fixes exponential time/space in #14628
32+
var x = [];
33+
x[0] = { foo: 'hi' };
34+
x[0] = { foo: 'hi' };
35+
x[0] = { foo: 'hi' };
36+
x[0] = { foo: 'hi' };
37+
x[0] = { foo: 'hi' };
38+
x[0] = { foo: 'hi' };
39+
x[0] = { foo: 'hi' };
40+
x[0] = { foo: 'hi' };
41+
x[0] = { foo: 'hi' };
42+
x[0] = { foo: 'hi' };
43+
x[0] = { foo: 'hi' };
44+
x[0] = { foo: 'hi' };
45+
x[0] = { foo: 'hi' }; // previously ran out of memory here
46+
x[0] = { foo: 'hi' };
47+
x[0] = { foo: 'hi' };
48+
x[0] = { foo: 'hi' };
49+
x[0] = { foo: 'hi' };
50+
x[0] = { foo: 'hi' };
51+
x[0] = { foo: 'hi' };
52+
x[0] = { foo: 'hi' };
53+
x[0] = { foo: 'hi' };
54+
x[0] = { foo: 'hi' };
55+
x[0] = { foo: 'hi' };
56+
x[0] = { foo: 'hi' };
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
=== tests/cases/compiler/assignmentToExpandingArrayType.ts ===
2+
// Fixes exponential time/space in #14628
3+
let x = []
4+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
5+
6+
x[0] = { foo: 'hi' }
7+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
8+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 2, 8))
9+
10+
x[0] = { foo: 'hi' }
11+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
12+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 3, 8))
13+
14+
x[0] = { foo: 'hi' }
15+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
16+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 4, 8))
17+
18+
x[0] = { foo: 'hi' }
19+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
20+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 5, 8))
21+
22+
x[0] = { foo: 'hi' }
23+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
24+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 6, 8))
25+
26+
x[0] = { foo: 'hi' }
27+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
28+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 7, 8))
29+
30+
x[0] = { foo: 'hi' }
31+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
32+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 8, 8))
33+
34+
x[0] = { foo: 'hi' }
35+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
36+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 9, 8))
37+
38+
x[0] = { foo: 'hi' }
39+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
40+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 10, 8))
41+
42+
x[0] = { foo: 'hi' }
43+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
44+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 11, 8))
45+
46+
x[0] = { foo: 'hi' }
47+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
48+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 12, 8))
49+
50+
x[0] = { foo: 'hi' }
51+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
52+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 13, 8))
53+
54+
x[0] = { foo: 'hi' } // previously ran out of memory here
55+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
56+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 14, 8))
57+
58+
x[0] = { foo: 'hi' }
59+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
60+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 15, 8))
61+
62+
x[0] = { foo: 'hi' }
63+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
64+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 16, 8))
65+
66+
x[0] = { foo: 'hi' }
67+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
68+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 17, 8))
69+
70+
x[0] = { foo: 'hi' }
71+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
72+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 18, 8))
73+
74+
x[0] = { foo: 'hi' }
75+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
76+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 19, 8))
77+
78+
x[0] = { foo: 'hi' }
79+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
80+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 20, 8))
81+
82+
x[0] = { foo: 'hi' }
83+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
84+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 21, 8))
85+
86+
x[0] = { foo: 'hi' }
87+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
88+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 22, 8))
89+
90+
x[0] = { foo: 'hi' }
91+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
92+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 23, 8))
93+
94+
x[0] = { foo: 'hi' }
95+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
96+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 24, 8))
97+
98+
x[0] = { foo: 'hi' }
99+
>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3))
100+
>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 25, 8))
101+
Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
=== tests/cases/compiler/assignmentToExpandingArrayType.ts ===
2+
// Fixes exponential time/space in #14628
3+
let x = []
4+
>x : any[]
5+
>[] : undefined[]
6+
7+
x[0] = { foo: 'hi' }
8+
>x[0] = { foo: 'hi' } : { foo: string; }
9+
>x[0] : any
10+
>x : any[]
11+
>0 : 0
12+
>{ foo: 'hi' } : { foo: string; }
13+
>foo : string
14+
>'hi' : "hi"
15+
16+
x[0] = { foo: 'hi' }
17+
>x[0] = { foo: 'hi' } : { foo: string; }
18+
>x[0] : any
19+
>x : any[]
20+
>0 : 0
21+
>{ foo: 'hi' } : { foo: string; }
22+
>foo : string
23+
>'hi' : "hi"
24+
25+
x[0] = { foo: 'hi' }
26+
>x[0] = { foo: 'hi' } : { foo: string; }
27+
>x[0] : any
28+
>x : any[]
29+
>0 : 0
30+
>{ foo: 'hi' } : { foo: string; }
31+
>foo : string
32+
>'hi' : "hi"
33+
34+
x[0] = { foo: 'hi' }
35+
>x[0] = { foo: 'hi' } : { foo: string; }
36+
>x[0] : any
37+
>x : any[]
38+
>0 : 0
39+
>{ foo: 'hi' } : { foo: string; }
40+
>foo : string
41+
>'hi' : "hi"
42+
43+
x[0] = { foo: 'hi' }
44+
>x[0] = { foo: 'hi' } : { foo: string; }
45+
>x[0] : any
46+
>x : any[]
47+
>0 : 0
48+
>{ foo: 'hi' } : { foo: string; }
49+
>foo : string
50+
>'hi' : "hi"
51+
52+
x[0] = { foo: 'hi' }
53+
>x[0] = { foo: 'hi' } : { foo: string; }
54+
>x[0] : any
55+
>x : any[]
56+
>0 : 0
57+
>{ foo: 'hi' } : { foo: string; }
58+
>foo : string
59+
>'hi' : "hi"
60+
61+
x[0] = { foo: 'hi' }
62+
>x[0] = { foo: 'hi' } : { foo: string; }
63+
>x[0] : any
64+
>x : any[]
65+
>0 : 0
66+
>{ foo: 'hi' } : { foo: string; }
67+
>foo : string
68+
>'hi' : "hi"
69+
70+
x[0] = { foo: 'hi' }
71+
>x[0] = { foo: 'hi' } : { foo: string; }
72+
>x[0] : any
73+
>x : any[]
74+
>0 : 0
75+
>{ foo: 'hi' } : { foo: string; }
76+
>foo : string
77+
>'hi' : "hi"
78+
79+
x[0] = { foo: 'hi' }
80+
>x[0] = { foo: 'hi' } : { foo: string; }
81+
>x[0] : any
82+
>x : any[]
83+
>0 : 0
84+
>{ foo: 'hi' } : { foo: string; }
85+
>foo : string
86+
>'hi' : "hi"
87+
88+
x[0] = { foo: 'hi' }
89+
>x[0] = { foo: 'hi' } : { foo: string; }
90+
>x[0] : any
91+
>x : any[]
92+
>0 : 0
93+
>{ foo: 'hi' } : { foo: string; }
94+
>foo : string
95+
>'hi' : "hi"
96+
97+
x[0] = { foo: 'hi' }
98+
>x[0] = { foo: 'hi' } : { foo: string; }
99+
>x[0] : any
100+
>x : any[]
101+
>0 : 0
102+
>{ foo: 'hi' } : { foo: string; }
103+
>foo : string
104+
>'hi' : "hi"
105+
106+
x[0] = { foo: 'hi' }
107+
>x[0] = { foo: 'hi' } : { foo: string; }
108+
>x[0] : any
109+
>x : any[]
110+
>0 : 0
111+
>{ foo: 'hi' } : { foo: string; }
112+
>foo : string
113+
>'hi' : "hi"
114+
115+
x[0] = { foo: 'hi' } // previously ran out of memory here
116+
>x[0] = { foo: 'hi' } : { foo: string; }
117+
>x[0] : any
118+
>x : any[]
119+
>0 : 0
120+
>{ foo: 'hi' } : { foo: string; }
121+
>foo : string
122+
>'hi' : "hi"
123+
124+
x[0] = { foo: 'hi' }
125+
>x[0] = { foo: 'hi' } : { foo: string; }
126+
>x[0] : any
127+
>x : any[]
128+
>0 : 0
129+
>{ foo: 'hi' } : { foo: string; }
130+
>foo : string
131+
>'hi' : "hi"
132+
133+
x[0] = { foo: 'hi' }
134+
>x[0] = { foo: 'hi' } : { foo: string; }
135+
>x[0] : any
136+
>x : any[]
137+
>0 : 0
138+
>{ foo: 'hi' } : { foo: string; }
139+
>foo : string
140+
>'hi' : "hi"
141+
142+
x[0] = { foo: 'hi' }
143+
>x[0] = { foo: 'hi' } : { foo: string; }
144+
>x[0] : any
145+
>x : any[]
146+
>0 : 0
147+
>{ foo: 'hi' } : { foo: string; }
148+
>foo : string
149+
>'hi' : "hi"
150+
151+
x[0] = { foo: 'hi' }
152+
>x[0] = { foo: 'hi' } : { foo: string; }
153+
>x[0] : any
154+
>x : any[]
155+
>0 : 0
156+
>{ foo: 'hi' } : { foo: string; }
157+
>foo : string
158+
>'hi' : "hi"
159+
160+
x[0] = { foo: 'hi' }
161+
>x[0] = { foo: 'hi' } : { foo: string; }
162+
>x[0] : any
163+
>x : any[]
164+
>0 : 0
165+
>{ foo: 'hi' } : { foo: string; }
166+
>foo : string
167+
>'hi' : "hi"
168+
169+
x[0] = { foo: 'hi' }
170+
>x[0] = { foo: 'hi' } : { foo: string; }
171+
>x[0] : any
172+
>x : any[]
173+
>0 : 0
174+
>{ foo: 'hi' } : { foo: string; }
175+
>foo : string
176+
>'hi' : "hi"
177+
178+
x[0] = { foo: 'hi' }
179+
>x[0] = { foo: 'hi' } : { foo: string; }
180+
>x[0] : any
181+
>x : any[]
182+
>0 : 0
183+
>{ foo: 'hi' } : { foo: string; }
184+
>foo : string
185+
>'hi' : "hi"
186+
187+
x[0] = { foo: 'hi' }
188+
>x[0] = { foo: 'hi' } : { foo: string; }
189+
>x[0] : any
190+
>x : any[]
191+
>0 : 0
192+
>{ foo: 'hi' } : { foo: string; }
193+
>foo : string
194+
>'hi' : "hi"
195+
196+
x[0] = { foo: 'hi' }
197+
>x[0] = { foo: 'hi' } : { foo: string; }
198+
>x[0] : any
199+
>x : any[]
200+
>0 : 0
201+
>{ foo: 'hi' } : { foo: string; }
202+
>foo : string
203+
>'hi' : "hi"
204+
205+
x[0] = { foo: 'hi' }
206+
>x[0] = { foo: 'hi' } : { foo: string; }
207+
>x[0] : any
208+
>x : any[]
209+
>0 : 0
210+
>{ foo: 'hi' } : { foo: string; }
211+
>foo : string
212+
>'hi' : "hi"
213+
214+
x[0] = { foo: 'hi' }
215+
>x[0] = { foo: 'hi' } : { foo: string; }
216+
>x[0] : any
217+
>x : any[]
218+
>0 : 0
219+
>{ foo: 'hi' } : { foo: string; }
220+
>foo : string
221+
>'hi' : "hi"
222+

0 commit comments

Comments
 (0)