| // 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. |
| |
| import 'dart:_js_helper' as js; |
| |
| import 'dart:_foreign_helper' show JS; |
| |
| import 'package:expect/expect.dart'; |
| |
| var x; |
| |
| foo(c) { |
| x = "in foo function"; |
| c.c_field = x; |
| } |
| |
| @js.NoSideEffects() |
| @js.NoInline() |
| bar(d) { |
| x = "in bar function"; |
| d.d_field = x; |
| } |
| |
| class C { |
| var c_field; |
| m() => c_field; |
| } |
| |
| class D { |
| var d_field; |
| m() => d_field; |
| } |
| |
| @js.NoSideEffects() |
| @js.NoInline() |
| @js.NoThrows() |
| baz() { |
| throw 'in baz function'; |
| } |
| |
| @js.NoInline() |
| geeNoInline() { |
| // Use `gee` several times, so `gee` isn't used only once (and thus inlinable |
| // independently of its size). |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| gee(); |
| } |
| |
| @js.ForceInline() |
| // Big function that would normally not be inlinable. |
| gee([c]) { |
| if (c != null) { |
| x = "in gee function"; |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| geeNoInline(); |
| } |
| } |
| |
| main() { |
| JS('', 'String("in main function")'); |
| var c; |
| if (new DateTime.now().millisecondsSinceEpoch != 42) { |
| c = new C(); |
| print(c.m()); |
| foo(c); |
| print(c.m()); |
| } else { |
| var d = new D(); |
| print(d.m()); |
| bar(d); |
| print(d.m()); |
| } |
| print(c.m()); |
| simple(); |
| noinline(); |
| baz(); // This call should be eliminated by the optimizer. |
| gee(new C()); |
| print(x); |
| check(JS('', 'arguments.callee')); |
| } |
| |
| @js.NoInline() |
| check(func) { |
| JS('', 'String("in check function")'); |
| var source = JS('String', 'String(#)', func); |
| print(source); |
| Expect.isTrue(source.contains('"in main function"'), "should contain 'main'"); |
| Expect.isTrue( |
| source.contains('"in simple function"'), "should inline 'simple'"); |
| Expect.isTrue(source.contains('"in foo function"'), "should inline 'foo'"); |
| Expect.isFalse( |
| source.contains('"in bar function"'), "should not inline 'bar'"); |
| Expect.isFalse( |
| source.contains('"in check function"'), "should not inline 'check'"); |
| Expect.isFalse(source.contains('"in noinline function"'), |
| "should not inline 'noinline'"); |
| Expect.equals(2, new RegExp(r'\.c_field').allMatches(source).length, |
| "should contain r'\.c_field' exactly twice"); |
| Expect.isFalse( |
| source.contains('.d_field'), "should not contain r'\.d_field'"); |
| Expect.isTrue(source.contains('"in gee function"'), "must inline 'gee'"); |
| } |
| |
| simple() { |
| JS('', 'String("in simple function")'); |
| } |
| |
| @js.NoInline() |
| noinline() { |
| JS('', 'String("in noinline function")'); |
| } |