Skip to content

Commit 3f9abaa

Browse files
committed
[runtime] Implement sidetable path for isUniquelyReferenced
https://bugs.swift.org/browse/SR-5633
1 parent cfb2a87 commit 3f9abaa

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

stdlib/public/SwiftShims/RefCount.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -961,7 +961,7 @@ class RefCounts {
961961
bool isUniquelyReferenced() const {
962962
auto bits = refCounts.load(SWIFT_MEMORY_ORDER_CONSUME);
963963
if (bits.hasSideTable())
964-
return false; // FIXME: implement side table path if useful
964+
return bits.getSideTable()->isUniquelyReferenced();
965965

966966
assert(!bits.getIsDeiniting());
967967
return bits.isUniquelyReferenced();
@@ -1384,6 +1384,10 @@ class HeapObjectSideTableEntry {
13841384
return refCounts.getCount();
13851385
}
13861386

1387+
bool isUniquelyReferenced() const {
1388+
return refCounts.isUniquelyReferenced();
1389+
}
1390+
13871391
bool isUniquelyReferencedOrPinned() const {
13881392
return refCounts.isUniquelyReferencedOrPinned();
13891393
}

test/stdlib/Builtins.swift

+25
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,31 @@ tests.test("_isUnique/NativeObject") {
3636
expectFalse(_isUnique_native(&b))
3737
}
3838

39+
tests.test("_isUnique/NativeObjectWithPreviousStrongRef") {
40+
var a: Builtin.NativeObject = Builtin.castToNativeObject(X())
41+
expectTrue(_isUnique_native(&a))
42+
var b: Builtin.NativeObject? = a
43+
expectFalse(_isUnique_native(&a))
44+
b = nil
45+
expectTrue(_isUnique_native(&a))
46+
}
47+
48+
tests.test("_isUnique/NativeObjectWithWeakRef") {
49+
var a: Builtin.NativeObject = Builtin.castToNativeObject(X())
50+
expectTrue(_isUnique_native(&a))
51+
weak var b = a
52+
expectTrue(_isUnique_native(&a))
53+
expectFalse(_isUnique_native(&b))
54+
}
55+
56+
tests.test("_isUnique/NativeObjectWithUnownedRef") {
57+
var a: Builtin.NativeObject = Builtin.castToNativeObject(X())
58+
expectTrue(_isUnique_native(&a))
59+
unowned var b = a
60+
expectTrue(_isUnique_native(&a))
61+
expectFalse(_isUnique_native(&b))
62+
}
63+
3964
tests.test("_isUniquelyReferenced/OptionalNativeObject") {
4065
var a: Builtin.NativeObject? = Builtin.castToNativeObject(X())
4166
StdlibUnittest.expectTrue(_getBool(Builtin.isUnique(&a)))

0 commit comments

Comments
 (0)