OLD | NEW |
| (Empty) |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 // The program crashed with segfault because we when we first compile foo | |
6 // and bar we allocate all four variables (a, b, c and d) to the context. | |
7 // When we compile foo the second time (with optimizations) we allocate | |
8 // only c and d to the context. This happened because parser folds away | |
9 // "${a}" and "${b}" as constant expressions when parsing bar on its own, | |
10 // i.e. the expressions were not parsed again and thus a and b were not | |
11 // marked as captured. | |
12 // This caused a mismatch between a context that bar expects and that | |
13 // the optimized version of foo produces. | |
14 | |
15 foo() { | |
16 const a = 1; | |
17 const b = 2; | |
18 var c = 3; | |
19 var d = 4; | |
20 | |
21 bar() { | |
22 if ("${a}" != "1") throw "failed"; | |
23 if ("${b}" != "2") throw "failed"; | |
24 if ("${c}" != "3") throw "failed"; | |
25 if ("${d}" != "4") throw "failed"; | |
26 } | |
27 | |
28 bar(); | |
29 } | |
30 | |
31 main() { | |
32 for (var i = 0; i < 50000; i++) foo(); | |
33 } | |
OLD | NEW |