5492cfd1bc
This ensures that `_Enum.index` is always available for switch strength reduction optimizations. Most real programs use the index of at least one `enum`, so the field is not usually elided. This change makes small tests and benchmarks behave more like real programs where these optimizations happen. Bug: #51657 CoreLibraryReviewExempt: dart2js specific annotation Change-Id: If98e483d7cce265e823fd574565089e328215cca Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/446481 Reviewed-by: Nate Biggs <natebiggs@google.com> Commit-Queue: Stephen Adams <sra@google.com> Reviewed-by: Mayank Patke <fishythefish@google.com>
87 lines
1.9 KiB
Dart
87 lines
1.9 KiB
Dart
// Copyright (c) 2019, 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.
|
|
|
|
enum Enum { a, b, c }
|
|
|
|
@pragma('dart2js:never-inline')
|
|
tester1() {}
|
|
|
|
/*member: tester2:params=0*/
|
|
@pragma('dart2js:never-inline')
|
|
tester2() {}
|
|
|
|
/*member: tester3:params=0*/
|
|
@pragma('dart2js:never-inline')
|
|
tester3() {}
|
|
|
|
class Class {
|
|
/*member: Class.state1:elided*/
|
|
final int state1;
|
|
|
|
/*member: Class.state2:elided*/
|
|
final Enum state2;
|
|
|
|
Class({this.state1 = 1, this.state2 = Enum.c});
|
|
|
|
/*member: Class.method1a:calls=[tester2(0)],params=0*/
|
|
@pragma('dart2js:never-inline')
|
|
method1a() {
|
|
if (state1 == 0) {
|
|
return tester1();
|
|
} else if (state1 == 1) {
|
|
return tester2();
|
|
} else if (state1 == 2) {
|
|
return tester3();
|
|
}
|
|
}
|
|
|
|
// TODO(johnniwinther): Inline switch cases with constant expressions.
|
|
/*member: Class.method1b:calls=[tester2(0)],params=0,switch*/
|
|
@pragma('dart2js:never-inline')
|
|
method1b() {
|
|
switch (state1) {
|
|
case 0:
|
|
return tester1();
|
|
case 1:
|
|
return tester2();
|
|
case 2:
|
|
return tester3();
|
|
}
|
|
}
|
|
|
|
/*member: Class.method2a:calls=[tester3(0)],params=0*/
|
|
@pragma('dart2js:never-inline')
|
|
method2a() {
|
|
if (state2 == Enum.a) {
|
|
return tester1();
|
|
} else if (state2 == Enum.b) {
|
|
return tester2();
|
|
} else if (state2 == Enum.c) {
|
|
return tester3();
|
|
}
|
|
}
|
|
|
|
/*member: Class.method2b:calls=[tester3(0)],params=0,switch*/
|
|
@pragma('dart2js:never-inline')
|
|
method2b() {
|
|
switch (state2) {
|
|
case Enum.a:
|
|
return tester1();
|
|
case Enum.b:
|
|
return tester2();
|
|
case Enum.c:
|
|
return tester3();
|
|
}
|
|
}
|
|
}
|
|
|
|
/*member: main:calls=*,params=0*/
|
|
main() {
|
|
var c = Class();
|
|
c.method1a();
|
|
c.method1b();
|
|
c.method2a();
|
|
c.method2b();
|
|
}
|