blob: c4b8d5b11e699abb948aa08e6437d4a202ce5f30 [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:_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")');
}