1
0
mirror of https://github.com/dart-lang/sdk synced 2024-07-05 17:30:16 +00:00

[dart2js] Enable CFE constant evaluation.

Change-Id: Ib449906bbfd95b6510e701606c43ef4c4169313b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/240601
Reviewed-by: Sigmund Cherem <sigmund@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Joshua Litt <joshualitt@google.com>
This commit is contained in:
Joshua Litt 2022-04-12 16:57:16 +00:00 committed by Commit Bot
parent 30f0e0f4d5
commit bd0391e66c
5 changed files with 35 additions and 6 deletions

View File

@ -71,9 +71,12 @@ class Dart2jsTarget extends Target {
final CompilerOptions? options; final CompilerOptions? options;
final bool canPerformGlobalTransforms; final bool canPerformGlobalTransforms;
final bool supportsUnevaluatedConstants;
Dart2jsTarget(this.name, this.flags, Dart2jsTarget(this.name, this.flags,
{this.options, this.canPerformGlobalTransforms = true}); {this.options,
this.canPerformGlobalTransforms = true,
this.supportsUnevaluatedConstants = true});
@override @override
bool get enableNoSuchMethodForwarders => true; bool get enableNoSuchMethodForwarders => true;
@ -223,8 +226,8 @@ class Dart2jsTarget extends Target {
} }
@override @override
ConstantsBackend get constantsBackend => ConstantsBackend get constantsBackend => Dart2jsConstantsBackend(
const Dart2jsConstantsBackend(supportsUnevaluatedConstants: true); supportsUnevaluatedConstants: supportsUnevaluatedConstants);
@override @override
DartLibrarySupport get dartLibrarySupport => DartLibrarySupport get dartLibrarySupport =>

View File

