Files
sdk/tests/web/native/optimization_hints_test.dart
T
Sigmund Cherem 912005267d [web] rename suite dart2js -> web.
Change-Id: I46be49b2effec3e38a3dc44cd45cfe736f77fa78
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/182680
Commit-Queue: Sigmund Cherem <sigmund@google.com>
Reviewed-by: Joshua Litt <joshualitt@google.com>
Reviewed-by: Nicholas Shahan <nshahan@google.com>
Reviewed-by: Stephen Adams <sra@google.com>
2021-02-04 23:11:32 +00:00

222 lines
4.2 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")');
}