Skip to content

Commit ea7dd7e

Browse files
committed
Minor changes to how we track and lock around metadata dependencies
to enable the general cycle-dependency runtime error.
1 parent 4d46183 commit ea7dd7e

File tree

2 files changed

+184
-70
lines changed

2 files changed

+184
-70
lines changed

stdlib/public/runtime/Metadata.cpp

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3332,35 +3332,30 @@ static Result performOnMetadataCache(const Metadata *metadata,
33323332
getCache(generics), key);
33333333
}
33343334

3335-
bool swift::addToMetadataQueue(
3336-
std::unique_ptr<MetadataCompletionQueueEntry> &&queueEntry,
3337-
const Metadata *dependency,
3338-
MetadataState dependencyRequirement) {
3335+
bool swift::addToMetadataQueue(MetadataCompletionQueueEntry *queueEntry,
3336+
const Metadata *dependency,
3337+
MetadataState dependencyRequirement) {
33393338
struct EnqueueCallbacks {
3340-
std::unique_ptr<MetadataCompletionQueueEntry> &&QueueEntry;
3339+
MetadataCompletionQueueEntry *QueueEntry;
33413340

33423341
bool forGenericMetadata(const Metadata *metadata,
33433342
const TypeContextDescriptor *description,
33443343
GenericMetadataCache &cache,
33453344
MetadataCacheKey key) && {
3346-
return cache.enqueue(key, std::move(QueueEntry));
3345+
return cache.enqueue(key, QueueEntry);
33473346
}
33483347

33493348
bool forOtherMetadata(const Metadata *metadata) && {
33503349
swift_runtime_unreachable("metadata should always be complete");
33513350
}
3352-
} callbacks = { std::move(queueEntry) };
3353-
3354-
// Set the requirement.
3355-
queueEntry->DependencyRequirement = dependencyRequirement;
3351+
} callbacks = { queueEntry };
33563352

33573353
return performOnMetadataCache<bool>(dependency, std::move(callbacks));
33583354
}
33593355

3360-
void swift::resumeMetadataCompletion(
3361-
std::unique_ptr<MetadataCompletionQueueEntry> &&queueEntry) {
3356+
void swift::resumeMetadataCompletion(MetadataCompletionQueueEntry *queueEntry) {
33623357
struct ResumeCallbacks {
3363-
std::unique_ptr<MetadataCompletionQueueEntry> &&QueueEntry;
3358+
MetadataCompletionQueueEntry *QueueEntry;
33643359

33653360
static MetadataRequest getRequest() {
33663361
return MetadataRequest(MetadataState::Complete,
@@ -3371,7 +3366,7 @@ void swift::resumeMetadataCompletion(
33713366
const TypeContextDescriptor *description,
33723367
GenericMetadataCache &cache,
33733368
MetadataCacheKey key) && {
3374-
cache.resumeInitialization(key, std::move(QueueEntry),
3369+
cache.resumeInitialization(key, QueueEntry,
33753370
getRequest(),
33763371
description,
33773372
// This array comes from the metadata, so
@@ -3383,7 +3378,7 @@ void swift::resumeMetadataCompletion(
33833378
void forOtherMetadata(const Metadata *metadata) && {
33843379
swift_runtime_unreachable("metadata should always be complete");
33853380
}
3386-
} callbacks = { std::move(queueEntry) };
3381+
} callbacks = { queueEntry };
33873382

33883383
auto metadata = queueEntry->Value;
33893384
performOnMetadataCache<void>(metadata, std::move(callbacks));

0 commit comments

Comments
 (0)