Skip to content

Commit cf9f45f

Browse files
osa1Commit Queue
authored and
Commit Queue
committed
[dart2wasm] Copy VM's map and set factory transformers
Transform factory calls to default map and set classes to the constructor calls to the classes to improve kernel. Also remove some redundant null checks in VM's transformer. `source_map_simple_optimized_test.dart` is updated: with improved kernel wasm-opt now eliminates the `testMain` function, so the stack trace doesn't mention it. Fixes #60343. Tested: minor refactoring in VM doesn't need testing. Wasm tested with existing tests. Change-Id: Ie448d1374ff0e1b278859f22bc250899e0e4cfd0 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/416640 Reviewed-by: Martin Kustermann <[email protected]> Commit-Queue: Ömer Ağacan <[email protected]>
1 parent 29c350d commit cf9f45f

File tree

8 files changed

+150
-29
lines changed

8 files changed

+150
-29
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
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 'package:kernel/core_types.dart';
6+
import 'package:kernel/kernel.dart';
7+
8+
import 'list_factory_specializer.dart';
9+
import 'map_factory_specializer.dart';
10+
import 'set_factory_specializer.dart';
11+
12+
typedef SpecializerTransformer = TreeNode Function(StaticInvocation node);
13+
14+
abstract class BaseSpecializer {
15+
// Populated in constructors of subclasses.
16+
final Map<Member, SpecializerTransformer> transformers = {};
17+
}
18+
19+
class FactorySpecializer extends BaseSpecializer {
20+
final ListFactorySpecializer _listFactorySpecializer;
21+
final SetFactorySpecializer _setFactorySpecializer;
22+
final MapFactorySpecializer _mapFactorySpecializer;
23+
24+
FactorySpecializer(CoreTypes coreTypes)
25+
: _listFactorySpecializer = ListFactorySpecializer(coreTypes),
26+
_setFactorySpecializer = SetFactorySpecializer(coreTypes),
27+
_mapFactorySpecializer = MapFactorySpecializer(coreTypes) {
28+
transformers.addAll(_listFactorySpecializer.transformers);
29+
transformers.addAll(_setFactorySpecializer.transformers);
30+
transformers.addAll(_mapFactorySpecializer.transformers);
31+
}
32+
33+
TreeNode transformStaticInvocation(StaticInvocation invocation) {
34+
final target = invocation.target;
35+
final transformer = transformers[target];
36+
if (transformer != null) {
37+
return transformer(invocation);
38+
}
39+
return invocation;
40+
}
41+
}

