@@ -215,7 +215,6 @@ InitialTaskExecutorOwnedPreferenceTaskOptionRecord::getExecutorRefFromUnownedTas
215215 return executorRef;
216216}
217217
218-
219218void NullaryContinuationJob::process (Job *_job) {
220219 auto *job = cast<NullaryContinuationJob>(_job);
221220
@@ -393,7 +392,9 @@ static void jobInvoke(void *obj, void *unused, uint32_t flags) {
393392// Magic constant to identify Swift Job vtables to Dispatch.
394393static const unsigned long dispatchSwiftObjectType = 1 ;
395394
396- FullMetadata<DispatchClassMetadata> swift::jobHeapMetadata = {
395+ #if !SWIFT_CONCURRENCY_EMBEDDED
396+
397+ static FullMetadata<DispatchClassMetadata> jobHeapMetadata = {
397398 {
398399 {
399400 /* type layout*/ nullptr ,
@@ -432,11 +433,47 @@ static FullMetadata<DispatchClassMetadata> taskHeapMetadata = {
432433 }
433434};
434435
436+
435437const void *const swift::_swift_concurrency_debug_jobMetadata =
436438 static_cast <Metadata *>(&jobHeapMetadata);
437439const void *const swift::_swift_concurrency_debug_asyncTaskMetadata =
438440 static_cast <Metadata *>(&taskHeapMetadata);
439441
442+ const HeapMetadata *swift::jobHeapMetadataPtr =
443+ static_cast <HeapMetadata *>(&jobHeapMetadata);
444+ const HeapMetadata *swift::taskHeapMetadataPtr =
445+ static_cast <HeapMetadata *>(&taskHeapMetadata);
446+
447+ #else // SWIFT_CONCURRENCY_EMBEDDED
448+
449+ // This matches the embedded class metadata layout in IRGen and in
450+ // EmbeddedRuntime.swift.
451+ typedef struct EmbeddedClassMetadata {
452+ void *superclass;
453+ HeapObjectDestroyer *__ptrauth_swift_heap_object_destructor destroy;
454+ void *ivar_destroyer;
455+ } EmbeddedHeapObject;
456+
457+ static EmbeddedClassMetadata jobHeapMetadata = {
458+ 0 , &destroyJob, 0 ,
459+ };
460+
461+ static EmbeddedClassMetadata taskHeapMetadata = {
462+ 0 , &destroyTask, 0 ,
463+ };
464+
465+ const void *const swift::_swift_concurrency_debug_jobMetadata =
466+ (Metadata *)(&jobHeapMetadata);
467+ const void *const swift::_swift_concurrency_debug_asyncTaskMetadata =
468+ (Metadata *)(&taskHeapMetadata);
469+
470+ const HeapMetadata *swift::jobHeapMetadataPtr =
471+ (HeapMetadata *)(&jobHeapMetadata);
472+ const HeapMetadata *swift::taskHeapMetadataPtr =
473+ (HeapMetadata *)(&taskHeapMetadata);
474+
475+ #endif
476+
440477static void completeTaskImpl (AsyncTask *task,
441478 AsyncContext *context,
442479 SwiftError *error) {
@@ -959,14 +996,12 @@ swift_task_create_commonImpl(size_t rawTaskCreateFlags,
959996 if (asyncLet) {
960997 // Initialize the refcount bits to "immortal", so that
961998 // ARC operations don't have any effect on the task.
962- task = new (allocation) AsyncTask (&taskHeapMetadata,
963- InlineRefCounts::Immortal, jobFlags,
964- function, initialContext,
965- captureCurrentVoucher);
999+ task = new (allocation)
1000+ AsyncTask (taskHeapMetadataPtr, InlineRefCounts::Immortal, jobFlags,
1001+ function, initialContext, captureCurrentVoucher);
9661002 } else {
967- task = new (allocation) AsyncTask (&taskHeapMetadata, jobFlags,
968- function, initialContext,
969- captureCurrentVoucher);
1003+ task = new (allocation) AsyncTask (taskHeapMetadataPtr, jobFlags, function,
1004+ initialContext, captureCurrentVoucher);
9701005 }
9711006
9721007 // Initialize the child fragment if applicable.
0 commit comments