mirror of
https://github.com/dart-lang/sdk
synced 2024-10-04 19:39:41 +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:
parent
30f0e0f4d5
commit
bd0391e66c
|
@ -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 =>
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue