@@ -301,7 +301,7 @@ static void completeTaskWithClosure(SWIFT_ASYNC_CONTEXT AsyncContext *context,
301301 auto asyncContextPrefix = reinterpret_cast <AsyncContextPrefix *>(
302302 reinterpret_cast <char *>(context) - sizeof (AsyncContextPrefix));
303303
304- swift_release (asyncContextPrefix->closureContext );
304+ swift_release ((HeapObject *) asyncContextPrefix->closureContext );
305305
306306 // Clean up the rest of the task.
307307 return completeTask (context, error);
@@ -336,7 +336,7 @@ static AsyncTaskAndContext swift_task_create_group_future_commonImpl(
336336 JobFlags flags, TaskGroup *group,
337337 const Metadata *futureResultType,
338338 FutureAsyncSignature::FunctionType *function,
339- HeapObject * /* +1 */ closureContext ,
339+ void *closureContext, bool owningClosureContext ,
340340 size_t initialContextSize) {
341341 assert ((futureResultType != nullptr ) == flags.task_isFuture ());
342342 assert (!flags.task_isFuture () ||
@@ -472,7 +472,8 @@ static AsyncTaskAndContext swift_task_create_group_future_commonImpl(
472472 // be is the final hop. Store a signed null instead.
473473 initialContext->Parent = nullptr ;
474474 initialContext->ResumeParent = reinterpret_cast <TaskContinuationFunction *>(
475- closureContext ? &completeTaskWithClosure : &completeTask);
475+ (closureContext && owningClosureContext) ? &completeTaskWithClosure :
476+ &completeTask);
476477 initialContext->Flags = AsyncContextKind::Ordinary;
477478 initialContext->Flags .setShouldNotDeallocateInCallee (true );
478479
@@ -493,7 +494,8 @@ static AsyncTaskAndContext swift_task_create_group_future_commonImpl(
493494static AsyncTaskAndContext swift_task_create_group_future_common (
494495 JobFlags flags, TaskGroup *group, const Metadata *futureResultType,
495496 FutureAsyncSignature::FunctionType *function,
496- HeapObject * /* +1 */ closureContext, size_t initialContextSize);
497+ void *closureContext, bool owningClosureContext,
498+ size_t initialContextSize);
497499
498500AsyncTaskAndContext
499501swift::swift_task_create_f (JobFlags flags,
@@ -522,6 +524,7 @@ AsyncTaskAndContext swift::swift_task_create_group_future_f(
522524 return swift_task_create_group_future_common (flags, group,
523525 futureResultType,
524526 function, nullptr ,
527+ /* owningClosureContext*/ false ,
525528 initialContextSize);
526529}
527530
@@ -557,6 +560,26 @@ AsyncTaskAndContext swift::swift_task_create_future(JobFlags flags,
557560 return swift_task_create_group_future_common (
558561 flags, nullptr , futureResultType,
559562 taskEntry, closureContext,
563+ /* owningClosureContext*/ true ,
564+ initialContextSize);
565+ }
566+
567+ AsyncTaskAndContext swift::swift_task_create_future_no_escaping (JobFlags flags,
568+ const Metadata *futureResultType,
569+ void *closureEntry,
570+ void *closureContext) {
571+ FutureAsyncSignature::FunctionType *taskEntry;
572+ size_t initialContextSize;
573+ std::tie (taskEntry, initialContextSize)
574+ = getAsyncClosureEntryPointAndContextSize<
575+ FutureAsyncSignature,
576+ SpecialPointerAuthDiscriminators::AsyncFutureFunction
577+ >(closureEntry, (HeapObject *)closureContext);
578+
579+ return swift_task_create_group_future_common (
580+ flags, nullptr , futureResultType,
581+ taskEntry, closureContext,
582+ /* owningClosureContext*/ false ,
560583 initialContextSize);
561584}
562585
@@ -576,6 +599,7 @@ swift::swift_task_create_group_future(
576599 return swift_task_create_group_future_common (
577600 flags, group, futureResultType,
578601 taskEntry, closureContext,
602+ /* owningClosureContext*/ true ,
579603 initialContextSize);
580604}
581605
0 commit comments