Skip to content

Commit 958b9ad

Browse files
committed
Tests for OpaqueBoxedExistentials initWithXXX value witnesses
rdar://31958059
1 parent a99bfd1 commit 958b9ad

File tree

1 file changed

+134
-2
lines changed

1 file changed

+134
-2
lines changed

unittests/runtime/Metadata.cpp

Lines changed: 134 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1227,7 +1227,6 @@ TEST(TestOpaqueExistentialBox, test_assignWithCopy_indirect_indirect) {
12271227
FullOpaqueMetadata testMetadata2 = {{&testTable2}, {{MetadataKind::Opaque}}};
12281228
Metadata *metadata2 = &testMetadata2.base;
12291229

1230-
void *zeroPtr = nullptr;
12311230
auto refAndObjectAddr = BoxPair(swift_allocBox(metadata));
12321231
swift_retain(refAndObjectAddr.first);
12331232
auto refAndObjectAddr2 = BoxPair(swift_allocBox(metadata2));
@@ -1264,7 +1263,6 @@ TEST(TestOpaqueExistentialBox, test_assignWithTake_indirect_indirect) {
12641263
FullOpaqueMetadata testMetadata2 = {{&testTable2}, {{MetadataKind::Opaque}}};
12651264
Metadata *metadata2 = &testMetadata2.base;
12661265

1267-
void *zeroPtr = nullptr;
12681266
auto refAndObjectAddr = BoxPair(swift_allocBox(metadata));
12691267
swift_retain(refAndObjectAddr.first);
12701268
auto refAndObjectAddr2 = BoxPair(swift_allocBox(metadata2));
@@ -1424,3 +1422,137 @@ TEST(TestOpaqueExistentialBox, test_assignWithTake_indirect_pod) {
14241422
EXPECT_EQ(existBox.buffer.PrivateData[2], someAddr);
14251423
EXPECT_EQ(swift_retainCount(refAndObjectAddr2.first), 1);
14261424
}
1425+
1426+
TEST(TestOpaqueExistentialBox, test_initWithCopy_pod) {
1427+
auto any =
1428+
swift_getExistentialTypeMetadata(ProtocolClassConstraint::Any,
1429+
/*superclass=*/nullptr, 0, nullptr);
1430+
auto anyVWT = any->getValueWitnesses();
1431+
1432+
ValueWitnessTable testTable;
1433+
initialize_pod_witness_table(testTable);
1434+
FullOpaqueMetadata testMetadata = {{&testTable}, {{MetadataKind::Opaque}}};
1435+
Metadata *metadata = &testMetadata.base;
1436+
1437+
ValueWitnessTable testTable2;
1438+
initialize_pod_witness_table(testTable2);
1439+
FullOpaqueMetadata testMetadata2 = {{&testTable2}, {{MetadataKind::Opaque}}};
1440+
Metadata *metadata2 = &testMetadata2.base;
1441+
1442+
void *zeroPtr = nullptr;
1443+
void *otherPtr = &zeroPtr;
1444+
struct {
1445+
ValueBuffer buffer;
1446+
Metadata *type;
1447+
uintptr_t canary;
1448+
} existBox{{{zeroPtr, zeroPtr, zeroPtr}}, metadata, 0x5A5A5A5AU},
1449+
existBox2{{{otherPtr, otherPtr, zeroPtr}}, metadata2, 0xB5A5A5A5U};
1450+
1451+
anyVWT->initializeWithCopy(reinterpret_cast<OpaqueValue *>(&existBox),
1452+
reinterpret_cast<OpaqueValue *>(&existBox2), any);
1453+
EXPECT_EQ(existBox.type, metadata2);
1454+
EXPECT_EQ(existBox.canary, 0x5A5A5A5AU);
1455+
EXPECT_EQ(existBox.buffer.PrivateData[0], otherPtr);
1456+
EXPECT_EQ(existBox.buffer.PrivateData[1], otherPtr);
1457+
EXPECT_EQ(existBox.buffer.PrivateData[2], zeroPtr);
1458+
}
1459+
1460+
TEST(TestOpaqueExistentialBox, test_initWithTake_pod) {
1461+
auto any =
1462+
swift_getExistentialTypeMetadata(ProtocolClassConstraint::Any,
1463+
/*superclass=*/nullptr, 0, nullptr);
1464+
auto anyVWT = any->getValueWitnesses();
1465+
1466+
ValueWitnessTable testTable;
1467+
initialize_pod_witness_table(testTable);
1468+
FullOpaqueMetadata testMetadata = {{&testTable}, {{MetadataKind::Opaque}}};
1469+
Metadata *metadata = &testMetadata.base;
1470+
1471+
ValueWitnessTable testTable2;
1472+
initialize_pod_witness_table(testTable2);
1473+
FullOpaqueMetadata testMetadata2 = {{&testTable2}, {{MetadataKind::Opaque}}};
1474+
Metadata *metadata2 = &testMetadata2.base;
1475+
1476+
void *zeroPtr = nullptr;
1477+
void *otherPtr = &zeroPtr;
1478+
struct {
1479+
ValueBuffer buffer;
1480+
Metadata *type;
1481+
uintptr_t canary;
1482+
} existBox{{{zeroPtr, zeroPtr, zeroPtr}}, metadata, 0x5A5A5A5AU},
1483+
existBox2{{{otherPtr, otherPtr, zeroPtr}}, metadata2, 0xB5A5A5A5U};
1484+
1485+
anyVWT->initializeWithTake(reinterpret_cast<OpaqueValue *>(&existBox),
1486+
reinterpret_cast<OpaqueValue *>(&existBox2), any);
1487+
EXPECT_EQ(existBox.type, metadata2);
1488+
EXPECT_EQ(existBox.canary, 0x5A5A5A5AU);
1489+
EXPECT_EQ(existBox.buffer.PrivateData[0], otherPtr);
1490+
EXPECT_EQ(existBox.buffer.PrivateData[1], otherPtr);
1491+
EXPECT_EQ(existBox.buffer.PrivateData[2], zeroPtr);
1492+
}
1493+
1494+
TEST(TestOpaqueExistentialBox, test_initWithCopy_indirect) {
1495+
auto any =
1496+
swift_getExistentialTypeMetadata(ProtocolClassConstraint::Any,
1497+
/*superclass=*/nullptr, 0, nullptr);
1498+
auto anyVWT = any->getValueWitnesses();
1499+
1500+
ValueWitnessTable testTable;
1501+
initialize_pod_witness_table(testTable);
1502+
FullOpaqueMetadata testMetadata = {{&testTable}, {{MetadataKind::Opaque}}};
1503+
Metadata *metadata = &testMetadata.base;
1504+
1505+
ValueWitnessTable testTable2;
1506+
initialize_indirect_witness_table(testTable2);
1507+
FullOpaqueMetadata testMetadata2 = {{&testTable2}, {{MetadataKind::Opaque}}};
1508+
Metadata *metadata2 = &testMetadata2.base;
1509+
1510+
auto refAndObjectAddr2 = BoxPair(swift_allocBox(metadata2));
1511+
struct {
1512+
ValueBuffer buffer;
1513+
Metadata *type;
1514+
uintptr_t canary;
1515+
} existBox{{{nullptr, nullptr, nullptr}}, metadata, 0x5A5A5A5AU},
1516+
existBox2{{{refAndObjectAddr2.first, nullptr, nullptr}}, metadata2, 0xB5A5A5A5U};
1517+
1518+
anyVWT->initializeWithCopy(reinterpret_cast<OpaqueValue *>(&existBox),
1519+
reinterpret_cast<OpaqueValue *>(&existBox2), any);
1520+
1521+
EXPECT_EQ(existBox.type, metadata2);
1522+
EXPECT_EQ(existBox.canary, 0x5A5A5A5AU);
1523+
EXPECT_EQ(existBox.buffer.PrivateData[0], refAndObjectAddr2.first);
1524+
EXPECT_EQ(swift_retainCount(refAndObjectAddr2.first), 2);
1525+
}
1526+
1527+
TEST(TestOpaqueExistentialBox, test_initWithTake_indirect) {
1528+
auto any =
1529+
swift_getExistentialTypeMetadata(ProtocolClassConstraint::Any,
1530+
/*superclass=*/nullptr, 0, nullptr);
1531+
auto anyVWT = any->getValueWitnesses();
1532+
1533+
ValueWitnessTable testTable;
1534+
initialize_pod_witness_table(testTable);
1535+
FullOpaqueMetadata testMetadata = {{&testTable}, {{MetadataKind::Opaque}}};
1536+
Metadata *metadata = &testMetadata.base;
1537+
1538+
ValueWitnessTable testTable2;
1539+
initialize_indirect_witness_table(testTable2);
1540+
FullOpaqueMetadata testMetadata2 = {{&testTable2}, {{MetadataKind::Opaque}}};
1541+
Metadata *metadata2 = &testMetadata2.base;
1542+
1543+
auto refAndObjectAddr2 = BoxPair(swift_allocBox(metadata2));
1544+
struct {
1545+
ValueBuffer buffer;
1546+
Metadata *type;
1547+
uintptr_t canary;
1548+
} existBox{{{nullptr, nullptr, nullptr}}, metadata, 0x5A5A5A5AU},
1549+
existBox2{{{refAndObjectAddr2.first, nullptr, nullptr}}, metadata2, 0xB5A5A5A5U};
1550+
1551+
anyVWT->initializeWithTake(reinterpret_cast<OpaqueValue *>(&existBox),
1552+
reinterpret_cast<OpaqueValue *>(&existBox2), any);
1553+
1554+
EXPECT_EQ(existBox.type, metadata2);
1555+
EXPECT_EQ(existBox.canary, 0x5A5A5A5AU);
1556+
EXPECT_EQ(existBox.buffer.PrivateData[0], refAndObjectAddr2.first);
1557+
EXPECT_EQ(swift_retainCount(refAndObjectAddr2.first), 1);
1558+
}

0 commit comments

Comments
 (0)