[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:
committed by
Commit Queue
parent
0334fea865
commit
d548c07996
@@ -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([
|
||||
|
||||
Reference in New Issue
Block a user