@@ -96,7 +96,11 @@ typedef struct {
9696 void * (*initializeWithCopyFn)(void *, void *, void *);
9797#endif
9898 void *assignWithCopyFn;
99- void *initializeWithTakeFn;
99+ #if __has_feature(ptrauth_calls)
100+ void * (* __ptrauth (0 , 1 , 0x48d8 ) initializeWithTakeFn)(void *, void *, void *);
101+ #else
102+ void * (*initializeWithTakeFn)(void *, void *, void *);
103+ #endif
100104 void *assignWithTakeFn;
101105 void *getEnumTagSinglePayloadFn;
102106 void *storeEnumTagSinglePayload;
@@ -113,43 +117,105 @@ typedef struct {
113117#endif
114118} EmbeddedMetaDataPrefix;
115119
120+ typedef enum {
121+ AlignmentMask = 0x000000FF ,
122+ IsNonInline = 0x00020000 ,
123+ } ValueWitnessTableFlags;
124+
125+ static inline
126+ EmbeddedMetaDataPrefix *_swift_embedded_get_full_metadata (void *metadata) {
127+ EmbeddedMetaDataPrefix *fullmeta = (EmbeddedMetaDataPrefix*)&((void **)metadata)[-1 ];
128+ return fullmeta;
129+ }
130+
116131static inline __swift_size_t
117132_swift_embedded_metadata_get_size (void *metadata) {
118- EmbeddedMetaDataPrefix *fullmeta = (EmbeddedMetaDataPrefix*)&(( void **) metadata)[- 1 ] ;
133+ EmbeddedMetaDataPrefix *fullmeta = _swift_embedded_get_full_metadata ( metadata);
119134 return fullmeta->vwt ->size ;
120135}
121136
122137static inline __swift_size_t
123138_swift_embedded_metadata_get_align_mask_impl (EmbeddedMetaDataPrefix *fullMetadata) {
124139 unsigned flags = fullMetadata->vwt ->flags ;
125- unsigned embeddedValueWitnessTableFlagsMask = 0xFF ;
126-
127- return flags & embeddedValueWitnessTableFlagsMask;
140+ ValueWitnessTableFlags alignMask = AlignmentMask;
141+ return flags & alignMask;
128142}
129143
130144static inline __swift_size_t
131145_swift_embedded_metadata_get_align_mask (void *metadata) {
132- EmbeddedMetaDataPrefix *fullmeta = (EmbeddedMetaDataPrefix*)&(( void **) metadata)[- 1 ] ;
146+ EmbeddedMetaDataPrefix *fullmeta = _swift_embedded_get_full_metadata ( metadata);
133147 return _swift_embedded_metadata_get_align_mask_impl (fullmeta);
134148}
135149
136- static inline void
137- _swift_embedded_invoke_box_destroy (void *object) {
138- void *metadata = ((EmbeddedHeapObject *)object)->metadata ;
139- EmbeddedMetaDataPrefix *fullmeta = (EmbeddedMetaDataPrefix*)&((void **)metadata)[-1 ];
150+ static inline void *
151+ _swift_embedded_box_project (void *object, EmbeddedMetaDataPrefix *fullmeta) {
140152 __swift_size_t alignMask = _swift_embedded_metadata_get_align_mask_impl (fullmeta);
141153 __swift_size_t headerSize = sizeof (void *) + sizeof (__swift_size_t );
142154 __swift_size_t startOfBoxedValue = (headerSize + alignMask) & ~alignMask;
143155 void *addrInBox = (void *)(((unsigned char *)object) + startOfBoxedValue);
156+ return addrInBox;
157+ }
158+ static inline void
159+ _swift_embedded_invoke_box_destroy (void *object) {
160+ void *metadata = ((EmbeddedHeapObject *)object)->metadata ;
161+ EmbeddedMetaDataPrefix *fullmeta = _swift_embedded_get_full_metadata (metadata);
162+ void *addrInBox = _swift_embedded_box_project (object, fullmeta);
144163 fullmeta->vwt ->destroyFn (addrInBox, metadata);
145164}
146165
147166static inline void
148167_swift_embedded_initialize_box (void *metadata, void *newObjectAddr, void *oldObjectAddr) {
149- EmbeddedMetaDataPrefix *fullmeta = (EmbeddedMetaDataPrefix*)&(( void **) metadata)[- 1 ] ;
168+ EmbeddedMetaDataPrefix *fullmeta = _swift_embedded_get_full_metadata ( metadata);
150169 fullmeta->vwt ->initializeWithCopyFn (newObjectAddr, oldObjectAddr, metadata);
151170}
152171
172+ typedef struct {
173+ void *inlineBuffer[3 ];
174+ void *metadata;
175+ } ExistentialValue;
176+
177+ static inline void
178+ _swift_embedded_existential_destroy (void *exist) {
179+ ExistentialValue* existVal = (ExistentialValue*)exist;
180+ void *metadata = existVal->metadata ;
181+ EmbeddedMetaDataPrefix *fullmeta = _swift_embedded_get_full_metadata (metadata);
182+ ValueWitnessTableFlags isNonInlineMask = IsNonInline;
183+ if (fullmeta->vwt ->flags & IsNonInline) {
184+ void *addrInBox = _swift_embedded_box_project (existVal->inlineBuffer [0 ], fullmeta);
185+ fullmeta->vwt ->destroyFn (addrInBox, metadata);
186+ } else {
187+ fullmeta->vwt ->destroyFn (&(existVal->inlineBuffer [0 ]), metadata);
188+ }
189+ }
190+
191+ static inline void
192+ _swift_embedded_existential_init_with_take (void *dst, void *srcExist) {
193+ ExistentialValue* existVal = (ExistentialValue*)srcExist;
194+ void *metadata = existVal->metadata ;
195+ EmbeddedMetaDataPrefix *fullmeta = _swift_embedded_get_full_metadata (metadata);
196+ ValueWitnessTableFlags isNonInlineMask = IsNonInline;
197+ if (fullmeta->vwt ->flags & IsNonInline) {
198+ void *addrInBox = _swift_embedded_box_project (existVal->inlineBuffer [0 ], fullmeta);
199+ fullmeta->vwt ->initializeWithTakeFn (dst, addrInBox, metadata);
200+ } else {
201+ fullmeta->vwt ->initializeWithTakeFn (dst, &(existVal->inlineBuffer [0 ]), metadata);
202+ }
203+ }
204+
205+ static inline void
206+ _swift_embedded_existential_init_with_copy (void *dst, void *srcExist) {
207+ ExistentialValue* existVal = (ExistentialValue*)srcExist;
208+ void *metadata = existVal->metadata ;
209+ EmbeddedMetaDataPrefix *fullmeta = _swift_embedded_get_full_metadata (metadata);
210+ ValueWitnessTableFlags isNonInlineMask = IsNonInline;
211+ if (fullmeta->vwt ->flags & IsNonInline) {
212+ void *addrInBox = _swift_embedded_box_project (existVal->inlineBuffer [0 ], fullmeta);
213+ fullmeta->vwt ->initializeWithCopyFn (dst, addrInBox, metadata);
214+ } else {
215+ fullmeta->vwt ->initializeWithCopyFn (dst, &(existVal->inlineBuffer [0 ]), metadata);
216+ }
217+ }
218+
153219#ifdef __cplusplus
154220} // extern "C"
155221#endif
0 commit comments