| // Copyright (c) 2014, 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. |
| // VMOptions=-DUSE_CPS_IR=true |
| |
| // Tests of closures. |
| |
| library closures_test; |
| |
| import 'js_backend_cps_ir.dart'; |
| |
| const List<TestEntry> tests = const [ |
| const TestEntry(""" |
| main(x) { |
| a() { |
| return x; |
| } |
| x = x + '1'; |
| print(a()); |
| } |
| """, |
| r""" |
| function(x) { |
| var box_0, a; |
| box_0 = {}; |
| box_0.x_0 = x; |
| a = new V.main_a(box_0); |
| x = box_0.x_0; |
| box_0.x_0 = J.getInterceptor$ns(x).$add(x, "1"); |
| P.print(a.call$0()); |
| return null; |
| }"""), |
| |
| const TestEntry(""" |
| main(x) { |
| a() { |
| return x; |
| } |
| print(a()); |
| } |
| """, |
| r""" |
| function(x) { |
| P.print(new V.main_a(x).call$0()); |
| return null; |
| }"""), |
| |
| const TestEntry(""" |
| main() { |
| var x = 122; |
| var a = () => x; |
| x = x + 1; |
| print(a()); |
| } |
| """, |
| r""" |
| function() { |
| var box_0, a, x; |
| box_0 = {}; |
| box_0.x_0 = 122; |
| a = new V.main_closure(box_0); |
| x = box_0.x_0; |
| box_0.x_0 = J.getInterceptor$ns(x).$add(x, 1); |
| P.print(a.call$0()); |
| return null; |
| }"""), |
| |
| const TestEntry(""" |
| main() { |
| var x = 122; |
| var a = () { |
| var y = x; |
| return () => y; |
| }; |
| x = x + 1; |
| print(a()()); |
| } |
| """, |
| r""" |
| function() { |
| var box_0, a, x; |
| box_0 = {}; |
| box_0.x_0 = 122; |
| a = new V.main_closure(box_0); |
| x = box_0.x_0; |
| box_0.x_0 = J.getInterceptor$ns(x).$add(x, 1); |
| P.print(a.call$0().call$0()); |
| return null; |
| }"""), |
| |
| const TestEntry(""" |
| main() { |
| var a; |
| for (var i=0; i<10; i++) { |
| a = () => i; |
| } |
| print(a()); |
| } |
| """, |
| r""" |
| function() { |
| var a, i; |
| a = null; |
| i = 0; |
| while (P.identical(J.getInterceptor$n(i).$lt(i, 10), true)) { |
| a = new V.main_closure(i); |
| i = J.getInterceptor$ns(i).$add(i, 1); |
| } |
| P.print(a.call$0()); |
| return null; |
| }"""), |
| |
| const TestEntry.forMethod('function(A#b)', """ |
| class A { |
| a() => 1; |
| b() => () => a(); |
| } |
| main() { |
| print(new A().b()()); |
| } |
| """, |
| r""" |
| function() { |
| return new V.A_b_closure(this); |
| }"""), |
| ]; |
| |
| void main() { |
| runTests(tests); |
| } |