2626#include " swift/ABI/Metadata.h"
2727#include " swift/ABI/Task.h"
2828#include " swift/ABI/TaskGroup.h"
29+ #include " swift/ABI/TaskOptions.h"
2930#include " swift/Basic/RelativePointer.h"
3031#include " swift/Basic/STLExtras.h"
3132#include " swift/Runtime/Concurrency.h"
@@ -954,6 +955,8 @@ TaskGroup* TaskGroupTaskStatusRecord::getGroup() {
954955// =============================================================================
955956// ==== initialize -------------------------------------------------------------
956957
958+ static void _swift_taskGroup_initialize (ResultTypeInfo resultType, size_t rawGroupFlags, TaskGroup *group);
959+
957960// Initializes into the preallocated _group an actual TaskGroupBase.
958961SWIFT_CC (swift)
959962static void swift_taskGroup_initializeImpl(TaskGroup *group, const Metadata *T) {
@@ -964,11 +967,51 @@ static void swift_taskGroup_initializeImpl(TaskGroup *group, const Metadata *T)
964967SWIFT_CC (swift)
965968static void swift_taskGroup_initializeWithFlagsImpl(size_t rawGroupFlags,
966969 TaskGroup *group, const Metadata *T) {
967-
970+ ResultTypeInfo resultType;
968971#if !SWIFT_CONCURRENCY_EMBEDDED
972+ resultType.metadata = T;
973+ #else
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) {
969982 ResultTypeInfo resultType;
983+ #if !SWIFT_CONCURRENCY_EMBEDDED
970984 resultType.metadata = T;
985+ #endif
971986
987+ for (auto option = options; option; option = option->getParent ()) {
988+ switch (option->getKind ()) {
989+ case TaskOptionRecordKind::ResultTypeInfo: {
990+ #if SWIFT_CONCURRENCY_EMBEDDED
991+ auto *typeInfo = cast<ResultTypeInfoTaskOptionRecord>(option);
992+ resultType = {
993+ .size = typeInfo->size ,
994+ .alignMask = typeInfo->alignMask ,
995+ .initializeWithCopy = typeInfo->initializeWithCopy ,
996+ .storeEnumTagSinglePayload = typeInfo->storeEnumTagSinglePayload ,
997+ .destroy = typeInfo->destroy ,
998+ };
999+ #else
1000+ swift_unreachable (" ResultTypeInfo in non embedded" );
1001+ #endif
1002+ break ;
1003+ }
1004+ default :
1005+ break ; // ignore unknown records
1006+ }
1007+ }
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) {
9721015 TaskGroupFlags groupFlags (rawGroupFlags);
9731016 SWIFT_TASK_GROUP_DEBUG_LOG_0 (group, " create group, from task:%p; flags: isDiscardingResults=%d" ,
9741017 swift_task_getCurrent (),
@@ -993,9 +1036,6 @@ static void swift_taskGroup_initializeWithFlagsImpl(size_t rawGroupFlags,
9931036 }
9941037 return true ;
9951038 });
996- #else
997- swift_unreachable (" task groups not supported yet in embedded Swift" );
998- #endif
9991039}
10001040
10011041// =============================================================================
0 commit comments