[parser] Change NullValue usage This gets rid of (what is described in commented code as) InstantiatedTypeWithArgumentsTest, Subtype1TestCacheLookup, BoolTest. Running this through the benchmarker like this: ``` out/ReleaseX64/dart-sdk/bin/dart pkg/front_end/tool/benchmarker.dart \ --snapshot=pkg/analysis_server/bin/server.aot.1 \ --snapshot=pkg/analysis_server/bin/server.aot.2 \ --arguments="--disable-file-byte-store" \ --arguments="--train-using" \ --arguments="pkg/front_end/lib/" ``` (there `server.aot.1` is without this CL and `server.aot.2` is with) I get: ``` msec task-clock:u: -0.9614% +/- 0.3557% (-78.23 +/- 28.95) (8136.80 -> 8058.57) cycles:u: -1.0257% +/- 0.3626% (-348283560.66 +/- 123129577.69) (33955507948.94 -> 33607224388.28) instructions:u: -1.0595% +/- 0.0662% (-479117043.74 +/- 29935955.93) (45220681554.68 -> 44741564510.94) seconds time elapsed: -0.9548% +/- 0.3540% (-0.08 +/- 0.03) (8.15 -> 8.07) seconds user: -1.0649% +/- 0.4031% (-0.08 +/- 0.03) (7.80 -> 7.72) Scavenge( new space) goes from 130 to 129 Notice combined GC time goes from 2613 ms to 2608 ms (notice only 1 run each). ``` `StackImpl.pop` as reported by `perf report --no-children` goes from 0.81% to 0.34% (and I'm unsure why the apparent change seen as a whole is quite a bit bigger). Change-Id: Ife36da11215e0c8aa706d945f0ee5018ad03ab91 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/432340 Reviewed-by: Johnni Winther <johnniwinther@google.com> Commit-Queue: Jens Johansen <jensj@google.com>
diff --git a/pkg/_fe_analyzer_shared/lib/src/metadata/parser.dart b/pkg/_fe_analyzer_shared/lib/src/metadata/parser.dart index 2ba16bf..995ab18 100644 --- a/pkg/_fe_analyzer_shared/lib/src/metadata/parser.dart +++ b/pkg/_fe_analyzer_shared/lib/src/metadata/parser.dart
@@ -1279,13 +1279,15 @@ } } -enum _NullValues implements NullValue<Object> { - Arguments, - Expression, - FunctionTypeParameters, - Identifier, - TypeAnnotation, - TypeAnnotations, +class _NullValues { + static const NullValue Arguments = const NullValue("Argument"); + static const NullValue Expression = const NullValue("Expression"); + static const NullValue FunctionTypeParameters = const NullValue( + "FunctionTypeParameter", + ); + static const NullValue Identifier = const NullValue("Identifier"); + static const NullValue TypeAnnotation = const NullValue("TypeAnnotation"); + static const NullValue TypeAnnotations = const NullValue("TypeAnnotations"); } final Argument _dummyArgument = new PositionalArgument(
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart b/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart index 39bf0b2..c818239 100644 --- a/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart +++ b/pkg/_fe_analyzer_shared/lib/src/parser/stack_listener.dart
@@ -34,60 +34,87 @@ /// `NullValues.Expression` is pushed on the stack instead of `null` and when /// popping the entry `NullValues.Expression` is passed show how `null` is /// represented. -enum NullValues implements NullValue<Object> { - Arguments, - As, - AwaitToken, - Block, - BreakTarget, - CascadeReceiver, - Combinators, - Comments, - ConditionalUris, - ConditionallySelectedImport, - ConstructorInitializerSeparator, - ConstructorInitializers, - ConstructorReference, - ConstructorReferenceContinuationAfterTypeArguments, - ContinueTarget, - Deferred, - DocumentationComment, - EnumConstantInfo, - Expression, - ExtendsClause, - FieldInitializer, - FormalParameters, - FunctionBody, - FunctionBodyAsyncToken, - FunctionBodyStarToken, - HideClause, - Identifier, - IdentifierList, - Initializers, - Labels, - Metadata, - Modifiers, - Name, - NominalVariable, - NominalParameters, - OperatorList, - ParameterDefaultValue, - Pattern, - PatternList, - Prefix, - RecordTypeFieldList, - ShowClause, - StringLiteral, - StructuralParameters, - Token, - Type, - TypeArguments, - TypeBuilder, - TypeBuilderList, - TypeList, - VarFinalOrConstToken, - VariableDeclarationList, - WithClause, +class NullValues { + static const NullValue Arguments = const NullValue("Arguments"); + static const NullValue As = const NullValue("As"); + static const NullValue AwaitToken = const NullValue("AwaitToken"); + static const NullValue Block = const NullValue("Block"); + static const NullValue BreakTarget = const NullValue("BreakTarget"); + static const NullValue CascadeReceiver = const NullValue("CascadeReceiver"); + static const NullValue Combinators = const NullValue("Combinators"); + static const NullValue Comments = const NullValue("Comments"); + static const NullValue ConditionalUris = const NullValue("ConditionalUris"); + static const NullValue ConditionallySelectedImport = const NullValue( + "ConditionallySelectedImport", + ); + static const NullValue ConstructorInitializerSeparator = const NullValue( + "ConstructorInitializerSeparator", + ); + static const NullValue ConstructorInitializers = const NullValue( + "ConstructorInitializers", + ); + static const NullValue ConstructorReference = const NullValue( + "ConstructorReference", + ); + static const NullValue ConstructorReferenceContinuationAfterTypeArguments = + const NullValue("ConstructorReferenceContinuationAfterTypeArguments"); + static const NullValue ContinueTarget = const NullValue("ContinueTarget"); + static const NullValue Deferred = const NullValue("Deferred"); + static const NullValue DocumentationComment = const NullValue( + "DocumentationComment", + ); + static const NullValue EnumConstantInfo = const NullValue("EnumConstantInfo"); + static const NullValue Expression = const NullValue("Expression"); + static const NullValue ExtendsClause = const NullValue("ExtendsClause"); + static const NullValue FieldInitializer = const NullValue("FieldInitializer"); + static const NullValue FormalParameters = const NullValue("FormalParameters"); + static const NullValue FunctionBody = const NullValue("FunctionBody"); + static const NullValue FunctionBodyAsyncToken = const NullValue( + "FunctionBodyAsyncToken", + ); + static const NullValue FunctionBodyStarToken = const NullValue( + "FunctionBodyStarToken", + ); + static const NullValue HideClause = const NullValue("HideClause"); + static const NullValue Identifier = const NullValue("Identifier"); + static const NullValue IdentifierList = const NullValue("IdentifierList"); + static const NullValue Initializers = const NullValue("Initializers"); + static const NullValue Labels = const NullValue("Labels"); + static const NullValue Metadata = const NullValue("Metadata"); + static const NullValue Modifiers = const NullValue("Modifiers"); + static const NullValue Name = const NullValue("Name"); + static const NullValue NominalVariable = const NullValue("NominalVariable"); + static const NullValue NominalParameters = const NullValue( + "NominalParameters", + ); + static const NullValue OperatorList = const NullValue("OperatorList"); + static const NullValue ParameterDefaultValue = const NullValue( + "ParameterDefaultValue", + ); + static const NullValue Pattern = const NullValue("Pattern"); + static const NullValue PatternList = const NullValue("PatternList"); + static const NullValue Prefix = const NullValue("Prefix"); + static const NullValue RecordTypeFieldList = const NullValue( + "RecordTypeFieldList", + ); + static const NullValue ShowClause = const NullValue("ShowClause"); + static const NullValue StringLiteral = const NullValue("StringLiteral"); + static const NullValue StructuralParameters = const NullValue( + "StructuralParameters", + ); + static const NullValue Token = const NullValue("Token"); + static const NullValue Type = const NullValue("Type"); + static const NullValue TypeArguments = const NullValue("TypeArguments"); + static const NullValue TypeBuilder = const NullValue("TypeBuilder"); + static const NullValue TypeBuilderList = const NullValue("TypeBuilderList"); + static const NullValue TypeList = const NullValue("TypeList"); + static const NullValue VarFinalOrConstToken = const NullValue( + "VarFinalOrConstToken", + ); + static const NullValue VariableDeclarationList = const NullValue( + "VariableDeclarationList", + ); + static const NullValue WithClause = const NullValue("WithClause"); } abstract class StackListener extends Listener with StackChecker {
diff --git a/pkg/_fe_analyzer_shared/lib/src/util/null_value.dart b/pkg/_fe_analyzer_shared/lib/src/util/null_value.dart index b0a571b..78b5052 100644 --- a/pkg/_fe_analyzer_shared/lib/src/util/null_value.dart +++ b/pkg/_fe_analyzer_shared/lib/src/util/null_value.dart
@@ -9,8 +9,9 @@ /// `NullValues.Expression` is pushed on the stack instead of `null` and when /// popping the entry `NullValues.Expression` is passed show how `null` is /// represented. -class NullValue<T> { - const NullValue(); +final class NullValue { + final String T; + const NullValue(this.T); @override String toString() => "NullValue<$T>";
diff --git a/pkg/_fe_analyzer_shared/lib/src/util/value_kind.dart b/pkg/_fe_analyzer_shared/lib/src/util/value_kind.dart index c142577..8634419a 100644 --- a/pkg/_fe_analyzer_shared/lib/src/util/value_kind.dart +++ b/pkg/_fe_analyzer_shared/lib/src/util/value_kind.dart
@@ -22,8 +22,7 @@ /// A [ValueKind] for a particular type [T], optionally with a recognized /// [NullValue]. class SingleValueKind<T> implements ValueKind { - // TODO(johnniwinther): Type this as `NullValue<T>?`. - final NullValue<Object>? nullValue; + final NullValue? nullValue; const SingleValueKind([this.nullValue]);
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart index 40e1793..285b5d4 100644 --- a/pkg/analyzer/lib/src/fasta/ast_builder.dart +++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -1884,7 +1884,7 @@ var implementsClause = pop(NullValues.IdentifierList) as ImplementsClauseImpl?; var representation = - pop(const NullValue<RepresentationDeclarationImpl>()) + pop(const NullValue("RepresentationDeclarationImpl")) as RepresentationDeclarationImpl?; var constKeyword = pop() as Token?; @@ -3164,7 +3164,7 @@ fieldName = parser.rewriter.insertSyntheticIdentifier(typeNameToken); } - push(constKeyword ?? const NullValue<Token>()); + push(constKeyword ?? const NullValue("Token")); push( RepresentationDeclarationImpl( @@ -5418,9 +5418,9 @@ @override void handleNoPrimaryConstructor(Token token, Token? constKeyword) { - push(constKeyword ?? const NullValue<Token>()); + push(constKeyword ?? const NullValue("Token")); - push(const NullValue<RepresentationDeclarationImpl>()); + push(const NullValue("RepresentationDeclarationImpl")); } @override
diff --git a/pkg/front_end/lib/src/type_inference/stack_values.dart b/pkg/front_end/lib/src/type_inference/stack_values.dart index df39835..03e8e0d 100644 --- a/pkg/front_end/lib/src/type_inference/stack_values.dart +++ b/pkg/front_end/lib/src/type_inference/stack_values.dart
@@ -7,14 +7,10 @@ import 'package:kernel/ast.dart' as type; class NullValues { - static const NullValue<type.Expression> Expression = - const NullValue<type.Expression>(); - static const NullValue<type.MapLiteralEntry> MapLiteralEntry = - const NullValue<type.MapLiteralEntry>(); - static const NullValue<type.Pattern> Pattern = - const NullValue<type.Pattern>(); - static const NullValue<type.Statement> Statement = - const NullValue<type.Statement>(); + static const NullValue Expression = const NullValue("Expression"); + static const NullValue MapLiteralEntry = const NullValue("MapLiteralEntry"); + static const NullValue Pattern = const NullValue("Pattern"); + static const NullValue Statement = const NullValue("Statement"); } class ValueKinds {