@@ -17,6 +17,7 @@ import '../js_model/element_map.dart';
1717import '../js_model/elements.dart' ;
1818import '../js_model/js_world.dart' show JClosedWorld;
1919import '../js_model/locals.dart' ;
20+ import '../kernel/transformations/modular/late_lowering.dart' as late_lowering;
2021import '../serialization/deferrable.dart' ;
2122import '../serialization/serialization.dart' ;
2223import '../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
596597class 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
642672class 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 ;
0 commit comments