@@ -662,9 +662,13 @@ static void objcStrongDestroyBranchless(const Metadata *metadata,
662
662
LayoutStringReader1 &reader,
663
663
uintptr_t &addrOffset,
664
664
uint8_t *addr) {
665
- objc_object * object = (objc_object*)(*( uintptr_t *)(addr + addrOffset) );
665
+ uintptr_t object = *( uintptr_t *)(addr + addrOffset);
666
666
addrOffset += sizeof (objc_object*);
667
- objc_release (object);
667
+ if (object & _swift_abi_ObjCReservedBitsMask)
668
+ return ;
669
+
670
+ object &= ~_swift_abi_SwiftSpareBitsMask;
671
+ objc_release ((objc_object *)object);
668
672
}
669
673
#endif
670
674
@@ -697,7 +701,9 @@ static void resilientDestroyBranchless(const Metadata *metadata,
697
701
uintptr_t &addrOffset,
698
702
uint8_t *addr) {
699
703
auto *type = getResilientTypeMetadata (metadata, reader);
700
- type->vw_destroy ((OpaqueValue *)(addr + addrOffset));
704
+ auto *object = (OpaqueValue *)(addr + addrOffset);
705
+ addrOffset += type->vw_size ();
706
+ type->vw_destroy (object);
701
707
}
702
708
703
709
typedef void (*DestrFnBranchless)(const Metadata *metadata,
@@ -891,10 +897,13 @@ static void objcStrongRetainBranchless(const Metadata *metadata,
891
897
uint8_t *dest,
892
898
uint8_t *src) {
893
899
uintptr_t _addrOffset = addrOffset;
894
- objc_object *object = (objc_object*)(*(uintptr_t *)(src + _addrOffset));
895
- memcpy (dest + _addrOffset, &object, sizeof (objc_object*));
896
- addrOffset = _addrOffset + sizeof (objc_object*);
897
- objc_retain (object);
900
+ uintptr_t object = *(uintptr_t *)(src + _addrOffset);
901
+ memcpy (dest + _addrOffset, &object, sizeof (objc_object *));
902
+ addrOffset = _addrOffset + sizeof (objc_object *);
903
+ if (object & _swift_abi_ObjCReservedBitsMask)
904
+ return ;
905
+ object &= ~_swift_abi_SwiftSpareBitsMask;
906
+ objc_retain ((objc_object *)object);
898
907
}
899
908
#endif
900
909
@@ -1004,6 +1013,8 @@ swift_generic_initWithCopy(swift::OpaqueValue *dest, swift::OpaqueValue *src,
1004
1013
uintptr_t addrOffset = 0 ;
1005
1014
handleRefCountsInitWithCopy (metadata, reader, addrOffset, (uint8_t *)dest, (uint8_t *)src);
1006
1015
1016
+ assert (addrOffset == metadata->vw_size ());
1017
+
1007
1018
return dest;
1008
1019
}
1009
1020
@@ -1062,8 +1073,10 @@ static void existentialInitWithTake(const Metadata *metadata,
1062
1073
auto *destObject = (OpaqueValue *)(dest + _addrOffset);
1063
1074
auto *srcObject = (OpaqueValue *)(src + _addrOffset);
1064
1075
addrOffset = _addrOffset + (sizeof (uintptr_t ) * NumWords_ValueBuffer);
1065
- if (SWIFT_UNLIKELY (! type->getValueWitnesses ()->isBitwiseTakable () )) {
1076
+ if (type->getValueWitnesses ()->isValueInline ( )) {
1066
1077
type->vw_initializeWithTake (destObject, srcObject);
1078
+ } else {
1079
+ memcpy (destObject, srcObject, sizeof (uintptr_t ));
1067
1080
}
1068
1081
}
1069
1082
@@ -1150,6 +1163,8 @@ swift_generic_initWithTake(swift::OpaqueValue *dest, swift::OpaqueValue *src,
1150
1163
1151
1164
handleRefCountsInitWithTake (metadata, reader, addrOffset, (uint8_t *)dest, (uint8_t *)src);
1152
1165
1166
+ assert (addrOffset == metadata->vw_size ());
1167
+
1153
1168
return dest;
1154
1169
}
1155
1170
@@ -1282,12 +1297,20 @@ static void objcStrongAssignWithCopy(const Metadata *metadata,
1282
1297
uint8_t *dest,
1283
1298
uint8_t *src) {
1284
1299
uintptr_t _addrOffset = addrOffset;
1285
- objc_object * destObject = (objc_object*)(*( uintptr_t *)(dest + _addrOffset) );
1286
- objc_object * srcObject = (objc_object*)(*( uintptr_t *)(src + _addrOffset) );
1300
+ uintptr_t destObject = *( uintptr_t *)(dest + _addrOffset);
1301
+ uintptr_t srcObject = *( uintptr_t *)(src + _addrOffset);
1287
1302
memcpy (dest + _addrOffset, &srcObject, sizeof (objc_object*));
1288
1303
addrOffset = _addrOffset + sizeof (objc_object*);
1289
- objc_release (destObject);
1290
- objc_retain (srcObject);
1304
+
1305
+ if (!(destObject & _swift_abi_ObjCReservedBitsMask)) {
1306
+ destObject &= ~_swift_abi_SwiftSpareBitsMask;
1307
+ objc_release ((objc_object *)destObject);
1308
+ }
1309
+
1310
+ if (!(srcObject & _swift_abi_ObjCReservedBitsMask)) {
1311
+ srcObject &= ~_swift_abi_SwiftSpareBitsMask;
1312
+ objc_retain ((objc_object *)srcObject);
1313
+ }
1291
1314
}
1292
1315
#endif
1293
1316
@@ -1599,7 +1622,7 @@ static void multiPayloadEnumFNAssignWithCopy(const Metadata *metadata,
1599
1622
if (trailingBytes)
1600
1623
memcpy (dest + nestedAddrOffset, src + nestedAddrOffset, trailingBytes);
1601
1624
return ;
1602
- } else if (destTag > numPayloads) {
1625
+ } else if (srcTag < numPayloads) {
1603
1626
addrOffset += enumSize;
1604
1627
size_t refCountOffset = nestedReader.peekBytes <size_t >(srcTag * sizeof (size_t ));
1605
1628
nestedReader.skip ((numPayloads * sizeof (size_t )) + refCountOffset);
@@ -1608,7 +1631,10 @@ static void multiPayloadEnumFNAssignWithCopy(const Metadata *metadata,
1608
1631
if (trailingBytes)
1609
1632
memcpy (dest + nestedAddrOffset, src + nestedAddrOffset, trailingBytes);
1610
1633
return ;
1611
- } else if (srcTag > numPayloads) {
1634
+ } else if (destTag < numPayloads) {
1635
+ size_t refCountOffset =
1636
+ nestedReader.peekBytes <size_t >(destTag * sizeof (size_t ));
1637
+ nestedReader.skip ((numPayloads * sizeof (size_t )) + refCountOffset);
1612
1638
handleRefCountsDestroy (metadata, nestedReader, nestedAddrOffset, dest);
1613
1639
}
1614
1640
@@ -1654,7 +1680,7 @@ static void multiPayloadEnumFNResolvedAssignWithCopy(const Metadata *metadata,
1654
1680
if (trailingBytes)
1655
1681
memcpy (dest + nestedAddrOffset, src + nestedAddrOffset, trailingBytes);
1656
1682
return ;
1657
- } else if (destTag > numPayloads) {
1683
+ } else if (srcTag < numPayloads) {
1658
1684
addrOffset += enumSize;
1659
1685
size_t refCountOffset = nestedReader.peekBytes <size_t >(srcTag * sizeof (size_t ));
1660
1686
nestedReader.skip ((numPayloads * sizeof (size_t )) + refCountOffset);
@@ -1663,7 +1689,10 @@ static void multiPayloadEnumFNResolvedAssignWithCopy(const Metadata *metadata,
1663
1689
if (trailingBytes)
1664
1690
memcpy (dest + nestedAddrOffset, src + nestedAddrOffset, trailingBytes);
1665
1691
return ;
1666
- } else if (srcTag > numPayloads) {
1692
+ } else if (destTag < numPayloads) {
1693
+ size_t refCountOffset =
1694
+ nestedReader.peekBytes <size_t >(destTag * sizeof (size_t ));
1695
+ nestedReader.skip ((numPayloads * sizeof (size_t )) + refCountOffset);
1667
1696
handleRefCountsDestroy (metadata, nestedReader, nestedAddrOffset, dest);
1668
1697
}
1669
1698
@@ -1711,7 +1740,7 @@ static void multiPayloadEnumGenericAssignWithCopy(const Metadata *metadata,
1711
1740
if (trailingBytes)
1712
1741
memcpy (dest + nestedAddrOffset, src + nestedAddrOffset, trailingBytes);
1713
1742
return ;
1714
- } else if (destTag > numPayloads) {
1743
+ } else if (srcTag < numPayloads) {
1715
1744
addrOffset += enumSize;
1716
1745
size_t refCountOffset = nestedReader.peekBytes <size_t >(srcTag * sizeof (size_t ));
1717
1746
nestedReader.skip ((numPayloads * sizeof (size_t )) + refCountOffset);
@@ -1720,7 +1749,10 @@ static void multiPayloadEnumGenericAssignWithCopy(const Metadata *metadata,
1720
1749
if (trailingBytes)
1721
1750
memcpy (dest + nestedAddrOffset, src + nestedAddrOffset, trailingBytes);
1722
1751
return ;
1723
- } else if (srcTag > numPayloads) {
1752
+ } else if (destTag < numPayloads) {
1753
+ size_t refCountOffset =
1754
+ nestedReader.peekBytes <size_t >(destTag * sizeof (size_t ));
1755
+ nestedReader.skip ((numPayloads * sizeof (size_t )) + refCountOffset);
1724
1756
handleRefCountsDestroy (metadata, nestedReader, nestedAddrOffset, dest);
1725
1757
}
1726
1758
@@ -1784,12 +1816,17 @@ static void handleRefCountsAssignWithCopy(const Metadata *metadata,
1784
1816
extern " C" swift::OpaqueValue *
1785
1817
swift_generic_assignWithCopy (swift::OpaqueValue *dest, swift::OpaqueValue *src,
1786
1818
const Metadata *metadata) {
1787
- const uint8_t *layoutStr = metadata->getLayoutString ();
1788
- LayoutStringReader1 reader{layoutStr + layoutStringHeaderSize};
1789
- uintptr_t addrOffset = 0 ;
1790
- handleRefCountsAssignWithCopy (metadata, reader, addrOffset, (uint8_t *)dest, (uint8_t *)src);
1819
+ // const uint8_t *layoutStr = metadata->getLayoutString();
1820
+ // LayoutStringReader1 reader{layoutStr + layoutStringHeaderSize};
1821
+ // uintptr_t addrOffset = 0;
1822
+ // handleRefCountsAssignWithCopy(metadata, reader, addrOffset, (uint8_t
1823
+ // *)dest, (uint8_t *)src);
1791
1824
1792
- return dest;
1825
+ // assert(addrOffset == metadata->vw_size());
1826
+ swift_generic_destroy (dest, metadata);
1827
+ return swift_generic_initWithCopy (dest, src, metadata);
1828
+
1829
+ // return dest;
1793
1830
}
1794
1831
1795
1832
extern " C" swift::OpaqueValue *
@@ -1864,12 +1901,13 @@ extern "C" unsigned swift_enumSimple_getEnumTag(swift::OpaqueValue *address,
1864
1901
uint64_t zeroTagValue, uint8_t xiTagBytesPattern,
1865
1902
unsigned xiTagBytesOffset, size_t payloadSize,
1866
1903
uint8_t numExtraTagBytes) -> unsigned {
1867
- auto xiTagBytes = 1 << (xiTagBytesPattern - 1 );
1868
- uint64_t tagBytes =
1869
- readTagBytes (addr + xiTagBytesOffset, xiTagBytes) -
1870
- zeroTagValue;
1871
- if (tagBytes < payloadNumExtraInhabitants) {
1872
- return tagBytes + 1 ;
1904
+ if (xiTagBytesPattern) {
1905
+ auto xiTagBytes = 1 << (xiTagBytesPattern - 1 );
1906
+ uint64_t tagBytes =
1907
+ readTagBytes (addr + xiTagBytesOffset, xiTagBytes) - zeroTagValue;
1908
+ if (tagBytes < payloadNumExtraInhabitants) {
1909
+ return tagBytes + 1 ;
1910
+ }
1873
1911
}
1874
1912
1875
1913
return 0 ;
@@ -1917,16 +1955,18 @@ extern "C" void swift_enumSimple_destructiveInjectEnumTag(
1917
1955
uint64_t zeroTagValue, uint8_t xiTagBytesPattern,
1918
1956
unsigned xiTagBytesOffset, size_t payloadSize,
1919
1957
uint8_t numExtraTagBytes) -> bool {
1920
- auto xiTagBytes = 1 << (xiTagBytesPattern - 1 );
1921
- if (tag <= payloadNumExtraInhabitants) {
1922
- if (numExtraTagBytes != 0 )
1923
- storeEnumElement (addr + payloadSize, 0 , numExtraTagBytes);
1958
+ if (xiTagBytesPattern) {
1959
+ auto xiTagBytes = 1 << (xiTagBytesPattern - 1 );
1960
+ if (tag <= payloadNumExtraInhabitants) {
1961
+ if (numExtraTagBytes != 0 )
1962
+ storeEnumElement (addr + payloadSize, 0 , numExtraTagBytes);
1924
1963
1925
- if (tag == 0 )
1926
- return true ;
1964
+ if (tag == 0 )
1965
+ return true ;
1927
1966
1928
- storeEnumElement (addr + xiTagBytesOffset, tag - 1 + zeroTagValue,
1929
- xiTagBytes);
1967
+ storeEnumElement (addr + xiTagBytesOffset, tag - 1 + zeroTagValue,
1968
+ xiTagBytes);
1969
+ }
1930
1970
}
1931
1971
return true ;
1932
1972
};
0 commit comments