Skip to content

Commit 6acaf9b

Browse files
fishythefishCommit Queue
authored andcommitted
[dart2js] Account for late sentinels in trivial inference results.
Fixes: #49599 Fixes: #55058 Fixes: #60115 Change-Id: I66673b6e467b54428e8d5ba317eec8aa3248645f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/258961 Reviewed-by: Nate Biggs <[email protected]> Commit-Queue: Mayank Patke <[email protected]>
1 parent 3df2adc commit 6acaf9b

File tree

12 files changed

+86
-39
lines changed

12 files changed

+86
-39
lines changed

pkg/compiler/lib/src/dump_info.dart

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -478,8 +478,8 @@ class ElementInfoCollector {
478478
GlobalTypeInferenceMemberResult _resultOfMember(MemberEntity e) =>
479479
_globalInferenceResults.resultOfMember(e);
480480

481-
AbstractValue _resultOfParameter(Local e) =>
482-
_globalInferenceResults.resultOfParameter(e);
481+
AbstractValue _resultOfParameter(Local e, MemberEntity? member) =>
482+
_globalInferenceResults.resultOfParameter(e, member);
483483

484484
FieldInfo? visitField(FieldEntity field) {
485485
AbstractValue inferredType = _resultOfMember(field).type;
@@ -695,7 +695,9 @@ class ElementInfoCollector {
695695
_globalInferenceResults.globalLocalsMap,
696696
function,
697697
(parameter) {
698-
inferredParameterTypes.add('${_resultOfParameter(parameter)}');
698+
inferredParameterTypes.add(
699+
'${_resultOfParameter(parameter, function)}',
700+
);
699701
},
700702
);
701703
int parameterIndex = 0;
@@ -1263,8 +1265,8 @@ class DumpInfoAnnotator {
12631265
GlobalTypeInferenceMemberResult _resultOfMember(MemberEntity e) =>
12641266
_globalInferenceResults.resultOfMember(e);
12651267

1266-
AbstractValue _resultOfParameter(Local e) =>
1267-
_globalInferenceResults.resultOfParameter(e);
1268+
AbstractValue _resultOfParameter(Local e, MemberEntity? member) =>
1269+
_globalInferenceResults.resultOfParameter(e, member);
12681270

12691271
// TODO(markzipan): [parentName] is used for disambiguation, but this might
12701272
// not always be valid. Check and validate later.
@@ -1511,7 +1513,9 @@ class DumpInfoAnnotator {
15111513
_globalInferenceResults.globalLocalsMap,
15121514
function,
15131515
(parameter) {
1514-
inferredParameterTypes.add('${_resultOfParameter(parameter)}');
1516+
inferredParameterTypes.add(
1517+
'${_resultOfParameter(parameter, function)}',
1518+
);
15151519
},
15161520
);
15171521
int parameterIndex = 0;

pkg/compiler/lib/src/inferrer/types.dart

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import '../js_model/element_map.dart';
1717
import '../js_model/elements.dart';
1818
import '../js_model/js_world.dart' show JClosedWorld;
1919
import '../js_model/locals.dart';
20+
import '../kernel/transformations/modular/late_lowering.dart' as late_lowering;
2021
import '../serialization/deferrable.dart';
2122
import '../serialization/serialization.dart';
2223
import '../universe/selector.dart' show Selector;
@@ -151,7 +152,7 @@ abstract class GlobalTypeInferenceResults {
151152

152153
GlobalTypeInferenceMemberResult resultOfMember(MemberEntity member);
153154

154-
AbstractValue resultOfParameter(Local parameter);
155+
AbstractValue resultOfParameter(Local parameter, MemberEntity? member);
155156

156157
/// Returns the type of the result of applying [selector] to a receiver with
157158
/// the given [receiver] type.
@@ -408,7 +409,7 @@ class GlobalTypeInferenceResultsImpl implements GlobalTypeInferenceResults {
408409
}
409410

410411
@override
411-
AbstractValue resultOfParameter(Local parameter) {
412+
AbstractValue resultOfParameter(Local parameter, _) {
412413
// TODO(sigmund,johnniwinther): Make it an error to query for results that
413414
// don't exist.
414415
/*assert(parameterResults.containsKey(parameter),
@@ -596,18 +597,26 @@ class GlobalTypeInferenceMemberResultImpl
596597
class TrivialGlobalTypeInferenceResults implements GlobalTypeInferenceResults {
597598
@override
598599
final JClosedWorld closedWorld;
599-
final TrivialGlobalTypeInferenceMemberResult _trivialMemberResult;
600-
final AbstractValue _trivialParameterResult;
600+
601+
final AbstractValue _trivialResult;
602+
final AbstractValue _includingLateSentinelTrivialResult;
603+
604+
late final TrivialGlobalTypeInferenceMemberResult _trivialMemberResult =
605+
TrivialGlobalTypeInferenceMemberResult(_trivialResult);
606+
late final TrivialGlobalTypeInferenceMemberResult
607+
_includingLateSentinelMemberResult = TrivialGlobalTypeInferenceMemberResult(
608+
_includingLateSentinelTrivialResult,
609+
);
610+
601611
@override
602612
final InferredData inferredData = TrivialInferredData();
603613
@override
604614
final GlobalLocalsMap globalLocalsMap;
605615

606616
TrivialGlobalTypeInferenceResults(this.closedWorld, this.globalLocalsMap)
607-
: _trivialMemberResult = TrivialGlobalTypeInferenceMemberResult(
608-
closedWorld.abstractValueDomain.dynamicType,
609-
),
610-
_trivialParameterResult = closedWorld.abstractValueDomain.dynamicType;
617+
: _trivialResult = closedWorld.abstractValueDomain.dynamicType,
618+
_includingLateSentinelTrivialResult =
619+
closedWorld.abstractValueDomain.internalTopType;
611620

612621
@override
613622
void writeToDataSink(DataSinkWriter sink, JsToElementMap elementMap) {
@@ -616,16 +625,37 @@ class TrivialGlobalTypeInferenceResults implements GlobalTypeInferenceResults {
616625

617626
@override
618627
AbstractValue resultTypeOfSelector(Selector selector, AbstractValue mask) {
619-
return closedWorld.abstractValueDomain.dynamicType;
628+
if (late_lowering.isNameOfLateInstanceBackingField(selector.name)) {
629+
return _includingLateSentinelTrivialResult;
630+
}
631+
return _trivialResult;
620632
}
621633

622634
@override
623-
AbstractValue resultOfParameter(Local parameter) {
624-
return _trivialParameterResult;
635+
AbstractValue resultOfParameter(Local parameter, MemberEntity? member) {
636+
if (member != null) {
637+
if (closedWorld.commonElements.isIsSentinel(member) ||
638+
closedWorld.commonElements.isIsJsSentinel(member)) {
639+
return _includingLateSentinelTrivialResult;
640+
}
641+
}
642+
return _trivialResult;
625643
}
626644

627645
@override
628646
GlobalTypeInferenceMemberResult resultOfMember(MemberEntity member) {
647+
if (member is FieldEntity) {
648+
if (closedWorld.fieldAnalysis.getFieldData(member).isLateBackingField) {
649+
return _includingLateSentinelMemberResult;
650+
}
651+
}
652+
if (late_lowering.isNameOfLateInstanceBackingField(member.name)) {
653+
return _includingLateSentinelMemberResult;
654+
}
655+
if (closedWorld.commonElements.isCreateSentinel(member) ||
656+
closedWorld.commonElements.isCreateJsSentinel(member)) {
657+
return _includingLateSentinelMemberResult;
658+
}
629659
return _trivialMemberResult;
630660
}
631661

@@ -641,15 +671,15 @@ class TrivialGlobalTypeInferenceResults implements GlobalTypeInferenceResults {
641671

642672
class TrivialGlobalTypeInferenceMemberResult
643673
implements GlobalTypeInferenceMemberResult {
644-
final AbstractValue dynamicType;
674+
final AbstractValue topType;
645675

646-
TrivialGlobalTypeInferenceMemberResult(this.dynamicType);
676+
TrivialGlobalTypeInferenceMemberResult(this.topType);
647677

648678
@override
649-
AbstractValue get type => dynamicType;
679+
AbstractValue get type => topType;
650680

651681
@override
652-
AbstractValue get returnType => dynamicType;
682+
AbstractValue get returnType => topType;
653683

654684
@override
655685
bool get throwsAlways => false;

pkg/compiler/lib/src/js_model/element_map.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,12 @@ abstract class KernelToTypeInferenceMap {
219219
/// Returns the inferred type of [member].
220220
AbstractValue getInferredTypeOf(MemberEntity member);
221221

222-
/// Returns the inferred type of the [parameter].
223-
AbstractValue getInferredTypeOfParameter(Local parameter);
222+
/// Returns the inferred type of the [parameter]. [member] is the member that
223+
/// declares [parameter], if any.
224+
AbstractValue getInferredTypeOfParameter(
225+
Local parameter,
226+
MemberEntity? member,
227+
);
224228

225229
/// Returns the inferred result type of a dynamic [selector] access on the
226230
/// [receiver].

pkg/compiler/lib/src/js_model/js_strategy.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -749,9 +749,13 @@ class KernelToTypeInferenceMapImpl implements KernelToTypeInferenceMap {
749749
}
750750

751751
@override
752-
AbstractValue getInferredTypeOfParameter(Local parameter) {
752+
AbstractValue getInferredTypeOfParameter(
753+
Local parameter,
754+
MemberEntity? member,
755+
) {
753756
return AbstractValueFactory.inferredTypeForParameter(
754757
parameter,
758+
member,
755759
_globalInferenceResults,
756760
);
757761
}

pkg/compiler/lib/src/kernel/transformations/modular/late_lowering.dart

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,16 @@ bool _hasAssignableSuffix(String name) {
3131
name.endsWith(_lateAssignableInitializedSuffix);
3232
}
3333

34+
bool isNameOfLateInstanceBackingField(String? name) {
35+
return name != null &&
36+
name.startsWith(_lateInstanceFieldPrefix) &&
37+
(_hasFinalSuffix(name) || _hasAssignableSuffix(name));
38+
}
39+
3440
bool isBackingFieldForLateInstanceField(Field field) {
3541
assert(!field.isStatic);
3642
if (!field.isInternalImplementation) return false;
37-
final name = field.name.text;
38-
return name.startsWith(_lateInstanceFieldPrefix) &&
39-
(_hasFinalSuffix(name) || _hasAssignableSuffix(name));
43+
return isNameOfLateInstanceBackingField(field.name.text);
4044
}
4145

4246
bool isBackingFieldForLateFinalInstanceField(Field field) {

pkg/compiler/lib/src/ssa/builder.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2342,6 +2342,7 @@ class KernelSsaGraphBuilder extends ir.VisitorDefault<void>
23422342
}
23432343
parameterMap[local] = _typeInferenceMap.getInferredTypeOfParameter(
23442344
local,
2345+
member,
23452346
);
23462347
}
23472348

pkg/compiler/lib/src/ssa/optimize.dart

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1055,11 +1055,9 @@ class SsaInstructionSimplifier extends HBaseVisitor<HInstruction>
10551055

10561056
// TODO(ngeoffray): Also fold if it's a getter or variable.
10571057
if (element.isFunction &&
1058-
// If we found out that the only target is an implicitly called
1059-
// `noSuchMethod` we just ignore it.
1060-
node
1061-
.selector
1062-
.applies(element)) {
1058+
// If we found out that the only target is an implicitly called
1059+
// `noSuchMethod` we just ignore it.
1060+
node.selector.applies(element)) {
10631061
// `.isFunction` implies FunctionEntity, but not vice-versa.
10641062
FunctionEntity method = element as FunctionEntity;
10651063

pkg/compiler/lib/src/ssa/types.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,10 @@ class AbstractValueFactory {
2828

2929
static AbstractValue inferredTypeForParameter(
3030
Local element,
31+
MemberEntity? member,
3132
GlobalTypeInferenceResults results,
3233
) {
33-
return results.resultOfParameter(element);
34+
return results.resultOfParameter(element, member);
3435
}
3536

3637
static AbstractValue inferredResultTypeForSelector(

pkg/compiler/test/codegen/expect_annotations_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ runTest() async {
5858
results.globalLocalsMap,
5959
function,
6060
(Local parameter) {
61-
AbstractValue type = results.resultOfParameter(parameter);
61+
AbstractValue type = results.resultOfParameter(parameter, function);
6262
Expect.equals(
6363
expectedParameterType,
6464
simplify(type, commonMasks),

pkg/compiler/test/codegen/type_inference8_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ Future runTest1() async {
7373
elementEnvironment.forEachParameterAsLocal(results.globalLocalsMap, bar, (
7474
barArg,
7575
) {
76-
AbstractValue barArgMask = results.resultOfParameter(barArg);
76+
AbstractValue barArgMask = results.resultOfParameter(barArg, bar);
7777
Expect.equals(falseType, barArgMask);
7878
});
7979
String barCode = backendStrategy.getGeneratedCodeForTesting(bar)!;
@@ -130,7 +130,7 @@ Future runTest2() async {
130130
elementEnvironment.forEachParameterAsLocal(results.globalLocalsMap, bar, (
131131
barArg,
132132
) {
133-
AbstractValue barArgMask = results.resultOfParameter(barArg);
133+
AbstractValue barArgMask = results.resultOfParameter(barArg, bar);
134134
// The argument to bar should have the same type as the return type of foo
135135
Expect.identical(commonMasks.boolType, barArgMask);
136136
});

0 commit comments

Comments
 (0)