[dyn_modules,dart2bytecode] Fix isTop predicate for extension types in bytecode generator

Bytecode generator needs to know the runtime semantics of Dart types,
but TypeEnvironment.isTop predicate does not use erasure of extension
types and does not return true for extension types based on other top
types (e.g. dynamic).

TEST=language/dot_shorthands/member/static_method_cascade_test

Change-Id: If8323d11293498fb39d8d936c406bc9bb7e85ce9
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/426983
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Slava Egorov <vegorov@google.com>
diff --git a/pkg/dart2bytecode/lib/bytecode_generator.dart b/pkg/dart2bytecode/lib/bytecode_generator.dart
index 19159b8..e6265e7 100644
--- a/pkg/dart2bytecode/lib/bytecode_generator.dart
+++ b/pkg/dart2bytecode/lib/bytecode_generator.dart
@@ -1503,7 +1503,7 @@
 
   /// Generates is-test for the value at TOS.
   void _genInstanceOf(DartType type) {
-    if (typeEnvironment.isTop(type)) {
+    if (_isTopType(type)) {
       asm.emitDrop1();
       asm.emitPushTrue();
       return;
@@ -2227,7 +2227,7 @@
     final DartType bound = (forwardingTypeParameterBounds != null)
         ? forwardingTypeParameterBounds[typeParam]!
         : typeParam.bound;
-    if (typeEnvironment.isTop(bound)) {
+    if (_isTopType(bound)) {
       return false;
     }
     return true;
@@ -2244,7 +2244,7 @@
     final DartType type = (forwardingParameterTypes != null)
         ? forwardingParameterTypes[param]!
         : param.type;
-    if (typeEnvironment.isTop(type)) {
+    if (_isTopType(type)) {
       return false;
     }
     return true;
@@ -2289,6 +2289,16 @@
     asm.emitAssertSubtype();
   }
 
+  bool _isTopType(DartType type) => switch (type) {
+        DynamicType() => true,
+        VoidType() => true,
+        InterfaceType() => type.classNode == coreTypes.objectClass &&
+            type.nullability == Nullability.nullable,
+        FutureOrType() => _isTopType(type.typeArgument),
+        ExtensionType() => _isTopType(type.extensionTypeErasure),
+        _ => false,
+      };
+
   void _genArgumentTypeCheck(VariableDeclaration variable,
       Map<VariableDeclaration, DartType>? forwardingParameterTypes) {
     final DartType type = (forwardingParameterTypes != null)
@@ -2300,7 +2310,7 @@
   }
 
   void _genAssertAssignable(DartType type, {String? name, String? message}) {
-    assert(!typeEnvironment.isTop(type));
+    assert(!_isTopType(type));
     asm.emitPushConstant(cp.addType(type));
     _genPushInstantiatorAndFunctionTypeArguments([type]);
     asm.emitPushConstant(
@@ -2723,7 +2733,7 @@
     _generateNode(node.operand);
 
     final type = node.type;
-    if (typeEnvironment.isTop(type)) {
+    if (_isTopType(type) || node.isUnchecked) {
       return;
     }