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 |