Skip to content

Commit e40fd30

Browse files
natebiggsCommit Bot
authored and
Commit Bot
committed
[dart2js] Allow SpecialMemberDefinition to copy Deferrable from ClosureMemberDefiniton
Codegen deserialization was inadvertantly loading the nodes for many ClosureMemberDefinitions, specifically ones for generators. The node doesn't actually end up being used after this point though so the Deferrable is unnecessarily triggered. To get around this we have the SpecialMemberDefinition constructor copy the Deferrable out of the ClosureMemberDefinition. To avoid exposing the deferrable I've moved the ClosureMemberDefinition into the same library as SpecialMemberDefinition. This brings the number of Kernel AST function bodies being deserialized down to 2 in cm_shell (down from many thousand). Change-Id: I0781ab490dc1972118cf2ac2359f467916031633 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/247283 Reviewed-by: Stephen Adams <[email protected]> Commit-Queue: Nate Biggs <[email protected]> Reviewed-by: Joshua Litt <[email protected]>
1 parent 5da4b52 commit e40fd30

File tree

4 files changed

+55
-50
lines changed

4 files changed

+55
-50
lines changed

pkg/compiler/lib/src/js_model/closure.dart

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1361,51 +1361,6 @@ class ClosureFieldData extends ClosureMemberData implements JFieldData {
13611361
ClassTypeVariableAccess.none;
13621362
}
13631363

