blob: f62324e99712963f08020541aa0dd33d33e8a427 [file] [log] [blame]
// 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")');
}