@@ -955,6 +955,8 @@ TaskGroup* TaskGroupTaskStatusRecord::getGroup() {
955955// =============================================================================
956956// ==== initialize -------------------------------------------------------------
957957
958+ static void _swift_taskGroup_initialize (ResultTypeInfo resultType, size_t rawGroupFlags, TaskGroup *group);
959+
958960// Initializes into the preallocated _group an actual TaskGroupBase.
959961SWIFT_CC (swift)
960962static void swift_taskGroup_initializeImpl(TaskGroup *group, const Metadata *T) {
@@ -965,21 +967,27 @@ static void swift_taskGroup_initializeImpl(TaskGroup *group, const Metadata *T)
965967SWIFT_CC (swift)
966968static void swift_taskGroup_initializeWithFlagsImpl(size_t rawGroupFlags,
967969 TaskGroup *group, const Metadata *T) {
968- TaskGroupFlags groupFlags (rawGroupFlags);
969- SWIFT_TASK_GROUP_DEBUG_LOG_0 (group, " create group, from task:%p; flags: isDiscardingResults=%d" ,
970- swift_task_getCurrent (),
971- groupFlags.isDiscardResults ());
972-
973970 ResultTypeInfo resultType;
974971#if !SWIFT_CONCURRENCY_EMBEDDED
975972 resultType.metadata = T;
976- assert (!groupFlags.isMetadataAsOptionRecord ());
977973#else
978- assert (groupFlags.isMetadataAsOptionRecord ());
979- TaskOptionRecord *options = (TaskOptionRecord *)T;
974+ swift_unreachable (" swift_taskGroup_initializeWithFlags in embedded" );
975+ #endif
976+ _swift_taskGroup_initialize (resultType, rawGroupFlags, group);
977+ }
978+
979+ // Initializes into the preallocated _group an actual instance.
980+ SWIFT_CC (swift)
981+ static void swift_taskGroup_initializeWithOptionsImpl(size_t rawGroupFlags, TaskGroup *group, const Metadata *T, TaskOptionRecord *options) {
982+ ResultTypeInfo resultType;
983+ #if !SWIFT_CONCURRENCY_EMBEDDED
984+ resultType.metadata = T;
985+ #endif
986+
980987 for (auto option = options; option; option = option->getParent ()) {
981988 switch (option->getKind ()) {
982989 case TaskOptionRecordKind::ResultTypeInfo: {
990+ #if SWIFT_CONCURRENCY_EMBEDDED
983991 auto *typeInfo = cast<ResultTypeInfoTaskOptionRecord>(option);
984992 resultType = {
985993 .size = typeInfo->size ,
@@ -988,13 +996,26 @@ static void swift_taskGroup_initializeWithFlagsImpl(size_t rawGroupFlags,
988996 .storeEnumTagSinglePayload = typeInfo->storeEnumTagSinglePayload ,
989997 .destroy = typeInfo->destroy ,
990998 };
999+ #else
1000+ swift_unreachable (" ResultTypeInfo in non embedded" );
1001+ #endif
9911002 break ;
9921003 }
9931004 default :
994- swift_unreachable ( " only ResultTypeInfo expected " );
1005+ break ; // ignore unknown records
9951006 }
9961007 }
997- #endif
1008+
1009+ assert (!resultType.isNull ());
1010+
1011+ _swift_taskGroup_initialize (resultType, rawGroupFlags, group);
1012+ }
1013+
1014+ static void _swift_taskGroup_initialize (ResultTypeInfo resultType, size_t rawGroupFlags, TaskGroup *group) {
1015+ TaskGroupFlags groupFlags (rawGroupFlags);
1016+ SWIFT_TASK_GROUP_DEBUG_LOG_0 (group, " create group, from task:%p; flags: isDiscardingResults=%d" ,
1017+ swift_task_getCurrent (),
1018+ groupFlags.isDiscardResults ());
9981019
9991020 TaskGroupBase *impl;
10001021 if (groupFlags.isDiscardResults ()) {
0 commit comments