Skip to content

Commit 4b7ed84

Browse files
committed
Revert "Runtime: Remove retainCount entry points."
This reverts 51e0594. The corelibs are using this entry point.
1 parent dc8dce7 commit 4b7ed84

File tree

6 files changed

+40
-23
lines changed

6 files changed

+40
-23
lines changed

docs/Runtime.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,17 @@ Rename with a non-`stdlib` naming scheme.
8989

9090
## Reference counting
9191

92+
### swift\_retainCount
93+
94+
```
95+
@convention(c) (@unowned NativeObject) -> UInt
96+
```
97+
98+
Returns a random number.
99+
100+
**ABI TODO**: Only used by runtime tests and `SwiftObject.mm`. Should be
101+
internalized.
102+
92103
### TODO
93104

94105
```
@@ -101,6 +112,7 @@ Rename with a non-`stdlib` naming scheme.
101112
000000000001ce30 T _swift_retain
102113
000000000001ce50 T _swift_retain_n
103114
000000000001d140 T _swift_tryPin
115+
000000000001d240 T _swift_tryRetain
104116
0000000000027b10 T _swift_unknownRelease
105117
0000000000027a70 T _swift_unknownRelease_n
106118
0000000000027ad0 T _swift_unknownRetain
@@ -127,6 +139,7 @@ Rename with a non-`stdlib` naming scheme.
127139
000000000001cfb0 T _swift_unownedRelease
128140
000000000001d0a0 T _swift_unownedRelease_n
129141
000000000001cf70 T _swift_unownedRetain
142+
000000000001cf60 T _swift_unownedRetainCount
130143
000000000001d2b0 T _swift_unownedRetainStrong
131144
000000000001d310 T _swift_unownedRetainStrongAndRelease
132145
000000000001d060 T _swift_unownedRetain_n
@@ -150,6 +163,7 @@ Rename with a non-`stdlib` naming scheme.
150163
000000000002b290 T _swift_isUniquelyReferencedOrPinned_nonNull_native
151164
000000000002af00 T _swift_isUniquelyReferenced_native
152165
000000000002aea0 T _swift_isUniquelyReferenced_nonNull_native
166+
000000000001d280 T _swift_isDeallocating
153167
```
154168

155169
**ABI TODO**: `_unsynchronized` r/r entry points
@@ -332,8 +346,6 @@ runtime.
332346
```
333347
0000000000023e60 T _swift_demangleSimpleClass
334348
0000000000028770 T _swift_objcRespondsToSelector
335-
000000000001d280 T _swift_isDeallocating
336-
000000000001d240 T _swift_tryRetain
337349
```
338350

339351
## Metatypes

include/swift/Runtime/HeapObject.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,10 @@ extern "C" void swift_release(HeapObject *object);
206206
/// count reaches zero, the object is destroyed
207207
extern "C" void swift_release_n(HeapObject *object, uint32_t n);
208208

209+
/// ObjC compatibility. Never call this.
210+
extern "C" size_t swift_retainCount(HeapObject *object);
211+
extern "C" size_t swift_unownedRetainCount(HeapObject *object);
212+
209213
/// Is this pointer a non-null unique reference to an object
210214
/// that uses Swift reference counting?
211215
extern "C" bool swift_isUniquelyReferencedNonObjC(const void *);

stdlib/public/runtime/HeapObject.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,14 @@ static void _swift_release_n_(HeapObject *object, uint32_t n) {
309309
}
310310
auto swift::_swift_release_n = _swift_release_n_;
311311

