Skip to content

Commit 95e90ea

Browse files
committed
Add a default-actor bit to actor class descriptors.
1 parent 2274f7e commit 95e90ea

File tree

5 files changed

+78
-0
lines changed

5 files changed

+78
-0
lines changed

include/swift/ABI/Metadata.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4288,6 +4288,10 @@ class TargetClassDescriptor final
42884288
return FieldOffsetVectorOffset;
42894289
}
42904290

4291+
bool isDefaultActor() const {
4292+
return this->getTypeContextDescriptorFlags().class_isDefaultActor();
4293+
}
4294+
42914295
bool hasVTable() const {
42924296
return this->getTypeContextDescriptorFlags().class_hasVTable();
42934297
}

include/swift/ABI/MetadataValues.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1385,6 +1385,14 @@ class TypeContextDescriptorFlags : public FlagSet<uint16_t> {
13851385

13861386
// Type-specific flags:
13871387

1388+
/// Set if the class is a default actor class. Note that this is
1389+
/// based on the best knowledge available to the class; actor
1390+
/// classes with resilient superclassess might be default actors
1391+
/// without knowing it.
1392+
///
1393+
/// Only meaningful for class descriptors.
1394+
Class_IsDefaultActor = 8,
1395+
13881396
/// The kind of reference that this class makes to its resilient superclass
13891397
/// descriptor. A TypeReferenceKind.
13901398
///
@@ -1464,6 +1472,9 @@ class TypeContextDescriptorFlags : public FlagSet<uint16_t> {
14641472
FLAGSET_DEFINE_FLAG_ACCESSORS(Class_AreImmediateMembersNegative,
14651473
class_areImmediateMembersNegative,
14661474
class_setAreImmediateMembersNegative)
1475+
FLAGSET_DEFINE_FLAG_ACCESSORS(Class_IsDefaultActor,
1476+
class_isDefaultActor,
1477+
class_setIsDefaultActor)
14671478

14681479
FLAGSET_DEFINE_FIELD_ACCESSORS(Class_ResilientSuperclassReferenceKind,
14691480
Class_ResilientSuperclassReferenceKind_width,

lib/IRGen/GenMeta.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1619,6 +1619,10 @@ namespace {
16191619

16201620
if (MetadataLayout->hasResilientSuperclass())
16211621
flags.class_setHasResilientSuperclass(true);
1622+
1623+
if (getType()->isDefaultActor(IGM.getSwiftModule(),
1624+
ResilienceExpansion::Maximal))
1625+
flags.class_setIsDefaultActor(true);
16221626
}
16231627

16241628
if (ResilientSuperClassRef) {
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
open actor ResilientBaseActor {
2+
public init() {}
3+
}
4+
5+
@_fixed_layout
6+
open actor FixedSubclassOfResilientBaseActor : ResilientBaseActor {
7+
public override init() {}
8+
}
9+
10+
@_fixed_layout
11+
open actor FixedBaseActor {
12+
public init() {}
13+
}

test/IRGen/async/default_actor.swift

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// RUN: %empty-directory(%t)
2+
// RUN: %target-swift-frontend -emit-module -enable-experimental-concurrency -enable-library-evolution -emit-module-path=%t/resilient_actor.swiftmodule -module-name=resilient_actor %S/Inputs/resilient_actor.swift
3+
// RUN: %target-swift-frontend -I %t -emit-ir -enable-experimental-concurrency -enable-library-evolution %s | %IRGenFileCheck %s
4+
// REQUIRES: concurrency
5+
6+
// CHECK: @"$s13default_actor1ACMn" = hidden constant
7+
// 0x81000050: 0x01000000 IsDefaultActor
8+
// CHECK-SAME: i32 -2130706352,
9+
10+
// CHECK: @"$s13default_actor1BCMn" = hidden constant
11+
// 0x62010050: 0x02000000 IndirectTypeDescriptor + 0x01000000 IsDefaultActor
12+
// CHECK-SAME: i32 1644232784,
13+
14+
// CHECK: @"$s13default_actor1CCMn" = hidden constant
15+
// 0x62010050: 0x02000000 IndirectTypeDescriptor + 0x01000000 IsDefaultActor
16+
// CHECK-SAME: i32 1644232784,
17+
18+
// CHECK: @"$s13default_actor1DCMn" = hidden constant
19+
// 0x63010050: 0x02000000 IndirectTypeDescriptor + 0x01000000 IsDefaultActor
20+
// CHECK-SAME: i32 1661010000,
21+
22+
import resilient_actor
23+
24+
// CHECK-LABEL: define hidden swiftcc void @"$s13default_actor1ACfD"(%T13default_actor1AC* swiftself %0)
25+
// CHECK-NOT: ret void
26+
// CHECK: call swiftcc void @swift_deallocObject(
27+
// CHECK: ret void
28+
actor A {}
29+
30+
// CHECK-LABEL: define hidden swiftcc void @"$s13default_actor1BCfD"(%T13default_actor1BC* swiftself %0)
31+
// CHECK-NOT: ret void
32+
// CHECK: call swiftcc void @swift_deallocObject(
33+
// CHECK: ret void
34+
actor B : ResilientBaseActor {}
35+
36+
// CHECK-LABEL: define hidden swiftcc void @"$s13default_actor1CCfD"(%T13default_actor1CC* swiftself %0)
37+
// CHECK-NOT: ret void
38+
// CHECK: call swiftcc void @swift_deallocObject(
39+
// CHECK: ret void
40+
actor C : FixedSubclassOfResilientBaseActor {}
41+
42+
// CHECK-LABEL: define hidden swiftcc void @"$s13default_actor1DCfD"(%T13default_actor1DC* swiftself %0)
43+
// CHECK-NOT: ret void
44+
// CHECK: call swiftcc void @swift_deallocObject(
45+
// CHECK: ret void
46+
actor D : FixedBaseActor {}

0 commit comments

Comments
 (0)