From 56851e50e2e33e240651d79edc1f5d86a2a0de45 Mon Sep 17 00:00:00 2001 From: Mayank Patke Date: Mon, 24 Jun 2024 20:52:43 +0000 Subject: [PATCH] [dart2js] Restrict `instanceof` is-test specializations to non-generic types when SNS checks are enabled. Change-Id: I759a4ba77b74f6e0ec7c7ec65ad3ca37ed8410a9 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/372201 Commit-Queue: Mayank Patke Reviewed-by: Stephen Adams --- .../lib/src/js_backend/specialized_checks.dart | 16 ++++++++++++---- pkg/compiler/lib/src/ssa/optimize.dart | 3 ++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/pkg/compiler/lib/src/js_backend/specialized_checks.dart b/pkg/compiler/lib/src/js_backend/specialized_checks.dart index c16d94e87d2..ed26a6cdf12 100644 --- a/pkg/compiler/lib/src/js_backend/specialized_checks.dart +++ b/pkg/compiler/lib/src/js_backend/specialized_checks.dart @@ -30,20 +30,24 @@ class InstanceOfIsTestSpecialization implements IsTestSpecialization { class SpecializedChecks { static IsTestSpecialization? findIsTestSpecialization( - DartType dartType, MemberEntity compiland, JClosedWorld closedWorld) { + DartType dartType, MemberEntity compiland, JClosedWorld closedWorld, + {required bool experimentNullSafetyChecks}) { if (dartType is LegacyType) { DartType base = dartType.baseType; // `Never*` accepts only `null`. if (base is NeverType) return SimpleIsTestSpecialization.isNull; // `Object*` is top and should be handled by constant folding. if (base.isObject) return null; - return _findIsTestSpecialization(base, compiland, closedWorld); + return _findIsTestSpecialization(base, compiland, closedWorld, + experimentNullSafetyChecks: experimentNullSafetyChecks); } - return _findIsTestSpecialization(dartType, compiland, closedWorld); + return _findIsTestSpecialization(dartType, compiland, closedWorld, + experimentNullSafetyChecks: experimentNullSafetyChecks); } static IsTestSpecialization? _findIsTestSpecialization( - DartType dartType, MemberEntity compiland, JClosedWorld closedWorld) { + DartType dartType, MemberEntity compiland, JClosedWorld closedWorld, + {required bool experimentNullSafetyChecks}) { if (dartType is InterfaceType) { ClassEntity element = dartType.element; JCommonElements commonElements = closedWorld.commonElements; @@ -98,6 +102,10 @@ class SpecializedChecks { return SimpleIsTestSpecialization.isNotNull; } + if (experimentNullSafetyChecks && dartType.typeArguments.isNotEmpty) { + return null; + } + ClassHierarchy classHierarchy = closedWorld.classHierarchy; InterceptorData interceptorData = closedWorld.interceptorData; OutputUnitData outputUnitData = closedWorld.outputUnitData; diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart index 4043f1b6be8..12c34d020d0 100644 --- a/pkg/compiler/lib/src/ssa/optimize.dart +++ b/pkg/compiler/lib/src/ssa/optimize.dart @@ -2305,7 +2305,8 @@ class SsaInstructionSimplifier extends HBaseVisitor } final specialization = SpecializedChecks.findIsTestSpecialization( - node.dartType, _graph.element, _closedWorld); + node.dartType, _graph.element, _closedWorld, + experimentNullSafetyChecks: _options.experimentNullSafetyChecks); if (specialization == SimpleIsTestSpecialization.isNull || specialization == SimpleIsTestSpecialization.isNotNull) {