@ -87,6 +87,9 @@ class FeatureOptions {
/// to reduce generated code size. /// to reduce generated code size.
FeatureOption simpleAsyncToFuture = FeatureOption('simple-async-to-future'); FeatureOption simpleAsyncToFuture = FeatureOption('simple-async-to-future');
/// Whether or not the CFE should evaluate constants.
FeatureOption cfeConstants = FeatureOption('cfe-constants');
/// [FeatureOption]s which are shipped and cannot be toggled. /// [FeatureOption]s which are shipped and cannot be toggled.
late final List<FeatureOption> shipped = [ late final List<FeatureOption> shipped = [
newHolders, newHolders,
@ -102,7 +105,8 @@ class FeatureOptions {
late final List<FeatureOption> canary = [ late final List<FeatureOption> canary = [
writeUtf8, writeUtf8,
newDumpInfo, newDumpInfo,
simpleAsyncToFuture simpleAsyncToFuture,
cfeConstants,
]; ];
/// Forces canary feature on. This must run after [Option].parse. /// Forces canary feature on. This must run after [Option].parse.

View File

@ -213,8 +213,12 @@ Future<_LoadFromSourceResult> _loadFromSource(
fe.InitializedCompilerState initializedCompilerState, fe.InitializedCompilerState initializedCompilerState,
String targetName) async { String targetName) async {
bool verbose = false; bool verbose = false;
bool cfeConstants = options.features.cfeConstants.isEnabled;
Map<String, String> environment = cfeConstants ? options.environment : null;
Target target = Dart2jsTarget(targetName, TargetFlags(), Target target = Dart2jsTarget(targetName, TargetFlags(),
options: options, canPerformGlobalTransforms: true); options: options,
canPerformGlobalTransforms: true,
supportsUnevaluatedConstants: !cfeConstants);
fe.FileSystem fileSystem = CompilerFileSystem(compilerInput); fe.FileSystem fileSystem = CompilerFileSystem(compilerInput);
fe.Verbosity verbosity = options.verbosity; fe.Verbosity verbosity = options.verbosity;
fe.DiagnosticMessageHandler onDiagnostic = (fe.DiagnosticMessage message) { fe.DiagnosticMessageHandler onDiagnostic = (fe.DiagnosticMessage message) {
@ -237,6 +241,7 @@ Future<_LoadFromSourceResult> _loadFromSource(
..librariesSpecificationUri = options.librariesSpecificationUri ..librariesSpecificationUri = options.librariesSpecificationUri
..packagesFileUri = options.packageConfig ..packagesFileUri = options.packageConfig
..explicitExperimentalFlags = options.explicitExperimentalFlags ..explicitExperimentalFlags = options.explicitExperimentalFlags
..environmentDefines = environment
..verbose = verbose ..verbose = verbose
..fileSystem = fileSystem ..fileSystem = fileSystem
..onDiagnostic = onDiagnostic ..onDiagnostic = onDiagnostic
@ -266,6 +271,7 @@ Future<_LoadFromSourceResult> _loadFromSource(
dependencies, dependencies,
options.packageConfig, options.packageConfig,
explicitExperimentalFlags: options.explicitExperimentalFlags, explicitExperimentalFlags: options.explicitExperimentalFlags,
environmentDefines: environment,
nnbdMode: nnbdMode:
options.useLegacySubtyping ? fe.NnbdMode.Weak : fe.NnbdMode.Strong, options.useLegacySubtyping ? fe.NnbdMode.Weak : fe.NnbdMode.Strong,
invocationModes: options.cfeInvocationModes, invocationModes: options.cfeInvocationModes,

View File

@ -129,6 +129,7 @@ InitializedCompilerState initializeCompiler(
List<Uri> additionalDills, List<Uri> additionalDills,
Uri packagesFileUri, Uri packagesFileUri,
{required Map<ExperimentalFlag, bool> explicitExperimentalFlags, {required Map<ExperimentalFlag, bool> explicitExperimentalFlags,
Map<String, String>? environmentDefines,
bool verify: false, bool verify: false,
NnbdMode? nnbdMode, NnbdMode? nnbdMode,
Set<InvocationMode> invocationModes: const <InvocationMode>{}, Set<InvocationMode> invocationModes: const <InvocationMode>{},
@ -144,6 +145,7 @@ InitializedCompilerState initializeCompiler(
equalLists(oldState.options.additionalDills, additionalDills) && equalLists(oldState.options.additionalDills, additionalDills) &&
equalMaps(oldState.options.explicitExperimentalFlags, equalMaps(oldState.options.explicitExperimentalFlags,
explicitExperimentalFlags) && explicitExperimentalFlags) &&
equalMaps(oldState.options.environmentDefines, environmentDefines) &&
oldState.options.verify == verify && oldState.options.verify == verify &&
oldState.options.nnbdMode == nnbdMode && oldState.options.nnbdMode == nnbdMode &&
equalSets(oldState.options.invocationModes, invocationModes) && equalSets(oldState.options.invocationModes, invocationModes) &&
@ -157,6 +159,8 @@ InitializedCompilerState initializeCompiler(
..librariesSpecificationUri = librariesSpecificationUri ..librariesSpecificationUri = librariesSpecificationUri
..packagesFileUri = packagesFileUri ..packagesFileUri = packagesFileUri
..explicitExperimentalFlags = explicitExperimentalFlags ..explicitExperimentalFlags = explicitExperimentalFlags
..environmentDefines = environmentDefines
..errorOnUnevaluatedConstant = environmentDefines != null ? true : false
..verify = verify ..verify = verify
..invocationModes = invocationModes ..invocationModes = invocationModes
..verbosity = verbosity; ..verbosity = verbosity;

View File

@ -234,6 +234,18 @@ ProcessedOptions analyzeCommandLine(String programName,
}); });
} }
// In order to facilitate the roll out of CFE constants on Dart2js, we need to
// be able to support both passing '--no-defines' and also evaluating CFE
// constants when the target supports it. This is so we can easily enable or
// disable fully evaluating constants in the CFE with a flag. This can be
// deleted when the CFE fully evaluates constants for Dart2js in all cases.
Map<String, String>? environmentDefines;
if (noDefines && target.constantsBackend.supportsUnevaluatedConstants) {
// Pass a null environment.
} else {
environmentDefines = parsedOptions.defines;
}
CompilerOptions compilerOptions = new CompilerOptions() CompilerOptions compilerOptions = new CompilerOptions()
..compileSdk = compileSdk ..compileSdk = compileSdk
..fileSystem = fileSystem ..fileSystem = fileSystem
@ -249,7 +261,7 @@ ProcessedOptions analyzeCommandLine(String programName,
..verify = verify ..verify = verify
..skipPlatformVerification = skipPlatformVerification ..skipPlatformVerification = skipPlatformVerification
..explicitExperimentalFlags = explicitExperimentalFlags ..explicitExperimentalFlags = explicitExperimentalFlags
..environmentDefines = noDefines ? null : parsedOptions.defines ..environmentDefines = environmentDefines
..nnbdMode = nnbdMode ..nnbdMode = nnbdMode
..enableUnscheduledExperiments = enableUnscheduledExperiments ..enableUnscheduledExperiments = enableUnscheduledExperiments
..additionalDills = linkDependencies ..additionalDills = linkDependencies