// 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:_foreign_helper' show JS; import 'package:expect/expect.dart'; var x; foo(c) { x = "in foo function"; c.c_field = x; } @pragma('dart2js:noSideEffects') @pragma('dart2js: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; } @pragma('dart2js:noSideEffects') @pragma('dart2js:noInline') @pragma('dart2js:noThrows') baz() { throw 'in baz function'; } @pragma('dart2js: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(); } @pragma('dart2js:tryInline') // 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')); } @pragma('dart2js: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")'); } @pragma('dart2js:noInline') noinline() { JS('', 'String("in noinline function")'); }