ba40d9bece
Change-Id: I73edeeaf4934899b71d6335dcb4b4b54dce46bae Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/426340 Auto-Submit: Bob Nystrom <rnystrom@google.com> Reviewed-by: Nate Biggs <natebiggs@google.com> Commit-Queue: Nate Biggs <natebiggs@google.com>
235 lines
4.3 KiB
Dart
235 lines
4.3 KiB
Dart
// 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")');
|
|
}
|