@@ -662,7 +662,8 @@ 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
+ objc_object *object = (objc_object *)((*(uintptr_t *)(addr + addrOffset)) &
666
+ ~_swift_abi_SwiftSpareBitsMask);
666
667
addrOffset += sizeof (objc_object*);
667
668
objc_release (object);
668
669
}
@@ -697,7 +698,9 @@ static void resilientDestroyBranchless(const Metadata *metadata,
697
698
uintptr_t &addrOffset,
698
699
uint8_t *addr) {
699
700
auto *type = getResilientTypeMetadata (metadata, reader);
700
- type->vw_destroy ((OpaqueValue *)(addr + addrOffset));
701
+ auto *object = (OpaqueValue *)(addr + addrOffset);
702
+ addrOffset += type->vw_size ();
703
+ type->vw_destroy (object);
701
704
}
702
705
703
706
typedef void (*DestrFnBranchless)(const Metadata *metadata,
@@ -891,10 +894,11 @@ static void objcStrongRetainBranchless(const Metadata *metadata,
891
894
uint8_t *dest,
892
895
uint8_t *src) {
893
896
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);
897
+ uintptr_t object = *(uintptr_t *)(src + _addrOffset);
898
+ memcpy (dest + _addrOffset, &object, sizeof (objc_object *));
899
+ object &= ~_swift_abi_SwiftSpareBitsMask;
900
+ addrOffset = _addrOffset + sizeof (objc_object *);
901
+ objc_retain ((objc_object *)object);
898
902
}
899
903
#endif
900
904
@@ -1004,6 +1008,8 @@ swift_generic_initWithCopy(swift::OpaqueValue *dest, swift::OpaqueValue *src,
1004
1008
uintptr_t addrOffset = 0 ;
1005
1009
handleRefCountsInitWithCopy (metadata, reader, addrOffset, (uint8_t *)dest, (uint8_t *)src);
1006
1010
1011
+ assert (addrOffset == metadata->vw_size ());
1012
+
1007
1013
return dest;
1008
1014
}
1009
1015
@@ -1062,8 +1068,10 @@ static void existentialInitWithTake(const Metadata *metadata,
1062
1068
auto *destObject = (OpaqueValue *)(dest + _addrOffset);
1063
1069
auto *srcObject = (OpaqueValue *)(src + _addrOffset);
1064
1070
addrOffset = _addrOffset + (sizeof (uintptr_t ) * NumWords_ValueBuffer);
1065
- if (SWIFT_UNLIKELY (! type->getValueWitnesses ()->isBitwiseTakable () )) {
1071
+ if (type->getValueWitnesses ()->isValueInline ( )) {
1066
1072
type->vw_initializeWithTake (destObject, srcObject);
1073
+ } else {
1074
+ memcpy (destObject, srcObject, sizeof (uintptr_t ));
1067
1075
}
1068
1076
}
1069
1077
@@ -1150,6 +1158,8 @@ swift_generic_initWithTake(swift::OpaqueValue *dest, swift::OpaqueValue *src,
1150
1158
1151
1159
handleRefCountsInitWithTake (metadata, reader, addrOffset, (uint8_t *)dest, (uint8_t *)src);
1152
1160
1161
+ assert (addrOffset == metadata->vw_size ());
1162
+
1153
1163
return dest;
1154
1164
}
1155
1165
@@ -1282,12 +1292,14 @@ static void objcStrongAssignWithCopy(const Metadata *metadata,
1282
1292
uint8_t *dest,
1283
1293
uint8_t *src) {
1284
1294
uintptr_t _addrOffset = addrOffset;
1285
- objc_object * destObject = (objc_object*)(*( uintptr_t *)(dest + _addrOffset) );
1286
- objc_object * srcObject = (objc_object*)(*( uintptr_t *)(src + _addrOffset) );
1295
+ uintptr_t destObject = *( uintptr_t *)(dest + _addrOffset);
1296
+ uintptr_t srcObject = *( uintptr_t *)(src + _addrOffset);
1287
1297
memcpy (dest + _addrOffset, &srcObject, sizeof (objc_object*));
1298
+ destObject &= ~_swift_abi_SwiftSpareBitsMask;
1299
+ srcObject &= ~_swift_abi_SwiftSpareBitsMask;
1288
1300
addrOffset = _addrOffset + sizeof (objc_object*);
1289
- objc_release (destObject);
1290
- objc_retain (srcObject);
1301
+ objc_release ((objc_object *) destObject);
1302
+ objc_retain ((objc_object *) srcObject);
1291
1303
}
1292
1304
#endif
1293
1305
@@ -1599,7 +1611,7 @@ static void multiPayloadEnumFNAssignWithCopy(const Metadata *metadata,
1599
1611
if (trailingBytes)
1600
1612
memcpy (dest + nestedAddrOffset, src + nestedAddrOffset, trailingBytes);
1601
1613
return ;
1602
- } else if (destTag > numPayloads) {
1614
+ } else if (srcTag < numPayloads) {
1603
1615
addrOffset += enumSize;
1604
1616
size_t refCountOffset = nestedReader.peekBytes <size_t >(srcTag * sizeof (size_t ));
1605
1617
nestedReader.skip ((numPayloads * sizeof (size_t )) + refCountOffset);
@@ -1608,7 +1620,10 @@ static void multiPayloadEnumFNAssignWithCopy(const Metadata *metadata,
1608
1620
if (trailingBytes)
1609
1621
memcpy (dest + nestedAddrOffset, src + nestedAddrOffset, trailingBytes);
1610
1622
return ;
1611
- } else if (srcTag > numPayloads) {
1623
+ } else if (destTag < numPayloads) {
1624
+ size_t refCountOffset =
1625
+ nestedReader.peekBytes <size_t >(destTag * sizeof (size_t ));
1626
+ nestedReader.skip ((numPayloads * sizeof (size_t )) + refCountOffset);
1612
1627
handleRefCountsDestroy (metadata, nestedReader, nestedAddrOffset, dest);
1613
1628
}
1614
1629
@@ -1654,7 +1669,7 @@ static void multiPayloadEnumFNResolvedAssignWithCopy(const Metadata *metadata,
1654
1669
if (trailingBytes)
1655
1670
memcpy (dest + nestedAddrOffset, src + nestedAddrOffset, trailingBytes);
1656
1671
return ;
1657
- } else if (destTag > numPayloads) {
1672
+ } else if (srcTag < numPayloads) {
1658
1673
addrOffset += enumSize;
1659
1674
size_t refCountOffset = nestedReader.peekBytes <size_t >(srcTag * sizeof (size_t ));
1660
1675
nestedReader.skip ((numPayloads * sizeof (size_t )) + refCountOffset);
@@ -1663,7 +1678,10 @@ static void multiPayloadEnumFNResolvedAssignWithCopy(const Metadata *metadata,
1663
1678
if (trailingBytes)
1664
1679
memcpy (dest + nestedAddrOffset, src + nestedAddrOffset, trailingBytes);
1665
1680
return ;
1666
- } else if (srcTag > numPayloads) {
1681
+ } else if (destTag < numPayloads) {
1682
+ size_t refCountOffset =
1683
+ nestedReader.peekBytes <size_t >(destTag * sizeof (size_t ));
1684
+ nestedReader.skip ((numPayloads * sizeof (size_t )) + refCountOffset);
1667
1685
handleRefCountsDestroy (metadata, nestedReader, nestedAddrOffset, dest);
1668
1686
}
1669
1687
@@ -1711,7 +1729,7 @@ static void multiPayloadEnumGenericAssignWithCopy(const Metadata *metadata,
1711
1729
if (trailingBytes)
1712
1730
memcpy (dest + nestedAddrOffset, src + nestedAddrOffset, trailingBytes);
1713
1731
return ;
1714
- } else if (destTag > numPayloads) {
1732
+ } else if (srcTag < numPayloads) {
1715
1733
addrOffset += enumSize;
1716
1734
size_t refCountOffset = nestedReader.peekBytes <size_t >(srcTag * sizeof (size_t ));
1717
1735
nestedReader.skip ((numPayloads * sizeof (size_t )) + refCountOffset);
@@ -1720,7 +1738,10 @@ static void multiPayloadEnumGenericAssignWithCopy(const Metadata *metadata,
1720
1738
if (trailingBytes)
1721
1739
memcpy (dest + nestedAddrOffset, src + nestedAddrOffset, trailingBytes);
1722
1740
return ;
1723
- } else if (srcTag > numPayloads) {
1741
+ } else if (destTag < numPayloads) {
1742
+ size_t refCountOffset =
1743
+ nestedReader.peekBytes <size_t >(destTag * sizeof (size_t ));
1744
+ nestedReader.skip ((numPayloads * sizeof (size_t )) + refCountOffset);
1724
1745
handleRefCountsDestroy (metadata, nestedReader, nestedAddrOffset, dest);
1725
1746
}
1726
1747
@@ -1784,12 +1805,17 @@ static void handleRefCountsAssignWithCopy(const Metadata *metadata,
1784
1805
extern " C" swift::OpaqueValue *
1785
1806
swift_generic_assignWithCopy (swift::OpaqueValue *dest, swift::OpaqueValue *src,
1786
1807
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);
1808
+ // const uint8_t *layoutStr = metadata->getLayoutString();
1809
+ // LayoutStringReader1 reader{layoutStr + layoutStringHeaderSize};
1810
+ // uintptr_t addrOffset = 0;
1811
+ // handleRefCountsAssignWithCopy(metadata, reader, addrOffset, (uint8_t
1812
+ // *)dest, (uint8_t *)src);
1791
1813
1792
- return dest;
1814
+ // assert(addrOffset == metadata->vw_size());
1815
+ swift_generic_destroy (dest, metadata);
1816
+ return swift_generic_initWithCopy (dest, src, metadata);
1817
+
1818
+ // return dest;
1793
1819
}
1794
1820
1795
1821
extern " C" swift::OpaqueValue *
@@ -1864,12 +1890,13 @@ extern "C" unsigned swift_enumSimple_getEnumTag(swift::OpaqueValue *address,
1864
1890
uint64_t zeroTagValue, uint8_t xiTagBytesPattern,
1865
1891
unsigned xiTagBytesOffset, size_t payloadSize,
1866
1892
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 ;
1893
+ if (xiTagBytesPattern) {
1894
+ auto xiTagBytes = 1 << (xiTagBytesPattern - 1 );
1895
+ uint64_t tagBytes =
1896
+ readTagBytes (addr + xiTagBytesOffset, xiTagBytes) - zeroTagValue;
1897
+ if (tagBytes < payloadNumExtraInhabitants) {
1898
+ return tagBytes + 1 ;
1899
+ }
1873
1900
}
1874
1901
1875
1902
return 0 ;
@@ -1917,16 +1944,18 @@ extern "C" void swift_enumSimple_destructiveInjectEnumTag(
1917
1944
uint64_t zeroTagValue, uint8_t xiTagBytesPattern,
1918
1945
unsigned xiTagBytesOffset, size_t payloadSize,
1919
1946
uint8_t numExtraTagBytes) -> bool {
1920
- auto xiTagBytes = 1 << (xiTagBytesPattern - 1 );
1921
- if (tag <= payloadNumExtraInhabitants) {
1922
- if (numExtraTagBytes != 0 )
1923
- storeEnumElement (addr + payloadSize, 0 , numExtraTagBytes);
1947
+ if (xiTagBytesPattern) {
1948
+ auto xiTagBytes = 1 << (xiTagBytesPattern - 1 );
1949
+ if (tag <= payloadNumExtraInhabitants) {
1950
+ if (numExtraTagBytes != 0 )
1951
+ storeEnumElement (addr + payloadSize, 0 , numExtraTagBytes);
1924
1952
1925
- if (tag == 0 )
1926
- return true ;
1953
+ if (tag == 0 )
1954
+ return true ;
1927
1955
1928
- storeEnumElement (addr + xiTagBytesOffset, tag - 1 + zeroTagValue,
1929
- xiTagBytes);
1956
+ storeEnumElement (addr + xiTagBytesOffset, tag - 1 + zeroTagValue,
1957
+ xiTagBytes);
1958
+ }
1930
1959
}
1931
1960
return true ;
1932
1961
};
0 commit comments