Skip to content

Commit f4b4e5e

Browse files
mkustermannCommit Queue
authored andcommitted
[dart2wasm] Fix incorrect setup of checked entrypoints
A method may be overriden multiple times, the overriden methods may add optional parameters. Dart2wasm generates a signature for such selectors that includes all optional parameters from all overriden methods. That means * callers may pass more arguments than the signature of the target => it passes dummy values * implementations get more parameters passed than their Dart function => it ignores them The checked/unchecked entry functions need to also support this mechanism. Issue #60148 Change-Id: Ifb60c44d3c5e5b6e374a15731723e16d22bfc094 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/414720 Reviewed-by: Ömer Ağacan <[email protected]> Commit-Queue: Martin Kustermann <[email protected]>
1 parent 8d46b7c commit f4b4e5e

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

pkg/dart2wasm/lib/code_generator.dart

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -379,10 +379,18 @@ abstract class AstCodeGenerator
379379
canSafelyOmitImplicitChecks: !translator.needToCheckTypesFor(member));
380380
}
381381

382+
void setupParametersForCheckedEntry(Member member) {
383+
assert(member.isInstanceMember);
384+
assert(translator.needToCheckTypesFor(member));
385+
setupParameters(member.checkedEntryReference,
386+
canSafelyOmitImplicitChecks: false);
387+
}
388+
382389
void setupParametersForUncheckedEntry(Member member) {
383390
assert(member.isInstanceMember);
384391
assert(translator.needToCheckTypesFor(member));
385-
setupParameters(member.reference, canSafelyOmitImplicitChecks: true);
392+
setupParameters(member.uncheckedEntryReference,
393+
canSafelyOmitImplicitChecks: true);
386394
}
387395

388396
void setupContexts(Member member) {
@@ -3299,7 +3307,7 @@ class SynchronousProcedureCodeGenerator extends AstCodeGenerator {
32993307
final function = member.function;
33003308
final signature = translator.signatureForDirectCall(member.bodyReference);
33013309
if (checked) {
3302-
setupParametersForNormalEntry(member);
3310+
setupParametersForCheckedEntry(member);
33033311
} else {
33043312
setupParametersForUncheckedEntry(member);
33053313
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'dart:async';
6+
7+
import 'package:expect/expect.dart';
8+
9+
main() async {
10+
final l = <A<int>>[B<int>(), C<int>()];
11+
Expect.equals('B.foo(1, first=1)', l[0].foo(1));
12+
Expect.equals('C.foo(2, second=true)', l[1].foo(2));
13+
Expect.equals('B.foo(3, first=2)', B<int>().foo(3, first: 2));
14+
Expect.equals('C.foo(4, second=false)', C<int>().foo(4, second: false));
15+
}
16+
17+
abstract class A<T> {
18+
String foo(T a);
19+
}
20+
21+
class B<T> extends A<T> {
22+
String foo(T a, {int first = 1}) => 'B.foo($a, first=$first)';
23+
}
24+
25+
class C<T> extends A<T> {
26+
String foo(T a, {bool second = true}) => 'C.foo($a, second=$second)';
27+
}

0 commit comments

Comments
 (0)