Skip to content

Commit e5f3b0d

Browse files
alexmarkovCommit Bot
authored and
Commit Bot
committed
[vm/aot] Initial support for records in TFA
This change adds minimal support for RecordType, RecordLiteral, RecordIndexGet, RecordNameGet and RecordConstant kernel nodes to TFA. TFA is *not* yet extended with the ability to infer record types. TEST=language/records/simple Issue: #49719 Change-Id: I7c5eb860c6a5cb263e4d1bb55ad230e5c51f47c2 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/259520 Reviewed-by: Slava Egorov <[email protected]> Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Alexander Markov <[email protected]>
1 parent aa03b81 commit e5f3b0d

File tree

6 files changed

+81
-5
lines changed

6 files changed

+81
-5
lines changed

pkg/kernel/lib/target/targets.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,8 @@ abstract class Target {
542542
Class? concreteConstMapLiteralClass(CoreTypes coreTypes) => null;
543543
Class? concreteSetLiteralClass(CoreTypes coreTypes) => null;
544544
Class? concreteConstSetLiteralClass(CoreTypes coreTypes) => null;
545+
Class? concreteRecordLiteralClass(CoreTypes coreTypes) => null;
546+
Class? concreteConstRecordLiteralClass(CoreTypes coreTypes) => null;
545547

546548
Class? concreteIntLiteralClass(CoreTypes coreTypes, int value) => null;
547549
Class? concreteDoubleLiteralClass(CoreTypes coreTypes, double value) => null;

pkg/vm/lib/target/vm.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class VmTarget extends Target {
3434
Class? _internalImmutableLinkedHashSet;
3535
Class? _internalLinkedHashMap;
3636
Class? _internalLinkedHashSet;
37+
Class? _record;
3738
Class? _oneByteString;
3839
Class? _twoByteString;
3940
Class? _smi;
@@ -451,6 +452,15 @@ class VmTarget extends Target {
451452
.getClass('dart:collection', '_InternalImmutableLinkedHashSet');
452453
}
453454

455+
@override
456+
Class concreteRecordLiteralClass(CoreTypes coreTypes) {
457+
return _record ??= coreTypes.index.getClass('dart:core', '_Record');
458+
}
459+
460+
@override
461+
Class concreteConstRecordLiteralClass(CoreTypes coreTypes) =>
462+
concreteRecordLiteralClass(coreTypes);
463+
454464
@override
455465
Class? concreteIntLiteralClass(CoreTypes coreTypes, int value) {
456466
const int bitsPerInt32 = 32;

pkg/vm/lib/transformations/type_flow/rta.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,16 @@ class _ConstantVisitor extends ConstantVisitor<void> {
458458
}
459459
}
460460

461+
@override
462+
void visitRecordConstant(RecordConstant constant) {
463+
for (var value in constant.positional) {
464+
visit(value);
465+
}
466+
for (var value in constant.named.values) {
467+
visit(value);
468+
}
469+
}
470+
461471
@override
462472
void visitInstanceConstant(InstanceConstant constant) {
463473
rta.addAllocatedClass(constant.classNode);

pkg/vm/lib/transformations/type_flow/summary_collector.dart

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1617,6 +1617,34 @@ class SummaryCollector extends RecursiveResultVisitor<TypeExpr?> {
16171617
return _staticType(node);
16181618
}
16191619

1620+
@override
1621+
TypeExpr visitRecordLiteral(RecordLiteral node) {
1622+
for (var expr in node.positional) {
1623+
_visit(expr);
1624+
}
1625+
for (var expr in node.named) {
1626+
_visit(expr.value);
1627+
}
1628+
Class? concreteClass =
1629+
target.concreteRecordLiteralClass(_environment.coreTypes);
1630+
if (concreteClass != null) {
1631+
return _entryPointsListener.addAllocatedClass(concreteClass);
1632+
}
1633+
return _staticType(node);
1634+
}
1635+
1636+
@override
1637+
TypeExpr visitRecordIndexGet(RecordIndexGet node) {
1638+
_visit(node.receiver);
1639+
return _staticType(node);
1640+
}
1641+
1642+
@override
1643+
TypeExpr visitRecordNameGet(RecordNameGet node) {
1644+
_visit(node.receiver);
1645+
return _staticType(node);
1646+
}
1647+
16201648
@override
16211649
TypeExpr visitInstanceInvocation(InstanceInvocation node) {
16221650
final receiverNode = node.receiver;
@@ -2561,6 +2589,24 @@ class ConstantAllocationCollector extends ConstantVisitor<Type> {
25612589
return _getStaticType(constant);
25622590
}
25632591

2592+
@override
2593+
Type visitRecordConstant(RecordConstant constant) {
2594+
for (var value in constant.positional) {
2595+
typeFor(value);
2596+
}
2597+
for (var value in constant.named.values) {
2598+
typeFor(value);
2599+
}
2600+
Class? concreteClass = summaryCollector.target
2601+
.concreteConstRecordLiteralClass(
2602+
summaryCollector._environment.coreTypes);
2603+
if (concreteClass != null) {
2604+
return summaryCollector._entryPointsListener
2605+
.addAllocatedClass(concreteClass);
2606+
}
2607+
return _getStaticType(constant);
2608+
}
2609+
25642610
@override
25652611
Type visitInstanceConstant(InstanceConstant constant) {
25662612
final resultClass = summaryCollector._entryPointsListener

pkg/vm/lib/transformations/type_flow/transformer.dart

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -985,11 +985,6 @@ class _TreeShakerTypeVisitor extends RecursiveVisitor {
985985
node.visitChildren(this);
986986
}
987987

988-
@override
989-
visitFunctionType(FunctionType node) {
990-
node.visitChildren(this);
991-
}
992-
993988
@override
994989
visitTypeParameterType(TypeParameterType node) {
995990
final parent = node.parameter.parent;
@@ -1954,6 +1949,16 @@ class _TreeShakerConstantVisitor extends ConstantVisitor<Null> {
19541949
}
19551950
}
19561951

1952+
@override
1953+
visitRecordConstant(RecordConstant constant) {
1954+
for (var value in constant.positional) {
1955+
analyzeConstant(value);
1956+
}
1957+
for (var value in constant.named.values) {
1958+
analyzeConstant(value);
1959+
}
1960+
}
1961+
19571962
@override
19581963
visitInstanceConstant(InstanceConstant constant) {
19591964
instanceConstants.add(constant);

pkg/vm/lib/transformations/type_flow/types.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ abstract class TypesBuilder {
8686
} else if (type is FunctionType) {
8787
// TODO(alexmarkov): support function types
8888
result = const AnyType();
89+
} else if (type is RecordType) {
90+
// TODO(dartbug.com/49719): support inference of record types
91+
result = const AnyType();
8992
} else if (type is FutureOrType) {
9093
// TODO(alexmarkov): support FutureOr types
9194
result = const AnyType();

0 commit comments

Comments
 (0)