@@ -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+ FullMetadata<DispatchClassMetadata> jobHeapMetadata = {
397398 {
398399 {
399400 /* type layout*/ nullptr ,
@@ -432,10 +433,35 @@ static FullMetadata<DispatchClassMetadata> taskHeapMetadata = {
432433 }
433434};
434435
436+ #else // SWIFT_CONCURRENCY_EMBEDDED
437+
438+ // This matches the embedded class metadata layout in IRGen and in
439+ // EmbeddedRuntime.swift.
440+ typedef struct EmbeddedClassMetadata {
441+ void *superclass;
442+ HeapObjectDestroyer *__ptrauth_swift_heap_object_destructor destroy;
443+ void *ivar_destroyer;
444+ } EmbeddedHeapObject;
445+
446+ static EmbeddedClassMetadata jobHeapMetadata = {
447+ 0 , &destroyJob, 0 ,
448+ };
449+
450+ static EmbeddedClassMetadata taskHeapMetadata = {
451+ 0 , &destroyTask, 0 ,
452+ };
453+
454+ #endif
455+
435456const void *const swift::_swift_concurrency_debug_jobMetadata =
436- static_cast < Metadata *> (&jobHeapMetadata);
457+ ( Metadata *) (&jobHeapMetadata);
437458const void *const swift::_swift_concurrency_debug_asyncTaskMetadata =
438- static_cast <Metadata *>(&taskHeapMetadata);
459+ (Metadata *)(&taskHeapMetadata);
460+
461+ const HeapMetadata *swift::jobHeapMetadataPtr =
462+ (HeapMetadata *)(&jobHeapMetadata);
463+ const HeapMetadata *swift::taskHeapMetadataPtr =
464+ (HeapMetadata *)(&taskHeapMetadata);
439465
440466static void completeTaskImpl (AsyncTask *task,
441467 AsyncContext *context,
@@ -959,14 +985,14 @@ swift_task_create_commonImpl(size_t rawTaskCreateFlags,
959985 if (asyncLet) {
960986 // Initialize the refcount bits to "immortal", so that
961987 // 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);
988+ task = new (allocation)
989+ AsyncTask ( reinterpret_cast <ClassMetadata *>(&taskHeapMetadata) ,
990+ InlineRefCounts::Immortal, jobFlags, function, initialContext,
991+ captureCurrentVoucher);
966992 } else {
967- task = new (allocation) AsyncTask (&taskHeapMetadata, jobFlags,
968- function, initialContext ,
969- captureCurrentVoucher);
993+ task = new (allocation)
994+ AsyncTask ( reinterpret_cast <ClassMetadata *>(&taskHeapMetadata), jobFlags ,
995+ function, initialContext, captureCurrentVoucher);
970996 }
971997
972998 // Initialize the child fragment if applicable.
0 commit comments