runtime: Fix overflow of swift_unownedRetain reference counts

On 32bit platforms there are 7 bits reserved for the unowned retain count. This
makes overflow a likely scenario. Implement overflow into the side table.

rdar://33495003
This commit is contained in:
Arnold Schwaighofer
2017-08-01 08:08:56 -07:00
parent 17ddc5802f
commit d8abd2fed9
6 changed files with 100 additions and 7 deletions

View File

@@ -153,6 +153,24 @@ TEST(RefcountingTest, unowned_retain_release_n) {
EXPECT_EQ(1u, value);
}
TEST(RefcountingTest, unowned_retain_release_n_overflow) {
// This test would test overflow on 32bit platforms.
// These platforms have 7 unowned reference count bits.
size_t value = 0;
auto object = allocTestObject(&value, 1);
EXPECT_EQ(0u, value);
swift_unownedRetain_n(object, 128);
EXPECT_EQ(129u, swift_unownedRetainCount(object));
swift_unownedRetain(object);
EXPECT_EQ(130u, swift_unownedRetainCount(object));
swift_unownedRelease_n(object, 128);
EXPECT_EQ(2u, swift_unownedRetainCount(object));
swift_unownedRelease(object);
EXPECT_EQ(1u, swift_unownedRetainCount(object));
swift_release(object);
EXPECT_EQ(1u, value);
}
TEST(RefcountingTest, isUniquelyReferenced) {
size_t value = 0;
auto object = allocTestObject(&value, 1);