From 1671a06655aefb5496f7524a01ec4209e0ae2bdd Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Fri, 7 Apr 2017 11:14:16 -0700 Subject: [PATCH] Test: object literal assignments->expanding arrays Previously, the compiler would run out of memory for more than 13 or 14 of these assignments. --- .../assignmentToExpandingArrayType.js | 56 +++++ .../assignmentToExpandingArrayType.symbols | 101 ++++++++ .../assignmentToExpandingArrayType.types | 222 ++++++++++++++++++ .../assignmentToExpandingArrayType.ts | 27 +++ 4 files changed, 406 insertions(+) create mode 100644 tests/baselines/reference/assignmentToExpandingArrayType.js create mode 100644 tests/baselines/reference/assignmentToExpandingArrayType.symbols create mode 100644 tests/baselines/reference/assignmentToExpandingArrayType.types create mode 100644 tests/cases/compiler/assignmentToExpandingArrayType.ts diff --git a/tests/baselines/reference/assignmentToExpandingArrayType.js b/tests/baselines/reference/assignmentToExpandingArrayType.js new file mode 100644 index 00000000000..5b885b6913f --- /dev/null +++ b/tests/baselines/reference/assignmentToExpandingArrayType.js @@ -0,0 +1,56 @@ +//// [assignmentToExpandingArrayType.ts] +// Fixes exponential time/space in #14628 +let x = [] +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } // previously ran out of memory here +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } + + +//// [assignmentToExpandingArrayType.js] +// Fixes exponential time/space in #14628 +var x = []; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; // previously ran out of memory here +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; +x[0] = { foo: 'hi' }; diff --git a/tests/baselines/reference/assignmentToExpandingArrayType.symbols b/tests/baselines/reference/assignmentToExpandingArrayType.symbols new file mode 100644 index 00000000000..c8285706f6e --- /dev/null +++ b/tests/baselines/reference/assignmentToExpandingArrayType.symbols @@ -0,0 +1,101 @@ +=== tests/cases/compiler/assignmentToExpandingArrayType.ts === +// Fixes exponential time/space in #14628 +let x = [] +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 2, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 3, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 4, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 5, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 6, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 7, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 8, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 9, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 10, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 11, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 12, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 13, 8)) + +x[0] = { foo: 'hi' } // previously ran out of memory here +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 14, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 15, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 16, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 17, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 18, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 19, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 20, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 21, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 22, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 23, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 24, 8)) + +x[0] = { foo: 'hi' } +>x : Symbol(x, Decl(assignmentToExpandingArrayType.ts, 1, 3)) +>foo : Symbol(foo, Decl(assignmentToExpandingArrayType.ts, 25, 8)) + diff --git a/tests/baselines/reference/assignmentToExpandingArrayType.types b/tests/baselines/reference/assignmentToExpandingArrayType.types new file mode 100644 index 00000000000..da923b23646 --- /dev/null +++ b/tests/baselines/reference/assignmentToExpandingArrayType.types @@ -0,0 +1,222 @@ +=== tests/cases/compiler/assignmentToExpandingArrayType.ts === +// Fixes exponential time/space in #14628 +let x = [] +>x : any[] +>[] : undefined[] + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } // previously ran out of memory here +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + +x[0] = { foo: 'hi' } +>x[0] = { foo: 'hi' } : { foo: string; } +>x[0] : any +>x : any[] +>0 : 0 +>{ foo: 'hi' } : { foo: string; } +>foo : string +>'hi' : "hi" + diff --git a/tests/cases/compiler/assignmentToExpandingArrayType.ts b/tests/cases/compiler/assignmentToExpandingArrayType.ts new file mode 100644 index 00000000000..05680afa386 --- /dev/null +++ b/tests/cases/compiler/assignmentToExpandingArrayType.ts @@ -0,0 +1,27 @@ +// @noImplicitAny: true +// Fixes exponential time/space in #14628 +let x = [] +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } // previously ran out of memory here +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' } +x[0] = { foo: 'hi' }