[dart2wasm] Fix async* stream types when fn return type is not Stream

Fixes #53234.

Change-Id: I97aec5d61bf442ecdaeb2ea2dc61d499ab167dd2
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/340862
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Ömer Ağacan <omersa@google.com>
This commit is contained in:
Ömer Sinan Ağacan
2023-12-12 14:13:08 +00:00
committed by Commit Queue
parent 0334fea865
commit d548c07996
+14 -9
View File
@@ -601,23 +601,28 @@ class _WasmTransformer extends Transformer {
callAsyncMap, Name('where'), Arguments([whereFilter]),
interfaceTarget: whereProc, functionType: whereProcType);
// Finally call cast
DartType typeArgument;
if (functionNode.returnType is InterfaceType) {
typeArgument =
(functionNode.returnType as InterfaceType).typeArguments.single;
// Finally call cast.
// Stream element type is defined in language spec section 9. If the return
// type is `Stream<U>` then the element type is `U`. Otherwise it needs to
// be a supertype of `Object` and the element type is `dynamic`.
final DartType streamTypeArgument;
final DartType functionReturnType = functionNode.returnType;
if (functionReturnType is InterfaceType &&
functionReturnType.classNode == coreTypes.streamClass) {
streamTypeArgument = functionReturnType.typeArguments.single;
} else {
typeArgument = const DynamicType();
streamTypeArgument = const DynamicType();
}
Procedure castProc =
coreTypes.index.getProcedure('dart:async', 'Stream', 'cast');
final returnStreamType = InterfaceType(
coreTypes.streamClass, typeArgument.nullability, [typeArgument]);
final returnStreamType = InterfaceType(coreTypes.streamClass,
streamTypeArgument.nullability, [streamTypeArgument]);
final castProcType = FunctionType(
[], returnStreamType, Nullability.nonNullable,
requiredParameterCount: 1);
final castToExpectedType = InstanceInvocation(InstanceAccessKind.Instance,
callWhere, Name('cast'), Arguments([], types: [typeArgument]),
callWhere, Name('cast'), Arguments([], types: [streamTypeArgument]),
interfaceTarget: castProc, functionType: castProcType);
return FunctionNode(
Block([