@@ -1227,7 +1227,6 @@ TEST(TestOpaqueExistentialBox, test_assignWithCopy_indirect_indirect) {
1227
1227
FullOpaqueMetadata testMetadata2 = {{&testTable2}, {{MetadataKind::Opaque}}};
1228
1228
Metadata *metadata2 = &testMetadata2.base ;
1229
1229
1230
- void *zeroPtr = nullptr ;
1231
1230
auto refAndObjectAddr = BoxPair (swift_allocBox (metadata));
1232
1231
swift_retain (refAndObjectAddr.first );
1233
1232
auto refAndObjectAddr2 = BoxPair (swift_allocBox (metadata2));
@@ -1264,7 +1263,6 @@ TEST(TestOpaqueExistentialBox, test_assignWithTake_indirect_indirect) {
1264
1263
FullOpaqueMetadata testMetadata2 = {{&testTable2}, {{MetadataKind::Opaque}}};
1265
1264
Metadata *metadata2 = &testMetadata2.base ;
1266
1265
1267
- void *zeroPtr = nullptr ;
1268
1266
auto refAndObjectAddr = BoxPair (swift_allocBox (metadata));
1269
1267
swift_retain (refAndObjectAddr.first );
1270
1268
auto refAndObjectAddr2 = BoxPair (swift_allocBox (metadata2));
@@ -1424,3 +1422,137 @@ TEST(TestOpaqueExistentialBox, test_assignWithTake_indirect_pod) {
1424
1422
EXPECT_EQ (existBox.buffer .PrivateData [2 ], someAddr);
1425
1423
EXPECT_EQ (swift_retainCount (refAndObjectAddr2.first ), 1 );
1426
1424
}
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