| // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| // @dart = 2.9 |
| |
| // dart2js regression test for issue 8781. |
| |
| import "package:expect/expect.dart"; |
| |
| class N { |
| var outgoing; |
| var incoming; |
| N(this.outgoing, this.incoming); |
| } |
| |
| class A { |
| int offset = 0; |
| var list; |
| var node; |
| |
| A(node) |
| : node = node, |
| list = node.outgoing; |
| |
| next() { |
| // dart2js used to update [offset] twice: once in the optimized |
| // version, which would bailout to the non-optimized version |
| // because [list] is not an Array, and once in the non-optimized |
| // version. |
| var edge = list[offset++]; |
| if (list == node.outgoing) { |
| list = node.incoming; |
| offset = 0; |
| } else |
| list = null; |
| return edge; |
| } |
| } |
| |
| main() { |
| var o = new A(new N(confuse([1]), confuse([2]))); |
| |
| for (var i = 1; i <= 2; i++) Expect.equals(i, o.next()); |
| |
| Expect.equals(null, o.list); |
| } |
| |
| // Use confuse to defeat type inferencing. |
| @pragma('dart2js:noInline') |
| @pragma('dart2js:assumeDynamic') |
| confuse(x) { |
| return x; |
| } |