[CFE] Cache calls in type inference that almost always creates a FunctionType

InstanceAccessTarget calls "base.getGetterTypeForMemberTarget" a lot;
this CL caches the result which is almost always a new FunctionType,
thus creating fewer FunctionTypes.
When compiling compile.dart ~29% fewer:
Before this CL, compiling compile.dart created a little over 217k
FunctionTypes (down in a previous CL from almost 263k); with this CL
"only" ~153.5k FunctionTypes are created.

Change-Id: Ib110ed5e0d152a3b86044f20dc50f0924a083f46
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/298601
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Jens Johansen <jensj@google.com>
This commit is contained in:
Jens Johansen 2023-04-27 07:30:41 +00:00 committed by Commit Queue
parent f72b7ae86f
commit 255d755975

View file

@ -461,6 +461,9 @@ class InstanceAccessTarget extends ObjectAccessTarget {
@override
final Member member;
DartType? _cachedGetterType;
InferenceVisitorBase? _cachedGetterTypeBase;
/// Creates an access to the instance [member].
InstanceAccessTarget.nonNullable(this.receiverType, this.member)
: super.internal(ObjectAccessTargetKind.instanceMember);
@ -479,16 +482,18 @@ class InstanceAccessTarget extends ObjectAccessTarget {
@override
FunctionType getFunctionType(InferenceVisitorBase base) {
return _getFunctionType(
base,
base.getGetterTypeForMemberTarget(member, receiverType,
isSuper: isSuperMember));
return _getFunctionType(base, getGetterType(base));
}
@override
DartType getGetterType(InferenceVisitorBase base) {
return base.getGetterTypeForMemberTarget(member, receiverType,
if (_cachedGetterType != null && identical(_cachedGetterTypeBase, base)) {
return _cachedGetterType!;
}
_cachedGetterType = base.getGetterTypeForMemberTarget(member, receiverType,
isSuper: isSuperMember);
_cachedGetterTypeBase = base;
return _cachedGetterType!;
}
@override
@ -536,10 +541,7 @@ class InstanceAccessTarget extends ObjectAccessTarget {
@override
DartType getIndexKeyType(InferenceVisitorBase base) {
FunctionType functionType = _getFunctionType(
base,
base.getGetterTypeForMemberTarget(member, receiverType,
isSuper: isSuperMember));
FunctionType functionType = _getFunctionType(base, getGetterType(base));
if (functionType.positionalParameters.length >= 1) {
return functionType.positionalParameters[0];
}
@ -548,10 +550,7 @@ class InstanceAccessTarget extends ObjectAccessTarget {
@override
DartType getIndexSetValueType(InferenceVisitorBase base) {
FunctionType functionType = _getFunctionType(
base,
base.getGetterTypeForMemberTarget(member, receiverType,
isSuper: isSuperMember));
FunctionType functionType = _getFunctionType(base, getGetterType(base));
if (functionType.positionalParameters.length >= 2) {
return functionType.positionalParameters[1];
}
@ -560,19 +559,13 @@ class InstanceAccessTarget extends ObjectAccessTarget {
@override
DartType getReturnType(InferenceVisitorBase base) {
FunctionType functionType = _getFunctionType(
base,
base.getGetterTypeForMemberTarget(member, receiverType,
isSuper: isSuperMember));
FunctionType functionType = _getFunctionType(base, getGetterType(base));
return functionType.returnType;
}
@override
DartType getBinaryOperandType(InferenceVisitorBase base) {
FunctionType functionType = _getFunctionType(
base,
base.getGetterTypeForMemberTarget(member, receiverType,
isSuper: isSuperMember));
FunctionType functionType = _getFunctionType(base, getGetterType(base));
if (functionType.positionalParameters.isNotEmpty) {
return functionType.positionalParameters.first;
}