Skip to content

Commit ea27d17

Browse files
alexmarkovCommit Queue
authored andcommitted
[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 <[email protected]> Reviewed-by: Slava Egorov <[email protected]>
1 parent 4aeb6c2 commit ea27d17

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

pkg/dart2bytecode/lib/bytecode_generator.dart

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1503,7 +1503,7 @@ class BytecodeGenerator extends RecursiveVisitor {
15031503

15041504
/// Generates is-test for the value at TOS.
15051505
void _genInstanceOf(DartType type) {
1506-
if (typeEnvironment.isTop(type)) {
1506+
if (_isTopType(type)) {
15071507
asm.emitDrop1();
15081508
asm.emitPushTrue();
15091509
return;
@@ -2227,7 +2227,7 @@ class BytecodeGenerator extends RecursiveVisitor {
22272227
final DartType bound = (forwardingTypeParameterBounds != null)
22282228
? forwardingTypeParameterBounds[typeParam]!
22292229
: typeParam.bound;
2230-
if (typeEnvironment.isTop(bound)) {
2230+
if (_isTopType(bound)) {
22312231
return false;
22322232
}
22332233
return true;
@@ -2244,7 +2244,7 @@ class BytecodeGenerator extends RecursiveVisitor {
22442244
final DartType type = (forwardingParameterTypes != null)
22452245
? forwardingParameterTypes[param]!
22462246
: param.type;
2247-
if (typeEnvironment.isTop(type)) {
2247+
if (_isTopType(type)) {
22482248
return false;
22492249
}
22502250
return true;
@@ -2289,6 +2289,16 @@ class BytecodeGenerator extends RecursiveVisitor {
22892289
asm.emitAssertSubtype();
22902290
}
22912291

2292+
bool _isTopType(DartType type) => switch (type) {
2293+
DynamicType() => true,
2294+
VoidType() => true,
2295+
InterfaceType() => type.classNode == coreTypes.objectClass &&
2296+
type.nullability == Nullability.nullable,
2297+
FutureOrType() => _isTopType(type.typeArgument),
2298+
ExtensionType() => _isTopType(type.extensionTypeErasure),
2299+
_ => false,
2300+
};
2301+
22922302
void _genArgumentTypeCheck(VariableDeclaration variable,
22932303
Map<VariableDeclaration, DartType>? forwardingParameterTypes) {
22942304
final DartType type = (forwardingParameterTypes != null)
@@ -2300,7 +2310,7 @@ class BytecodeGenerator extends RecursiveVisitor {
23002310
}
23012311

23022312
void _genAssertAssignable(DartType type, {String? name, String? message}) {
2303-
assert(!typeEnvironment.isTop(type));
2313+
assert(!_isTopType(type));
23042314
asm.emitPushConstant(cp.addType(type));
23052315
_genPushInstantiatorAndFunctionTypeArguments([type]);
23062316
asm.emitPushConstant(
@@ -2723,7 +2733,7 @@ class BytecodeGenerator extends RecursiveVisitor {
27232733
_generateNode(node.operand);
27242734

27252735
final type = node.type;
2726-
if (typeEnvironment.isTop(type)) {
2736+
if (_isTopType(type) || node.isUnchecked) {
27272737
return;
27282738
}
27292739

0 commit comments

Comments
 (0)