[dart2js] Use addUnused method for unused fields in proto shaker

The call to the new method has fewer arguments, which helps code size.

Change-Id: I50668e54bfba07ac34e8db99a748f7d83c6e5be4
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/378382
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Stephen Adams <sra@google.com>
This commit is contained in:
Stephen Adams
2024-08-06 21:58:29 +00:00
committed by Commit Queue
parent d64e4dc981
commit e28c480e12
2 changed files with 56 additions and 19 deletions
+37 -19
View File
@@ -112,6 +112,10 @@ class ProtobufImpactHandler implements ConditionalImpactHandler {
_builderInfoAddMethod.getterType as ir.FunctionType,
const <ir.DartType>[ir.NullType()]);
late final ir.Procedure? _builderInfoAddUnusedMethod = _elementMap
.env.libraryIndex
.tryGetProcedure(protobufLibraryUri, 'BuilderInfo', 'addUnused');
static const String metadataFieldName = '_i';
// All of those methods have the dart field name as second positional
@@ -142,25 +146,39 @@ class ProtobufImpactHandler implements ConditionalImpactHandler {
ir.InstanceInvocation _buildProtobufMetadataPlaceholder(
ir.InstanceInvocation node) {
return ir.InstanceInvocation(
ir.InstanceAccessKind.Instance,
_CloneVisitorLenientVariables().clone(node.receiver),
_builderInfoAddMethod.name,
ir.Arguments(
<ir.Expression>[
ir.IntLiteral(0), // tagNumber
ir.NullLiteral(), // name
ir.NullLiteral(), // fieldType
ir.NullLiteral(), // defaultOrMaker
ir.NullLiteral(), // subBuilder
ir.NullLiteral(), // valueOf
ir.NullLiteral(), // enumValues
],
types: <ir.DartType>[const ir.NullType()],
),
interfaceTarget: _builderInfoAddMethod,
functionType: _typeOfBuilderInfoAddOfNull)
..fileOffset = node.fileOffset;
final addUnusedMethod = _builderInfoAddUnusedMethod;
if (addUnusedMethod == null) {
// Legacy version, call `add` method.
return ir.InstanceInvocation(
ir.InstanceAccessKind.Instance,
_CloneVisitorLenientVariables().clone(node.receiver),
_builderInfoAddMethod.name,
ir.Arguments(
<ir.Expression>[
ir.IntLiteral(0), // tagNumber
ir.NullLiteral(), // name
ir.NullLiteral(), // fieldType
ir.NullLiteral(), // defaultOrMaker
ir.NullLiteral(), // subBuilder
ir.NullLiteral(), // valueOf
ir.NullLiteral(), // enumValues
],
types: <ir.DartType>[const ir.NullType()],
),
interfaceTarget: _builderInfoAddMethod,
functionType: _typeOfBuilderInfoAddOfNull)
..fileOffset = node.fileOffset;
} else {
// New version, call `addUnused` method.
return ir.InstanceInvocation(
ir.InstanceAccessKind.Instance,
_CloneVisitorLenientVariables().clone(node.receiver),
addUnusedMethod.name,
ir.Arguments([]),
interfaceTarget: addUnusedMethod,
functionType: addUnusedMethod.getterType as ir.FunctionType)
..fileOffset = node.fileOffset;
}
}
@override
+19
View File
@@ -123,6 +123,11 @@ class LibraryIndex {
return _getLibraryIndex(library).getProcedure(containerName, memberName);
}
Procedure? tryGetProcedure(
String library, String containerName, String memberName) {
return _getLibraryIndex(library).tryGetProcedure(containerName, memberName);
}
Field getField(String library, String containerName, String memberName) {
return _getLibraryIndex(library).getField(containerName, memberName);
}
@@ -225,6 +230,10 @@ class _ContainerTable {
return _getContainerIndex(className).getProcedure(memberName);
}
Procedure? tryGetProcedure(String className, String memberName) {
return _getContainerIndex(className).tryGetProcedure(memberName);
}
Field getField(String className, String memberName) {
return _getContainerIndex(className).getField(memberName);
}
@@ -411,6 +420,16 @@ class _MemberTable {
return member;
}
Procedure? tryGetProcedure(String name) {
Member? member = members[name];
if (member == null) return null;
if (member is! Procedure) {
throw "Member '$name' in $containerName is not a Procedure: "
"${member} (${member.runtimeType}).";
}
return member;
}
Field getField(String name) {
Member member = getMember(name);
if (member is! Field) {