OLD | NEW |
1 // Copyright 2017 the V8 project authors. All rights reserved. | 1 // Copyright 2017 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/ast/ast.h" | 5 #include "src/ast/ast.h" |
6 #include "src/compiler.h" | 6 #include "src/compiler.h" |
7 #include "src/objects-inl.h" | 7 #include "src/objects-inl.h" |
8 #include "src/parsing/parse-info.h" | 8 #include "src/parsing/parse-info.h" |
9 #include "src/parsing/parsing.h" | 9 #include "src/parsing/parsing.h" |
10 | 10 |
(...skipping 12 matching lines...) Expand all Loading... |
23 const char* prefix = "(function outer() { "; | 23 const char* prefix = "(function outer() { "; |
24 const char* suffix = " })();"; | 24 const char* suffix = " })();"; |
25 int prefix_len = Utf8LengthHelper(prefix); | 25 int prefix_len = Utf8LengthHelper(prefix); |
26 int suffix_len = Utf8LengthHelper(suffix); | 26 int suffix_len = Utf8LengthHelper(suffix); |
27 | 27 |
28 // The scope start positions must match; note the extra space in lazy_inner. | 28 // The scope start positions must match; note the extra space in lazy_inner. |
29 const char* lazy_inner = " function inner(%s) { %s }"; | 29 const char* lazy_inner = " function inner(%s) { %s }"; |
30 const char* eager_inner = "(function inner(%s) { %s })()"; | 30 const char* eager_inner = "(function inner(%s) { %s })()"; |
31 | 31 |
32 struct { | 32 struct { |
| 33 bool precise_maybe_assigned; |
33 const char* params; | 34 const char* params; |
34 const char* source; | 35 const char* source; |
35 } inners[] = { | 36 } inners[] = { |
36 // Simple cases | 37 // Simple cases |
37 {"", "var1;"}, | 38 {1, "", "var1;"}, |
38 {"", "var1 = 5;"}, | 39 {1, "", "var1 = 5;"}, |
39 {"", "if (true) {}"}, | 40 {1, "", "if (true) {}"}, |
40 {"", "function f1() {}"}, | 41 {1, "", "function f1() {}"}, |
41 | 42 |
42 // Var declarations and assignments. | 43 // Var declarations and assignments. |
43 {"", "var var1;"}, | 44 {1, "", "var var1;"}, |
44 {"", "var var1; var1 = 5;"}, | 45 {1, "", "var var1; var1 = 5;"}, |
45 {"", "if (true) { var var1; }"}, | 46 {0, "", "if (true) { var var1; }"}, |
46 {"", "if (true) { var var1; var1 = 5; }"}, | 47 {1, "", "if (true) { var var1; var1 = 5; }"}, |
47 {"", "var var1; function f() { var1; }"}, | 48 {1, "", "var var1; function f() { var1; }"}, |
48 {"", "var var1; var1 = 5; function f() { var1; }"}, | 49 {1, "", "var var1; var1 = 5; function f() { var1; }"}, |
49 {"", "var var1; function f() { var1 = 5; }"}, | 50 {1, "", "var var1; function f() { var1 = 5; }"}, |
50 | 51 |
51 // Let declarations and assignments. | 52 // Let declarations and assignments. |
52 {"", "let var1;"}, | 53 {1, "", "let var1;"}, |
53 {"", "let var1; var1 = 5;"}, | 54 {1, "", "let var1; var1 = 5;"}, |
54 {"", "if (true) { let var1; }"}, | 55 {1, "", "if (true) { let var1; }"}, |
55 {"", "if (true) { let var1; var1 = 5; }"}, | 56 {1, "", "if (true) { let var1; var1 = 5; }"}, |
56 {"", "let var1; function f() { var1; }"}, | 57 {1, "", "let var1; function f() { var1; }"}, |
57 {"", "let var1; var1 = 5; function f() { var1; }"}, | 58 {1, "", "let var1; var1 = 5; function f() { var1; }"}, |
58 {"", "let var1; function f() { var1 = 5; }"}, | 59 {1, "", "let var1; function f() { var1 = 5; }"}, |
59 | 60 |
60 // Const declarations. | 61 // Const declarations. |
61 {"", "const var1 = 5;"}, | 62 {1, "", "const var1 = 5;"}, |
62 {"", "if (true) { const var1 = 5; }"}, | 63 {1, "", "if (true) { const var1 = 5; }"}, |
63 {"", "const var1 = 5; function f() { var1; }"}, | 64 {1, "", "const var1 = 5; function f() { var1; }"}, |
64 | 65 |
65 // Redeclarations. | 66 // Redeclarations. |
66 {"", "var var1; var var1;"}, | 67 {1, "", "var var1; var var1;"}, |
67 {"", "var var1; var var1; var1 = 5;"}, | 68 {1, "", "var var1; var var1; var1 = 5;"}, |
68 {"", "var var1; if (true) { var var1; }"}, | 69 {1, "", "var var1; if (true) { var var1; }"}, |
69 {"", "if (true) { var var1; var var1; }"}, | 70 {1, "", "if (true) { var var1; var var1; }"}, |
70 {"", "var var1; if (true) { var var1; var1 = 5; }"}, | 71 {1, "", "var var1; if (true) { var var1; var1 = 5; }"}, |
71 {"", "if (true) { var var1; var var1; var1 = 5; }"}, | 72 {1, "", "if (true) { var var1; var var1; var1 = 5; }"}, |
72 {"", "var var1; var var1; function f() { var1; }"}, | 73 {1, "", "var var1; var var1; function f() { var1; }"}, |
73 {"", "var var1; var var1; function f() { var1 = 5; }"}, | 74 {1, "", "var var1; var var1; function f() { var1 = 5; }"}, |
74 | 75 |
75 // Shadowing declarations. | 76 // Shadowing declarations. |
76 {"", "var var1; if (true) { var var1; }"}, | 77 {1, "", "var var1; if (true) { var var1; }"}, |
77 {"", "var var1; if (true) { let var1; }"}, | 78 {1, "", "var var1; if (true) { let var1; }"}, |
78 {"", "let var1; if (true) { let var1; }"}, | 79 {1, "", "let var1; if (true) { let var1; }"}, |
79 | 80 |
80 {"", "var var1; if (true) { const var1 = 0; }"}, | 81 {1, "", "var var1; if (true) { const var1 = 0; }"}, |
81 {"", "const var1 = 0; if (true) { const var1 = 0; }"}, | 82 {1, "", "const var1 = 0; if (true) { const var1 = 0; }"}, |
82 | 83 |
83 // Arguments and this. | 84 // Arguments and this. |
84 {"", "arguments;"}, | 85 {1, "", "arguments;"}, |
85 {"", "arguments = 5;"}, | 86 {1, "", "arguments = 5;"}, |
86 {"", "if (true) { arguments; }"}, | 87 {1, "", "if (true) { arguments; }"}, |
87 {"", "if (true) { arguments = 5; }"}, | 88 {1, "", "if (true) { arguments = 5; }"}, |
88 {"", "function f() { arguments; }"}, | 89 {1, "", "function f() { arguments; }"}, |
89 {"", "function f() { arguments = 5; }"}, | 90 {1, "", "function f() { arguments = 5; }"}, |
90 | 91 |
91 {"", "this;"}, | 92 {1, "", "this;"}, |
92 {"", "if (true) { this; }"}, | 93 {1, "", "if (true) { this; }"}, |
93 {"", "function f() { this; }"}, | 94 {1, "", "function f() { this; }"}, |
94 | 95 |
95 // Variable called "arguments" | 96 // Variable called "arguments" |
96 {"", "var arguments;"}, | 97 {1, "", "var arguments;"}, |
97 {"", "var arguments; arguments = 5;"}, | 98 {1, "", "var arguments; arguments = 5;"}, |
98 {"", "if (true) { var arguments; }"}, | 99 {0, "", "if (true) { var arguments; }"}, |
99 {"", "if (true) { var arguments; arguments = 5; }"}, | 100 {1, "", "if (true) { var arguments; arguments = 5; }"}, |
100 {"", "var arguments; function f() { arguments; }"}, | 101 {1, "", "var arguments; function f() { arguments; }"}, |
101 {"", "var arguments; arguments = 5; function f() { arguments; }"}, | 102 {1, "", "var arguments; arguments = 5; function f() { arguments; }"}, |
102 {"", "var arguments; function f() { arguments = 5; }"}, | 103 {1, "", "var arguments; function f() { arguments = 5; }"}, |
103 | 104 |
104 {"", "let arguments;"}, | 105 {1, "", "let arguments;"}, |
105 {"", "let arguments; arguments = 5;"}, | 106 {1, "", "let arguments; arguments = 5;"}, |
106 {"", "if (true) { let arguments; }"}, | 107 {1, "", "if (true) { let arguments; }"}, |
107 {"", "if (true) { let arguments; arguments = 5; }"}, | 108 {1, "", "if (true) { let arguments; arguments = 5; }"}, |
108 {"", "let arguments; function f() { arguments; }"}, | 109 {1, "", "let arguments; function f() { arguments; }"}, |
109 {"", "let arguments; arguments = 5; function f() { arguments; }"}, | 110 {1, "", "let arguments; arguments = 5; function f() { arguments; }"}, |
110 {"", "let arguments; function f() { arguments = 5; }"}, | 111 {1, "", "let arguments; function f() { arguments = 5; }"}, |
111 | 112 |
112 {"", "const arguments = 5;"}, | 113 {1, "", "const arguments = 5;"}, |
113 {"", "if (true) { const arguments = 5; }"}, | 114 {1, "", "if (true) { const arguments = 5; }"}, |
114 {"", "const arguments = 5; function f() { arguments; }"}, | 115 {1, "", "const arguments = 5; function f() { arguments; }"}, |
115 | 116 |
116 // Destructuring declarations. | 117 // Destructuring declarations. |
117 {"", "var [var1, var2] = [1, 2];"}, | 118 {1, "", "var [var1, var2] = [1, 2];"}, |
118 {"", "var [var1, var2, [var3, var4]] = [1, 2, [3, 4]];"}, | 119 {1, "", "var [var1, var2, [var3, var4]] = [1, 2, [3, 4]];"}, |
119 {"", "var [{var1: var2}, {var3: var4}] = [{var1: 1}, {var3: 2}];"}, | 120 {1, "", "var [{var1: var2}, {var3: var4}] = [{var1: 1}, {var3: 2}];"}, |
120 {"", "var [var1, ...var2] = [1, 2, 3];"}, | 121 {1, "", "var [var1, ...var2] = [1, 2, 3];"}, |
121 | 122 |
122 {"", "var {var1: var2, var3: var4} = {var1: 1, var3: 2};"}, | 123 {1, "", "var {var1: var2, var3: var4} = {var1: 1, var3: 2};"}, |
123 {"", | 124 {1, "", |
124 "var {var1: var2, var3: {var4: var5}} = {var1: 1, var3: {var4: 2}};"}, | 125 "var {var1: var2, var3: {var4: var5}} = {var1: 1, var3: {var4: 2}};"}, |
125 {"", "var {var1: var2, var3: [var4, var5]} = {var1: 1, var3: [2, 3]};"}, | 126 {1, "", |
126 | 127 "var {var1: var2, var3: [var4, var5]} = {var1: 1, var3: [2, 3]};"}, |
127 {"", "let [var1, var2] = [1, 2];"}, | 128 |
128 {"", "let [var1, var2, [var3, var4]] = [1, 2, [3, 4]];"}, | 129 {1, "", "let [var1, var2] = [1, 2];"}, |
129 {"", "let [{var1: var2}, {var3: var4}] = [{var1: 1}, {var3: 2}];"}, | 130 {1, "", "let [var1, var2, [var3, var4]] = [1, 2, [3, 4]];"}, |
130 {"", "let [var1, ...var2] = [1, 2, 3];"}, | 131 {1, "", "let [{var1: var2}, {var3: var4}] = [{var1: 1}, {var3: 2}];"}, |
131 | 132 {1, "", "let [var1, ...var2] = [1, 2, 3];"}, |
132 {"", "let {var1: var2, var3: var4} = {var1: 1, var3: 2};"}, | 133 |
133 {"", | 134 {1, "", "let {var1: var2, var3: var4} = {var1: 1, var3: 2};"}, |
| 135 {1, "", |
134 "let {var1: var2, var3: {var4: var5}} = {var1: 1, var3: {var4: 2}};"}, | 136 "let {var1: var2, var3: {var4: var5}} = {var1: 1, var3: {var4: 2}};"}, |
135 {"", "let {var1: var2, var3: [var4, var5]} = {var1: 1, var3: [2, 3]};"}, | 137 {1, "", |
136 | 138 "let {var1: var2, var3: [var4, var5]} = {var1: 1, var3: [2, 3]};"}, |
137 {"", "const [var1, var2] = [1, 2];"}, | 139 |
138 {"", "const [var1, var2, [var3, var4]] = [1, 2, [3, 4]];"}, | 140 {1, "", "const [var1, var2] = [1, 2];"}, |
139 {"", "const [{var1: var2}, {var3: var4}] = [{var1: 1}, {var3: 2}];"}, | 141 {1, "", "const [var1, var2, [var3, var4]] = [1, 2, [3, 4]];"}, |
140 {"", "const [var1, ...var2] = [1, 2, 3];"}, | 142 {1, "", "const [{var1: var2}, {var3: var4}] = [{var1: 1}, {var3: 2}];"}, |
141 | 143 {1, "", "const [var1, ...var2] = [1, 2, 3];"}, |
142 {"", "const {var1: var2, var3: var4} = {var1: 1, var3: 2};"}, | 144 |
143 {"", | 145 {1, "", "const {var1: var2, var3: var4} = {var1: 1, var3: 2};"}, |
| 146 {1, "", |
144 "const {var1: var2, var3: {var4: var5}} = {var1: 1, var3: {var4: 2}};"}, | 147 "const {var1: var2, var3: {var4: var5}} = {var1: 1, var3: {var4: 2}};"}, |
145 {"", "const {var1: var2, var3: [var4, var5]} = {var1: 1, var3: [2, 3]};"}, | 148 {1, "", |
| 149 "const {var1: var2, var3: [var4, var5]} = {var1: 1, var3: [2, 3]};"}, |
146 | 150 |
147 // Referencing the function variable. | 151 // Referencing the function variable. |
148 {"", "inner;"}, | 152 {1, "", "inner;"}, |
149 {"", "function f1() { f1; }"}, | 153 {1, "", "function f1() { f1; }"}, |
150 {"", "function f1() { inner; }"}, | 154 {1, "", "function f1() { inner; }"}, |
151 {"", "function f1() { function f2() { f1; } }"}, | 155 {1, "", "function f1() { function f2() { f1; } }"}, |
152 {"", "function arguments() {}"}, | 156 {1, "", "function arguments() {}"}, |
153 {"", "function f1() {} function f1() {}"}, | 157 {1, "", "function f1() {} function f1() {}"}, |
154 {"", "var f1; function f1() {}"}, | 158 {1, "", "var f1; function f1() {}"}, |
155 | 159 |
156 // Assigning to the function variable. | 160 // Assigning to the function variable. |
157 {"", "inner = 3;"}, | 161 {1, "", "inner = 3;"}, |
158 {"", "function f1() { f1 = 3; }"}, | 162 {1, "", "function f1() { f1 = 3; }"}, |
159 {"", "function f1() { f1; } f1 = 3;"}, | 163 {1, "", "function f1() { f1; } f1 = 3;"}, |
160 {"", "function arguments() {} arguments = 8"}, | 164 {1, "", "function arguments() {} arguments = 8"}, |
161 {"", "function f1() {} f1 = 3; function f1() {}"}, | 165 {1, "", "function f1() {} f1 = 3; function f1() {}"}, |
162 | 166 |
163 // Evals. | 167 // Evals. |
164 {"", "var var1; eval('');"}, | 168 {1, "", "var var1; eval('');"}, |
165 {"", "var var1; function f1() { eval(''); }"}, | 169 {1, "", "var var1; function f1() { eval(''); }"}, |
166 {"", "let var1; eval('');"}, | 170 {1, "", "let var1; eval('');"}, |
167 {"", "let var1; function f1() { eval(''); }"}, | 171 {1, "", "let var1; function f1() { eval(''); }"}, |
168 {"", "const var1 = 10; eval('');"}, | 172 {1, "", "const var1 = 10; eval('');"}, |
169 {"", "const var1 = 10; function f1() { eval(''); }"}, | 173 {1, "", "const var1 = 10; function f1() { eval(''); }"}, |
170 | 174 |
171 // Standard for loops. | 175 // Standard for loops. |
172 {"", "for (var var1 = 0; var1 < 10; ++var1) { }"}, | 176 {1, "", "for (var var1 = 0; var1 < 10; ++var1) { }"}, |
173 {"", "for (let var1 = 0; var1 < 10; ++var1) { }"}, | 177 {1, "", "for (let var1 = 0; var1 < 10; ++var1) { }"}, |
174 {"", "for (const var1 = 0; var1 < 10; ++var1) { }"}, | 178 {1, "", "for (const var1 = 0; var1 < 10; ++var1) { }"}, |
175 | 179 |
176 {"", | 180 {1, "", |
177 "for (var var1 = 0; var1 < 10; ++var1) { function foo() { var1; } }"}, | 181 "for (var var1 = 0; var1 < 10; ++var1) { function foo() { var1; } }"}, |
178 {"", | 182 {1, "", |
179 "for (let var1 = 0; var1 < 10; ++var1) { function foo() { var1; } }"}, | 183 "for (let var1 = 0; var1 < 10; ++var1) { function foo() { var1; } }"}, |
180 {"", | 184 {1, "", |
181 "for (const var1 = 0; var1 < 10; ++var1) { function foo() { var1; } }"}, | 185 "for (const var1 = 0; var1 < 10; ++var1) { function foo() { var1; } }"}, |
182 {"", | 186 {1, "", |
183 "'use strict'; for (var var1 = 0; var1 < 10; ++var1) { function foo() { " | 187 "'use strict'; for (var var1 = 0; var1 < 10; ++var1) { function foo() { " |
184 "var1; } }"}, | 188 "var1; } }"}, |
185 {"", | 189 {1, "", |
186 "'use strict'; for (let var1 = 0; var1 < 10; ++var1) { function foo() { " | 190 "'use strict'; for (let var1 = 0; var1 < 10; ++var1) { function foo() { " |
187 "var1; } }"}, | 191 "var1; } }"}, |
188 {"", | 192 {1, "", |
189 "'use strict'; for (const var1 = 0; var1 < 10; ++var1) { function foo() " | 193 "'use strict'; for (const var1 = 0; var1 < 10; ++var1) { function foo() " |
190 "{ var1; } }"}, | 194 "{ var1; } }"}, |
191 | 195 |
192 // For of loops | 196 // For of loops |
193 {"", "for (var1 of [1, 2]) { }"}, | 197 {1, "", "for (var1 of [1, 2]) { }"}, |
194 {"", "for (var var1 of [1, 2]) { }"}, | 198 {1, "", "for (var var1 of [1, 2]) { }"}, |
195 {"", "for (let var1 of [1, 2]) { }"}, | 199 {1, "", "for (let var1 of [1, 2]) { }"}, |
196 {"", "for (const var1 of [1, 2]) { }"}, | 200 {1, "", "for (const var1 of [1, 2]) { }"}, |
197 | 201 |
198 {"", "for (var1 of [1, 2]) { var1; }"}, | 202 {1, "", "for (var1 of [1, 2]) { var1; }"}, |
199 {"", "for (var var1 of [1, 2]) { var1; }"}, | 203 {1, "", "for (var var1 of [1, 2]) { var1; }"}, |
200 {"", "for (let var1 of [1, 2]) { var1; }"}, | 204 {1, "", "for (let var1 of [1, 2]) { var1; }"}, |
201 {"", "for (const var1 of [1, 2]) { var1; }"}, | 205 {1, "", "for (const var1 of [1, 2]) { var1; }"}, |
202 | 206 |
203 {"", "for (var1 of [1, 2]) { var1 = 0; }"}, | 207 {1, "", "for (var1 of [1, 2]) { var1 = 0; }"}, |
204 {"", "for (var var1 of [1, 2]) { var1 = 0; }"}, | 208 {1, "", "for (var var1 of [1, 2]) { var1 = 0; }"}, |
205 {"", "for (let var1 of [1, 2]) { var1 = 0; }"}, | 209 {1, "", "for (let var1 of [1, 2]) { var1 = 0; }"}, |
206 {"", "for (const var1 of [1, 2]) { var1 = 0; }"}, | 210 {1, "", "for (const var1 of [1, 2]) { var1 = 0; }"}, |
207 | 211 |
208 {"", "for (var1 of [1, 2]) { function foo() { var1; } }"}, | 212 {1, "", "for (var1 of [1, 2]) { function foo() { var1; } }"}, |
209 {"", "for (var var1 of [1, 2]) { function foo() { var1; } }"}, | 213 {1, "", "for (var var1 of [1, 2]) { function foo() { var1; } }"}, |
210 {"", "for (let var1 of [1, 2]) { function foo() { var1; } }"}, | 214 {1, "", "for (let var1 of [1, 2]) { function foo() { var1; } }"}, |
211 {"", "for (const var1 of [1, 2]) { function foo() { var1; } }"}, | 215 {1, "", "for (const var1 of [1, 2]) { function foo() { var1; } }"}, |
212 | 216 |
213 {"", "for (var1 of [1, 2]) { function foo() { var1 = 0; } }"}, | 217 {1, "", "for (var1 of [1, 2]) { function foo() { var1 = 0; } }"}, |
214 {"", "for (var var1 of [1, 2]) { function foo() { var1 = 0; } }"}, | 218 {1, "", "for (var var1 of [1, 2]) { function foo() { var1 = 0; } }"}, |
215 {"", "for (let var1 of [1, 2]) { function foo() { var1 = 0; } }"}, | 219 {1, "", "for (let var1 of [1, 2]) { function foo() { var1 = 0; } }"}, |
216 {"", "for (const var1 of [1, 2]) { function foo() { var1 = 0; } }"}, | 220 {1, "", "for (const var1 of [1, 2]) { function foo() { var1 = 0; } }"}, |
217 | 221 |
218 // For in loops | 222 // For in loops |
219 {"", "for (var1 in {a: 6}) { }"}, | 223 {1, "", "for (var1 in {a: 6}) { }"}, |
220 {"", "for (var var1 in {a: 6}) { }"}, | 224 {1, "", "for (var var1 in {a: 6}) { }"}, |
221 {"", "for (let var1 in {a: 6}) { }"}, | 225 {1, "", "for (let var1 in {a: 6}) { }"}, |
222 {"", "for (const var1 in {a: 6}) { }"}, | 226 {1, "", "for (const var1 in {a: 6}) { }"}, |
223 | 227 |
224 {"", "for (var1 in {a: 6}) { var1; }"}, | 228 {1, "", "for (var1 in {a: 6}) { var1; }"}, |
225 {"", "for (var var1 in {a: 6}) { var1; }"}, | 229 {1, "", "for (var var1 in {a: 6}) { var1; }"}, |
226 {"", "for (let var1 in {a: 6}) { var1; }"}, | 230 {1, "", "for (let var1 in {a: 6}) { var1; }"}, |
227 {"", "for (const var1 in {a: 6}) { var1; }"}, | 231 {1, "", "for (const var1 in {a: 6}) { var1; }"}, |
228 | 232 |
229 {"", "for (var1 in {a: 6}) { var1 = 0; }"}, | 233 {1, "", "for (var1 in {a: 6}) { var1 = 0; }"}, |
230 {"", "for (var var1 in {a: 6}) { var1 = 0; }"}, | 234 {1, "", "for (var var1 in {a: 6}) { var1 = 0; }"}, |
231 {"", "for (let var1 in {a: 6}) { var1 = 0; }"}, | 235 {1, "", "for (let var1 in {a: 6}) { var1 = 0; }"}, |
232 {"", "for (const var1 in {a: 6}) { var1 = 0; }"}, | 236 {1, "", "for (const var1 in {a: 6}) { var1 = 0; }"}, |
233 | 237 |
234 {"", "for (var1 in {a: 6}) { function foo() { var1; } }"}, | 238 {1, "", "for (var1 in {a: 6}) { function foo() { var1; } }"}, |
235 {"", "for (var var1 in {a: 6}) { function foo() { var1; } }"}, | 239 {1, "", "for (var var1 in {a: 6}) { function foo() { var1; } }"}, |
236 {"", "for (let var1 in {a: 6}) { function foo() { var1; } }"}, | 240 {1, "", "for (let var1 in {a: 6}) { function foo() { var1; } }"}, |
237 {"", "for (const var1 in {a: 6}) { function foo() { var1; } }"}, | 241 {1, "", "for (const var1 in {a: 6}) { function foo() { var1; } }"}, |
238 | 242 |
239 {"", "for (var1 in {a: 6}) { function foo() { var1 = 0; } }"}, | 243 {1, "", "for (var1 in {a: 6}) { function foo() { var1 = 0; } }"}, |
240 {"", "for (var var1 in {a: 6}) { function foo() { var1 = 0; } }"}, | 244 {1, "", "for (var var1 in {a: 6}) { function foo() { var1 = 0; } }"}, |
241 {"", "for (let var1 in {a: 6}) { function foo() { var1 = 0; } }"}, | 245 {1, "", "for (let var1 in {a: 6}) { function foo() { var1 = 0; } }"}, |
242 {"", "for (const var1 in {a: 6}) { function foo() { var1 = 0; } }"}, | 246 {1, "", "for (const var1 in {a: 6}) { function foo() { var1 = 0; } }"}, |
243 | 247 |
244 {"", "for (var1 in {a: 6}) { function foo() { var1 = 0; } }"}, | 248 {1, "", "for (var1 in {a: 6}) { function foo() { var1 = 0; } }"}, |
245 {"", "for (var var1 in {a: 6}) { function foo() { var1 = 0; } }"}, | 249 {1, "", "for (var var1 in {a: 6}) { function foo() { var1 = 0; } }"}, |
246 {"", "for (let var1 in {a: 6}) { function foo() { var1 = 0; } }"}, | 250 {1, "", "for (let var1 in {a: 6}) { function foo() { var1 = 0; } }"}, |
247 {"", "for (const var1 in {a: 6}) { function foo() { var1 = 0; } }"}, | 251 {1, "", "for (const var1 in {a: 6}) { function foo() { var1 = 0; } }"}, |
248 | 252 |
249 // Loops without declarations | 253 // Loops without declarations |
250 {"", "var var1 = 0; for ( ; var1 < 2; ++var1) { }"}, | 254 {1, "", "var var1 = 0; for ( ; var1 < 2; ++var1) { }"}, |
251 {"", | 255 {1, "", |
252 "var var1 = 0; for ( ; var1 < 2; ++var1) { function foo() { var1; } }"}, | 256 "var var1 = 0; for ( ; var1 < 2; ++var1) { function foo() { var1; } }"}, |
253 {"", "var var1 = 0; for ( ; var1 > 2; ) { }"}, | 257 {1, "", "var var1 = 0; for ( ; var1 > 2; ) { }"}, |
254 {"", "var var1 = 0; for ( ; var1 > 2; ) { function foo() { var1; } }"}, | 258 {1, "", "var var1 = 0; for ( ; var1 > 2; ) { function foo() { var1; } }"}, |
255 {"", | 259 {1, "", |
256 "var var1 = 0; for ( ; var1 > 2; ) { function foo() { var1 = 6; } }"}, | 260 "var var1 = 0; for ( ; var1 > 2; ) { function foo() { var1 = 6; } }"}, |
257 | 261 |
258 {"", "var var1 = 0; for(var1; var1 < 2; ++var1) { }"}, | 262 {1, "", "var var1 = 0; for(var1; var1 < 2; ++var1) { }"}, |
259 {"", | 263 {1, "", |
260 "var var1 = 0; for (var1; var1 < 2; ++var1) { function foo() { var1; } " | 264 "var var1 = 0; for (var1; var1 < 2; ++var1) { function foo() { var1; } " |
261 "}"}, | 265 "}"}, |
262 {"", "var var1 = 0; for (var1; var1 > 2; ) { }"}, | 266 {1, "", "var var1 = 0; for (var1; var1 > 2; ) { }"}, |
263 {"", "var var1 = 0; for (var1; var1 > 2; ) { function foo() { var1; } }"}, | 267 {1, "", |
264 {"", | 268 "var var1 = 0; for (var1; var1 > 2; ) { function foo() { var1; } }"}, |
| 269 {1, "", |
265 "var var1 = 0; for (var1; var1 > 2; ) { function foo() { var1 = 6; } }"}, | 270 "var var1 = 0; for (var1; var1 > 2; ) { function foo() { var1 = 6; } }"}, |
266 | 271 |
267 // Sloppy block functions. | 272 // Sloppy block functions. |
268 {"", "if (true) { function f1() {} }"}, | 273 {1, "", "if (true) { function f1() {} }"}, |
269 {"", "if (true) { function f1() {} function f1() {} }"}, | 274 {1, "", "if (true) { function f1() {} function f1() {} }"}, |
270 {"", "if (true) { if (true) { function f1() {} } }"}, | 275 {1, "", "if (true) { if (true) { function f1() {} } }"}, |
271 {"", "if (true) { if (true) { function f1() {} function f1() {} } }"}, | 276 {1, "", "if (true) { if (true) { function f1() {} function f1() {} } }"}, |
272 {"", "if (true) { function f1() {} f1 = 3; }"}, | 277 {1, "", "if (true) { function f1() {} f1 = 3; }"}, |
273 | 278 |
274 {"", "if (true) { function f1() {} function foo() { f1; } }"}, | 279 {1, "", "if (true) { function f1() {} function foo() { f1; } }"}, |
275 {"", "if (true) { function f1() {} } function foo() { f1; }"}, | 280 {1, "", "if (true) { function f1() {} } function foo() { f1; }"}, |
276 {"", | 281 {1, "", |
277 "if (true) { function f1() {} function f1() {} function foo() { f1; } " | 282 "if (true) { function f1() {} function f1() {} function foo() { f1; } " |
278 "}"}, | 283 "}"}, |
279 {"", | 284 {1, "", |
280 "if (true) { function f1() {} function f1() {} } function foo() { f1; " | 285 "if (true) { function f1() {} function f1() {} } function foo() { f1; " |
281 "}"}, | 286 "}"}, |
282 {"", | 287 {1, "", |
283 "if (true) { if (true) { function f1() {} } function foo() { f1; } }"}, | 288 "if (true) { if (true) { function f1() {} } function foo() { f1; } }"}, |
284 {"", | 289 {1, "", |
285 "if (true) { if (true) { function f1() {} function f1() {} } function " | 290 "if (true) { if (true) { function f1() {} function f1() {} } function " |
286 "foo() { f1; } }"}, | 291 "foo() { f1; } }"}, |
287 {"", "if (true) { function f1() {} f1 = 3; function foo() { f1; } }"}, | 292 {1, "", "if (true) { function f1() {} f1 = 3; function foo() { f1; } }"}, |
288 {"", "if (true) { function f1() {} f1 = 3; } function foo() { f1; }"}, | 293 {1, "", "if (true) { function f1() {} f1 = 3; } function foo() { f1; }"}, |
289 | 294 |
290 {"", "function inner2() { if (true) { function f1() {} } }"}, | 295 {1, "", "function inner2() { if (true) { function f1() {} } }"}, |
291 {"", "function inner2() { if (true) { function f1() {} f1 = 3; } }"}, | 296 {1, "", "function inner2() { if (true) { function f1() {} f1 = 3; } }"}, |
292 | 297 |
293 {"", "var f1 = 1; if (true) { function f1() {} }"}, | 298 {1, "", "var f1 = 1; if (true) { function f1() {} }"}, |
294 {"", "var f1 = 1; if (true) { function f1() {} } function foo() { f1; }"}, | 299 {1, "", |
| 300 "var f1 = 1; if (true) { function f1() {} } function foo() { f1; }"}, |
295 }; | 301 }; |
296 | 302 |
297 for (unsigned i = 0; i < arraysize(inners); ++i) { | 303 for (unsigned i = 0; i < arraysize(inners); ++i) { |
298 // First compile with the lazy inner function and extract the scope data. | 304 // First compile with the lazy inner function and extract the scope data. |
299 const char* inner_function = lazy_inner; | 305 const char* inner_function = lazy_inner; |
300 int inner_function_len = Utf8LengthHelper(inner_function) - 4; | 306 int inner_function_len = Utf8LengthHelper(inner_function) - 4; |
301 | 307 |
302 int params_len = Utf8LengthHelper(inners[i].params); | 308 int params_len = Utf8LengthHelper(inners[i].params); |
303 int source_len = Utf8LengthHelper(inners[i].source); | 309 int source_len = Utf8LengthHelper(inners[i].source); |
304 int len = | 310 int len = |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
351 CHECK(i::Compiler::Analyze(&eager_info)); | 357 CHECK(i::Compiler::Analyze(&eager_info)); |
352 | 358 |
353 i::Scope* scope = | 359 i::Scope* scope = |
354 eager_info.literal()->scope()->inner_scope()->inner_scope(); | 360 eager_info.literal()->scope()->inner_scope()->inner_scope(); |
355 DCHECK_NOT_NULL(scope); | 361 DCHECK_NOT_NULL(scope); |
356 DCHECK_NULL(scope->sibling()); | 362 DCHECK_NULL(scope->sibling()); |
357 DCHECK(scope->is_function_scope()); | 363 DCHECK(scope->is_function_scope()); |
358 | 364 |
359 size_t index = 0; | 365 size_t index = 0; |
360 i::ScopeTestHelper::CompareScopeToData( | 366 i::ScopeTestHelper::CompareScopeToData( |
361 scope, lazy_info.preparsed_scope_data(), index); | 367 scope, lazy_info.preparsed_scope_data(), index, |
| 368 inners[i].precise_maybe_assigned); |
362 } | 369 } |
363 } | 370 } |
OLD | NEW |