Skip to content

Commit 7d199f2

Browse files
natebiggsCommit Queue
authored and
Commit Queue
committed
[dart2wasm] Enable compiler asserts for dynamic module tests.
Fixes several asserts that were throwing when running with dynamic modules enabled. Bug: #60743 Change-Id: I6bcd3723ecdee784b3d1603e1c87a47e3703a7f3 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/423261 Reviewed-by: Martin Kustermann <[email protected]> Commit-Queue: Nate Biggs <[email protected]>
1 parent 63ee73a commit 7d199f2

File tree

7 files changed

+49
-22
lines changed

7 files changed

+49
-22
lines changed

pkg/dart2wasm/lib/class_info.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,6 @@ class ClassInfoCollector {
572572
if (translator.isDynamicSubmodule && mainModuleConcreteRange.isEmpty) {
573573
final submoduleConcreteRange =
574574
classIdNumbering.getConcreteClassIdRangeForDynamicSubmodule(cls);
575-
assert(submoduleConcreteRange.isNotEmpty);
576575
addRanges(submoduleConcreteRange);
577576
} else {
578577
assert(classIdNumbering

pkg/dart2wasm/lib/dispatch_table.dart

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -230,8 +230,10 @@ class SelectorInfo {
230230

231231
List<w.ValueType> typeParameters = List.filled(paramInfo.typeParamCount,
232232
translator.classInfo[translator.typeClass]!.nonNullableType);
233-
List<w.ValueType> inputs = List.generate(inputSets.length,
234-
(i) => _upperBound(inputSets[i], ensureBoxed: ensureBoxed[i]));
233+
List<w.ValueType> inputs = List.generate(
234+
inputSets.length,
235+
(i) => _upperBound(inputSets[i],
236+
ensureBoxed: ensureBoxed[i], isReceiver: i == 0));
235237
if (name == '==') {
236238
// == can't be called with null
237239
inputs[1] = inputs[1].withNullability(false);
@@ -242,13 +244,18 @@ class SelectorInfo {
242244
[inputs[0], ...typeParameters, ...inputs.sublist(1)], outputs);
243245
}
244246

245-
w.ValueType _upperBound(Set<w.ValueType> types, {required bool ensureBoxed}) {
247+
w.ValueType _upperBound(Set<w.ValueType> types,
248+
{required bool ensureBoxed, bool isReceiver = false}) {
246249
if (types.isEmpty) {
247250
// This happens if the selector doesn't have any targets. Any call site of
248251
// such a selector is unreachable. Though such call sites still have to
249252
// evaluate receiver and arguments. Doing so requires the signature. So we
250-
// create a dummy signature with top types.
251-
return translator.topInfo.nullableType;
253+
// create a dummy signature with top types. Receivers specifically should
254+
// be non-nullable since we must be invoking a selector on some object.
255+
assert(!isReceiver || isDynamicSubmoduleOverridable);
256+
return isReceiver
257+
? translator.topInfo.nonNullableType
258+
: translator.topInfo.nullableType;
252259
}
253260
if (!ensureBoxed && types.length == 1 && types.single.isPrimitive) {
254261
// Unboxed primitive.

pkg/dart2wasm/lib/dynamic_forwarders.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class _DynamicForwarderCallTarget extends CallTarget {
5454
_DynamicForwarderCallTarget(
5555
this.translator, this._kind, this.memberName, this.callingModule)
5656
: assert(!translator.isDynamicSubmodule ||
57-
(memberName == 'call' && _kind == _ForwarderKind.Getter)),
57+
(memberName == 'call' && _kind == _ForwarderKind.Method)),
5858
super(_kind.functionType(translator));
5959

6060
@override

pkg/dart2wasm/lib/functions.dart

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -346,8 +346,11 @@ class _FunctionTypeGenerator extends MemberVisitor1<w.FunctionType, Reference> {
346346
return _makeFunctionType(translator, target, null);
347347
}
348348
assert(!translator.dispatchTable
349-
.selectorForTarget(target)
350-
.containsTarget(target));
349+
.selectorForTarget(target)
350+
.containsTarget(target) &&
351+
!translator.dispatchTable
352+
.selectorForTarget(target)
353+
.containsTarget(target));
351354

352355
final receiverType = target.asMember.enclosingClass!
353356
.getThisType(translator.coreTypes, Nullability.nonNullable);
@@ -365,8 +368,11 @@ class _FunctionTypeGenerator extends MemberVisitor1<w.FunctionType, Reference> {
365368
}
366369

367370
assert(!translator.dispatchTable
368-
.selectorForTarget(target)
369-
.containsTarget(target));
371+
.selectorForTarget(target)
372+
.containsTarget(target) &&
373+
!translator.dispatchTable
374+
.selectorForTarget(target)
375+
.containsTarget(target));
370376

371377
final receiverType = target.asMember.enclosingClass!
372378
.getThisType(translator.coreTypes, Nullability.nonNullable);

pkg/dart2wasm/lib/record_class_generator.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -421,10 +421,11 @@ class _RecordClassGenerator {
421421
statements.add(IfStatement(
422422
Not(InstanceInvocation(
423423
InstanceAccessKind.Instance,
424-
(InstanceInvocation(InstanceAccessKind.Instance, ThisExpression(),
425-
getRti.name, Arguments([]),
424+
(InstanceGet(
425+
InstanceAccessKind.Instance, ThisExpression(), getRti.name,
426426
interfaceTarget: getRti,
427-
functionType: getRti.computeSignatureOrFunctionType())),
427+
resultType: InterfaceType(
428+
recordRuntimeTypeClass, Nullability.nonNullable))),
428429
checkInstance.name,
429430
Arguments([VariableGet(parameter)]),
430431
interfaceTarget: checkInstance,

pkg/dart2wasm/lib/translator.dart

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,8 +1007,10 @@ class Translator with KernelNodes {
10071007
.getClosureRepresentation(typeCount, positionalCount, names)!;
10081008
assert(representation.vtableStruct.fields.length ==
10091009
representation.vtableBaseIndex +
1010-
(1 + positionalCount) +
1011-
representation.nameCombinations.length);
1010+
(dynamicModuleSupportEnabled
1011+
? 0
1012+
: (1 + positionalCount) +
1013+
representation.nameCombinations.length));
10121014

10131015
List<w.BaseFunction> functions = [];
10141016

@@ -1336,6 +1338,7 @@ class Translator with KernelNodes {
13361338
}
13371339

13381340
DispatchTable dispatchTableForTarget(Reference target) {
1341+
assert(target.asMember.isInstanceMember);
13391342
if (!isDynamicSubmodule) return dispatchTable;
13401343
if (moduleForReference(target) == dynamicSubmodule) return dispatchTable;
13411344
assert(target.asMember.isDynamicSubmoduleCallable(coreTypes));
@@ -1348,18 +1351,28 @@ class Translator with KernelNodes {
13481351
}
13491352

13501353
w.FunctionType signatureForDirectCall(Reference target) {
1351-
return _signatureFromDispatchTable(target, dispatchTableForTarget(target));
1354+
return _signatureForModule(
1355+
target,
1356+
target.asMember.isInstanceMember
1357+
? dispatchTableForTarget(target)
1358+
: null);
13521359
}
13531360

13541361
w.FunctionType signatureForMainModule(Reference target) {
1355-
return _signatureFromDispatchTable(target, dynamicMainModuleDispatchTable!);
1362+
return _signatureForModule(
1363+
target,
1364+
target.asMember.isInstanceMember
1365+
? dynamicMainModuleDispatchTable!
1366+
: null);
13561367
}
13571368

1358-
w.FunctionType _signatureFromDispatchTable(
1359-
Reference target, DispatchTable table) {
1360-
if (target.asMember.isInstanceMember && !target.isBodyReference) {
1369+
w.FunctionType _signatureForModule(Reference target, DispatchTable? table) {
1370+
if (table != null &&
1371+
!target.isBodyReference &&
1372+
!target.isTypeCheckerReference) {
13611373
final selector = table.selectorForTarget(target);
1362-
if (selector.containsTarget(target)) {
1374+
if (selector.containsTarget(target) ||
1375+
selector.isDynamicSubmoduleOverridable) {
13631376
return selector.signature;
13641377
}
13651378
}

pkg/dynamic_modules/test/runner/dart2wasm.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class Dart2wasmExecutor implements TargetExecutor {
6363
) async {
6464
var testDir = _tmp.uri.resolve(testName).toFilePath();
6565
var args = [
66+
'--compiler-asserts',
6667
'--packages=${repoRoot.toFilePath()}/.dart_tool/package_config.json',
6768
'--multi-root=${sourceDir.resolve('../../').toFilePath()}',
6869
'--multi-root-scheme=$rootScheme',

0 commit comments

Comments
 (0)