312+
size_t swift::swift_retainCount(HeapObject *object) {
313+
return object->refCount.getCount();
314+
}
315+
316+
size_t swift::swift_unownedRetainCount(HeapObject *object) {
317+
return object->weakRefCount.getCount();
318+
}
319+
312320
void swift::swift_unownedRetain(HeapObject *object) {
313321
if (!object) return;
314322

stdlib/public/runtime/SwiftObject.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ - (id)autorelease {
262262
return _objc_rootAutorelease(self);
263263
}
264264
- (NSUInteger)retainCount {
265-
return reinterpret_cast<HeapObject *>(self)->refCount.getCount();
265+
return swift::swift_retainCount(reinterpret_cast<HeapObject *>(self));
266266
}
267267
- (BOOL)_isDeallocating {
268268
return swift_isDeallocating(reinterpret_cast<HeapObject *>(self));

unittests/runtime/Refcounting.cpp

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -98,30 +98,23 @@ TEST(RefcountingTest, pin_pin_unpin_unpin) {
9898
EXPECT_EQ(1u, value);
9999
}
100100

101-
static uintptr_t retainCount(HeapObject *obj) {
102-
return obj->refCount.getCount();
103-
}
104-
static uintptr_t unownedRetainCount(HeapObject *obj) {
105-
return obj->weakRefCount.getCount();
106-
}
107-
108101
TEST(RefcountingTest, retain_release_n) {
109102
size_t value = 0;
110103
auto object = allocTestObject(&value, 1);
111104
EXPECT_EQ(0u, value);
112105
swift_retain_n(object, 32);
113106
swift_retain(object);
114107
EXPECT_EQ(0u, value);
115-
EXPECT_EQ(34u, retainCount(object));
108+
EXPECT_EQ(34u, swift_retainCount(object));
116109
swift_release_n(object, 31);
117110
EXPECT_EQ(0u, value);
118-
EXPECT_EQ(3u, retainCount(object));
111+
EXPECT_EQ(3u, swift_retainCount(object));
119112
swift_release(object);
120113
EXPECT_EQ(0u, value);
121-
EXPECT_EQ(2u, retainCount(object));
114+
EXPECT_EQ(2u, swift_retainCount(object));
122115
swift_release_n(object, 1);
123116
EXPECT_EQ(0u, value);
124-
EXPECT_EQ(1u, retainCount(object));
117+
EXPECT_EQ(1u, swift_retainCount(object));
125118
swift_release(object);
126119
EXPECT_EQ(1u, value);
127120
}
@@ -133,16 +126,16 @@ TEST(RefcountingTest, unknown_retain_release_n) {
133126
swift_unknownRetain_n(object, 32);
134127
swift_unknownRetain(object);
135128
EXPECT_EQ(0u, value);
136-
EXPECT_EQ(34u, retainCount(object));
129+
EXPECT_EQ(34u, swift_retainCount(object));
137130
swift_unknownRelease_n(object, 31);
138131
EXPECT_EQ(0u, value);
139-
EXPECT_EQ(3u, retainCount(object));
132+
EXPECT_EQ(3u, swift_retainCount(object));
140133
swift_unknownRelease(object);
141134
EXPECT_EQ(0u, value);
142-
EXPECT_EQ(2u, retainCount(object));
135+
EXPECT_EQ(2u, swift_retainCount(object));
143136
swift_unknownRelease_n(object, 1);
144137
EXPECT_EQ(0u, value);
145-
EXPECT_EQ(1u, retainCount(object));
138+
EXPECT_EQ(1u, swift_retainCount(object));
146139
swift_unknownRelease(object);
147140
EXPECT_EQ(1u, value);
148141
}
@@ -153,13 +146,13 @@ TEST(RefcountingTest, unowned_retain_release_n) {
153146
EXPECT_EQ(0u, value);
154147
swift_unownedRetain_n(object, 32);
155148
swift_unownedRetain(object);
156-
EXPECT_EQ(34u, unownedRetainCount(object));
149+
EXPECT_EQ(34u, swift_unownedRetainCount(object));
157150
swift_unownedRelease_n(object, 31);
158-
EXPECT_EQ(3u, unownedRetainCount(object));
151+
EXPECT_EQ(3u, swift_unownedRetainCount(object));
159152
swift_unownedRelease(object);
160-
EXPECT_EQ(2u, unownedRetainCount(object));
153+
EXPECT_EQ(2u, swift_unownedRetainCount(object));
161154
swift_unownedRelease_n(object, 1);
162-
EXPECT_EQ(1u, unownedRetainCount(object));
155+
EXPECT_EQ(1u, swift_unownedRetainCount(object));
163156
swift_release(object);
164157
EXPECT_EQ(1u, value);
165158
}

unittests/runtime/weak.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ - (void) dealloc {
4040
extern "C" HeapObject *make_swift_object();
4141

4242
static unsigned getUnownedRetainCount(HeapObject *object) {
43-
return object->weakRefCount.getCount() - 1;
43+
return swift_unownedRetainCount(object) - 1;
4444
}
4545

4646
static void unknown_release(void *value) {

0 commit comments

Comments
 (0)