pkg/dart2wasm/lib/list_factory_specializer.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import 'package:kernel/core_types.dart' show CoreTypes;
2121
/// ```
2222
class ListFactorySpecializer {
2323
final Map<Member, StaticInvocation Function(StaticInvocation node)>
24-
_transformers = {};
24+
transformers = {};
2525

2626
final Procedure _fixedListEmptyFactory;
2727
final Procedure _fixedListFactory;
@@ -58,14 +58,14 @@ class ListFactorySpecializer {
5858
.getProcedure('dart:_list', 'ModifiableFixedLengthList', 'filled'),
5959
_fixedListGenerateFactory = coreTypes.index.getProcedure(
6060
'dart:_list', 'ModifiableFixedLengthList', 'generate') {
61-
_transformers[_listFilledFactory] = _transformListFilledFactory;
62-
_transformers[_listEmptyFactory] = _transformListEmptyFactory;
63-
_transformers[_listGenerateFactory] = _transformListGenerateFactory;
61+
transformers[_listFilledFactory] = _transformListFilledFactory;
62+
transformers[_listEmptyFactory] = _transformListEmptyFactory;
63+
transformers[_listGenerateFactory] = _transformListGenerateFactory;
6464
}
6565

6666
StaticInvocation transformStaticInvocation(StaticInvocation invocation) {
6767
final target = invocation.target;
68-
final transformer = _transformers[target];
68+
final transformer = transformers[target];
6969
if (transformer != null) {
7070
return transformer(invocation);
7171
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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 'package:kernel/ast.dart';
6+
import 'package:kernel/core_types.dart';
7+
8+
import 'factory_specializer.dart';
9+
10+
/// Replaces invocation of Map factory constructors with factories of
11+
/// Wasm-specific classes.
12+
///
13+
/// new LinkedHashMap<K, V>() => new DefaultMap<K, V>()
14+
class MapFactorySpecializer extends BaseSpecializer {
15+
final Procedure _linkedHashMapDefaultFactory;
16+
final Constructor _internalLinkedHashMapConstructor;
17+
18+
MapFactorySpecializer(CoreTypes coreTypes)
19+
: _linkedHashMapDefaultFactory = coreTypes.index
20+
.getProcedure('dart:collection', 'LinkedHashMap', ''),
21+
_internalLinkedHashMapConstructor = coreTypes.index
22+
.getConstructor('dart:_compact_hash', 'DefaultMap', '') {
23+
transformers.addAll({_linkedHashMapDefaultFactory: transformLinkedHashMap});
24+
}
25+
26+
TreeNode transformLinkedHashMap(StaticInvocation node) {
27+
final args = node.arguments;
28+
if (args.named.isEmpty) {
29+
return ConstructorInvocation(
30+
_internalLinkedHashMapConstructor,
31+
Arguments([], types: args.types),
32+
)..fileOffset = node.fileOffset;
33+
}
34+
35+
return node;
36+
}
37+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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 'package:kernel/ast.dart';
6+
import 'package:kernel/core_types.dart' show CoreTypes;
7+
import 'package:kernel/core_types.dart';
8+
9+
import 'factory_specializer.dart';
10+
11+
/// Replaces invocation of Set factory constructors with factories of
12+
/// Wasm-specific classes.
13+
///
14+
/// new LinkedHashSet<E>() => new DefaultSet<E>()
15+
class SetFactorySpecializer extends BaseSpecializer {
16+
final Procedure _linkedHashSetDefaultFactory;
17+
final Constructor _internalLinkedHashSetConstructor;
18+
19+
SetFactorySpecializer(CoreTypes coreTypes)
20+
: _linkedHashSetDefaultFactory = coreTypes.index
21+
.getProcedure('dart:collection', 'LinkedHashSet', ''),
22+
_internalLinkedHashSetConstructor = coreTypes.index
23+
.getConstructor('dart:_compact_hash', 'DefaultSet', '') {
24+
transformers.addAll({_linkedHashSetDefaultFactory: transformLinkedHashSet});
25+
}
26+
27+
TreeNode transformLinkedHashSet(StaticInvocation node) {
28+
final args = node.arguments;
29+
assert(args.positional.isEmpty);
30+
if (args.named.isEmpty) {
31+
return ConstructorInvocation(
32+
_internalLinkedHashSetConstructor,
33+
Arguments([], types: args.types),
34+
);
35+
}
36+
return node;
37+
}
38+
}

pkg/dart2wasm/lib/transformers.dart

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import 'package:kernel/core_types.dart';
99
import 'package:kernel/type_algebra.dart';
1010
import 'package:kernel/type_environment.dart';
1111

12-
import 'list_factory_specializer.dart';
12+
import 'factory_specializer.dart';
1313
import 'util.dart';
1414

1515
void transformLibraries(
@@ -63,7 +63,7 @@ class _WasmTransformer extends Transformer {
6363
final List<_AsyncStarFrame> _asyncStarFrames = [];
6464
bool _enclosingIsAsyncStar = false;
6565

66-
final ListFactorySpecializer _listFactorySpecializer;
66+
final FactorySpecializer _factorySpecializer;
6767

6868
final PushPopWasmArrayTransformer _pushPopWasmArrayTransformer;
6969

@@ -119,7 +119,7 @@ class _WasmTransformer extends Transformer {
119119
.getTopLevelProcedure("dart:_internal", "loadLibrary"),
120120
_checkLibraryIsLoaded = coreTypes.index
121121
.getTopLevelProcedure("dart:_internal", "checkLibraryIsLoaded"),
122-
_listFactorySpecializer = ListFactorySpecializer(coreTypes),
122+
_factorySpecializer = FactorySpecializer(coreTypes),
123123
_pushPopWasmArrayTransformer = PushPopWasmArrayTransformer(coreTypes);
124124

125125
@override
@@ -738,8 +738,14 @@ class _WasmTransformer extends Transformer {
738738
node.target = _trySetStackTrace;
739739
}
740740

741-
return _pushPopWasmArrayTransformer.transformStaticInvocation(
742-
_listFactorySpecializer.transformStaticInvocation(node));
741+
TreeNode transformed =
742+
_pushPopWasmArrayTransformer.transformStaticInvocation(node);
743+
744+
if (transformed is StaticInvocation) {
745+
transformed = _factorySpecializer.transformStaticInvocation(transformed);
746+
}
747+
748+
return transformed;
743749
}
744750

745751
@override

pkg/vm/lib/modular/specializer/map_factory_specializer.dart

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,20 @@ class MapFactorySpecializer extends BaseSpecializer {
1616
final Constructor _internalLinkedHashMapConstructor;
1717

1818
MapFactorySpecializer(CoreTypes coreTypes)
19-
: _linkedHashMapDefaultFactory = assertNotNull(
20-
coreTypes.index.getProcedure('dart:collection', 'LinkedHashMap', ''),
19+
: _linkedHashMapDefaultFactory = coreTypes.index.getProcedure(
20+
'dart:collection',
21+
'LinkedHashMap',
22+
'',
2123
),
22-
_internalLinkedHashMapConstructor = assertNotNull(
23-
coreTypes.index.getConstructor('dart:_compact_hash', '_Map', ''),
24+
25+
_internalLinkedHashMapConstructor = coreTypes.index.getConstructor(
26+
'dart:_compact_hash',
27+
'_Map',
28+
'',
2429
) {
2530
transformers.addAll({_linkedHashMapDefaultFactory: transformLinkedHashMap});
2631
}
2732

28-
static T assertNotNull<T>(T t) {
29-
assert(t != null);
30-
return t;
31-
}
32-
3333
TreeNode transformLinkedHashMap(StaticInvocation node) {
3434
final args = node.arguments;
3535
if (args.named.isEmpty) {

pkg/vm/lib/modular/specializer/set_factory_specializer.dart

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,20 @@ class SetFactorySpecializer extends BaseSpecializer {
1717
final Constructor _internalLinkedHashSetConstructor;
1818

1919
SetFactorySpecializer(CoreTypes coreTypes)
20-
: _linkedHashSetDefaultFactory = assertNotNull(
21-
coreTypes.index.getProcedure('dart:collection', 'LinkedHashSet', ''),
20+
: _linkedHashSetDefaultFactory = coreTypes.index.getProcedure(
21+
'dart:collection',
22+
'LinkedHashSet',
23+
'',
2224
),
23-
_internalLinkedHashSetConstructor = assertNotNull(
24-
coreTypes.index.getConstructor('dart:_compact_hash', '_Set', ''),
25+
26+
_internalLinkedHashSetConstructor = coreTypes.index.getConstructor(
27+
'dart:_compact_hash',
28+
'_Set',
29+
'',
2530
) {
2631
transformers.addAll({_linkedHashSetDefaultFactory: transformLinkedHashSet});
2732
}
2833

29-
static T assertNotNull<T>(T t) {
30-
assert(t != null);
31-
return t;
32-
}
33-
3434
TreeNode transformLinkedHashSet(StaticInvocation node) {
3535
final args = node.arguments;
3636
assert(args.positional.isEmpty);

tests/web/wasm/source_map_simple_optimized_test.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ const List<(String?, int?, int?, String?)?> frameDetails = [
1414
('errors_patch.dart', null, null, '_throwWithCurrentStackTrace'),
1515
('source_map_simple_lib.dart', 16, 3, 'g'),
1616
('source_map_simple_lib.dart', 12, 3, 'f'),
17-
('source_map_simple_lib.dart', 39, 5, 'testMain'),
1817
];
1918

2019
/*

0 commit comments

Comments
 (0)