1364-
class ClosureMemberDefinition implements MemberDefinition {
1365-
/// Tag used for identifying serialized [ClosureMemberDefinition] objects in a
1366-
/// debugging data stream.
1367-
static const String tag = 'closure-member-definition';
1368-
1369-
@override
1370-
final SourceSpan location;
1371-
@override
1372-
final MemberKind kind;
1373-
@override
1374-
ir.TreeNode get node => _node.loaded();
1375-
final Deferrable<ir.TreeNode> _node;
1376-
1377-
ClosureMemberDefinition(this.location, this.kind, ir.TreeNode node)
1378-
: _node = Deferrable.eager(node),
1379-
assert(
1380-
kind == MemberKind.closureCall || kind == MemberKind.closureField);
1381-
1382-
ClosureMemberDefinition._deserialized(this.location, this.kind, this._node)
1383-
: assert(
1384-
kind == MemberKind.closureCall || kind == MemberKind.closureField);
1385-
1386-
factory ClosureMemberDefinition.readFromDataSource(
1387-
DataSourceReader source, MemberKind kind) {
1388-
source.begin(tag);
1389-
SourceSpan location = source.readSourceSpan();
1390-
Deferrable<ir.TreeNode> node =
1391-
source.readDeferrable(() => source.readTreeNode());
1392-
source.end(tag);
1393-
return ClosureMemberDefinition._deserialized(location, kind, node);
1394-
}
1395-
1396-
@override
1397-
void writeToDataSink(DataSinkWriter sink) {
1398-
sink.writeEnum(kind);
1399-
sink.begin(tag);
1400-
sink.writeSourceSpan(location);
1401-
sink.writeDeferrable(() => sink.writeTreeNode(node));
1402-
sink.end(tag);
1403-
}
1404-
1405-
@override
1406-
String toString() => 'ClosureMemberDefinition(kind:$kind,location:$location)';
1407-
}
1408-
14091364
class RecordContainerDefinition implements ClassDefinition {
14101365
/// Tag used for identifying serialized [RecordContainerDefinition] objects in
14111366
/// a debugging data stream.

pkg/compiler/lib/src/js_model/element_map.dart

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,11 @@ class SpecialMemberDefinition implements MemberDefinition {
422422
SpecialMemberDefinition(ir.TreeNode node, this.kind)
423423
: _node = Deferrable.eager(node);
424424

425+
SpecialMemberDefinition.from(MemberDefinition baseMember, this.kind)
426+
: _node = baseMember is ClosureMemberDefinition
427+
? baseMember._node
428+
: Deferrable.eager(baseMember.node);
429+
425430
SpecialMemberDefinition._deserialized(this._node, this.kind);
426431

427432
factory SpecialMemberDefinition.readFromDataSource(
@@ -449,6 +454,51 @@ class SpecialMemberDefinition implements MemberDefinition {
449454
'node:$node,location:$location)';
450455
}
451456

457+
class ClosureMemberDefinition implements MemberDefinition {
458+
/// Tag used for identifying serialized [ClosureMemberDefinition] objects in a
459+
/// debugging data stream.
460+
static const String tag = 'closure-member-definition';
461+
462+
@override
463+
final SourceSpan location;
464+
@override
465+
final MemberKind kind;
466+
@override
467+
ir.TreeNode get node => _node.loaded();
468+
final Deferrable<ir.TreeNode> _node;
469+
470+
ClosureMemberDefinition(this.location, this.kind, ir.TreeNode node)
471+
: _node = Deferrable.eager(node),
472+
assert(
473+
kind == MemberKind.closureCall || kind == MemberKind.closureField);
474+
475+
ClosureMemberDefinition._deserialized(this.location, this.kind, this._node)
476+
: assert(
477+
kind == MemberKind.closureCall || kind == MemberKind.closureField);
478+
479+
factory ClosureMemberDefinition.readFromDataSource(
480+
DataSourceReader source, MemberKind kind) {
481+
source.begin(tag);
482+
SourceSpan location = source.readSourceSpan();
483+
Deferrable<ir.TreeNode> node =
484+
source.readDeferrable(() => source.readTreeNode());
485+
source.end(tag);
486+
return ClosureMemberDefinition._deserialized(location, kind, node);
487+
}
488+
489+
@override
490+
void writeToDataSink(DataSinkWriter sink) {
491+
sink.writeEnum(kind);
492+
sink.begin(tag);
493+
sink.writeSourceSpan(location);
494+
sink.writeDeferrable(() => sink.writeTreeNode(node));
495+
sink.end(tag);
496+
}
497+
498+
@override
499+
String toString() => 'ClosureMemberDefinition(kind:$kind,location:$location)';
500+
}
501+
452502
/// Definition information for a [ClassEntity].
453503
abstract class ClassDefinition {
454504
/// The kind of the defined class. This determines the semantics of [node].

pkg/compiler/lib/src/js_model/element_map_impl.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1380,7 +1380,7 @@ class JsKernelToElementMap implements JsToElementMap, IrToElementMap {
13801380
return lookup;
13811381
}
13821382

1383-
String /*?*/ _getStringArgument(ir.StaticInvocation node, int index) {
1383+
String _getStringArgument(ir.StaticInvocation node, int index) {
13841384
return node.arguments.positional[index].accept(Stringifier());
13851385
}
13861386

@@ -2161,14 +2161,15 @@ class JsKernelToElementMap implements JsToElementMap, IrToElementMap {
21612161
JGeneratorBody generatorBody = _generatorBodies[function];
21622162
if (generatorBody == null) {
21632163
FunctionData functionData = members.getData(function);
2164-
ir.TreeNode node = functionData.definition.node;
21652164
DartType elementType =
21662165
elementEnvironment.getFunctionAsyncOrSyncStarElementType(function);
21672166
generatorBody = createGeneratorBody(function, elementType);
21682167
members.register<IndexedFunction, FunctionData>(
21692168
generatorBody,
2170-
GeneratorBodyFunctionData(functionData,
2171-
SpecialMemberDefinition(node, MemberKind.generatorBody)));
2169+
GeneratorBodyFunctionData(
2170+
functionData,
2171+
SpecialMemberDefinition.from(
2172+
functionData.definition, MemberKind.generatorBody)));
21722173

21732174
if (function.enclosingClass != null) {
21742175
// TODO(sra): Integrate this with ClassEnvImpl.addConstructorBody ?

pkg/compiler/lib/src/serialization/deferrable.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ import 'package:compiler/src/serialization/serialization_interfaces.dart';
5555
/// }
5656
abstract class Deferrable<E> {
5757
E loaded();
58-
static int count = 0;
5958

6059
factory Deferrable.deferred(DataSourceReader reader, E f(), int offset,
6160
{bool cacheData = true}) =>

0 commit comments

Comments
 (0)