Files
sdk/pkg/compiler/test/codegen/model_data/effectively_constant_state.dart
T
Stephen Adams 5492cfd1bc [dart2js] Never elide _Enum.index
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>
2025-08-27 11:44:04 -07:00

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();
}