Skip to content

Commit a0b5e63

Browse files
authored
Merge pull request #13672 from gottesmm/pr-18d3797b454ec22cb51e8a3c55533ffc676f47b6
2 parents 2855c9e + 8e04e93 commit a0b5e63

File tree

1 file changed

+53
-2
lines changed

1 file changed

+53
-2
lines changed

stdlib/public/runtime/Reflection.mm

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,10 @@ static Mirror reflect(HeapObject *owner,
332332
const OpaqueValue *mirrorValue;
333333
std::tie(mirrorType, mirrorValue) = unwrapExistential(T, value);
334334

335+
#ifdef SWIFT_RUNTIME_ENABLE_GUARANTEED_NORMAL_ARGUMENTS
336+
swift_retain(owner);
337+
#endif
338+
335339
// Use MagicMirror.
336340
// Consumes 'owner'.
337341
Mirror result;
@@ -346,7 +350,9 @@ intptr_t swift_TupleMirror_count(HeapObject *owner,
346350
const OpaqueValue *value,
347351
const Metadata *type) {
348352
auto Tuple = static_cast<const TupleTypeMetadata *>(type);
353+
#ifndef SWIFT_RUNTIME_ENABLE_GUARANTEED_NORMAL_ARGUMENTS
349354
swift_release(owner);
355+
#endif
350356
return Tuple->NumElements;
351357
}
352358

@@ -392,6 +398,10 @@ void swift_TupleMirror_subscript(String *outString,
392398
auto bytes = reinterpret_cast<const char*>(value);
393399
auto eltData = reinterpret_cast<const OpaqueValue *>(bytes + elt.Offset);
394400

401+
#ifdef SWIFT_RUNTIME_ENABLE_GUARANTEED_NORMAL_ARGUMENTS
402+
swift_retain(owner);
403+
#endif
404+
395405
// 'owner' is consumed by this call.
396406
new (outMirror) Mirror(reflect(owner, eltData, elt.Type));
397407
}
@@ -460,13 +470,15 @@ static bool loadSpecialReferenceStorage(HeapObject *owner,
460470

461471
type->deallocateBufferIn(&temporaryBuffer);
462472

473+
#ifndef SWIFT_RUNTIME_ENABLE_GUARANTEED_NORMAL_ARGUMENTS
463474
// swift_StructMirror_subscript and swift_ClassMirror_subscript
464475
// requires that the owner be consumed. Since we have the new heap box as the
465476
// owner now, we need to release the old owner to maintain the contract.
466477
if (owner->metadata->isAnyClass())
467478
swift_unknownRelease(owner);
468479
else
469480
swift_release(owner);
481+
#endif
470482

471483
return true;
472484
}
@@ -478,7 +490,9 @@ intptr_t swift_StructMirror_count(HeapObject *owner,
478490
const OpaqueValue *value,
479491
const Metadata *type) {
480492
auto Struct = static_cast<const StructMetadata *>(type);
493+
#ifndef SWIFT_RUNTIME_ENABLE_GUARANTEED_NORMAL_ARGUMENTS
481494
swift_release(owner);
495+
#endif
482496
return Struct->Description->Struct.NumFields;
483497
}
484498

@@ -563,7 +577,9 @@ static void getEnumMirrorInfo(const OpaqueValue *value,
563577
const OpaqueValue *value,
564578
const Metadata *type) {
565579
if (!isEnumReflectable(type)) {
580+
#ifndef SWIFT_RUNTIME_ENABLE_GUARANTEED_NORMAL_ARGUMENTS
566581
swift_release(owner);
582+
#endif
567583
return nullptr;
568584
}
569585

@@ -573,7 +589,9 @@ static void getEnumMirrorInfo(const OpaqueValue *value,
573589
unsigned tag;
574590
getEnumMirrorInfo(value, type, &tag, nullptr, nullptr);
575591

592+
#ifndef SWIFT_RUNTIME_ENABLE_GUARANTEED_NORMAL_ARGUMENTS
576593
swift_release(owner);
594+
#endif
577595

578596
return getFieldName(Description.CaseNames, tag);
579597
}
@@ -588,7 +606,12 @@ static void getEnumMirrorInfo(const OpaqueValue *value,
588606
OpaqueValue *mirrorValue = const_cast<OpaqueValue*>(cMirrorValue);
589607
Mirror mirror;
590608

591-
bool take = mirrorValue == value;
609+
bool take =
610+
#ifndef SWIFT_RUNTIME_ENABLE_GUARANTEED_NORMAL_ARGUMENTS
611+
mirrorValue == value;
612+
#else
613+
false;
614+
#endif
592615
::new (&mirror) MagicMirror(mirrorValue, mirrorType, take);
593616

594617
MagicMirror *theMirror = reinterpret_cast<MagicMirror *>(&mirror);
@@ -602,13 +625,17 @@ intptr_t swift_EnumMirror_count(HeapObject *owner,
602625
const OpaqueValue *value,
603626
const Metadata *type) {
604627
if (!isEnumReflectable(type)) {
628+
#ifndef SWIFT_RUNTIME_ENABLE_GUARANTEED_NORMAL_ARGUMENTS
605629
swift_release(owner);
630+
#endif
606631
return 0;
607632
}
608633

609634
const Metadata *payloadType;
610635
getEnumMirrorInfo(value, type, nullptr, &payloadType, nullptr);
636+
#ifndef SWIFT_RUNTIME_ENABLE_GUARANTEED_NORMAL_ARGUMENTS
611637
swift_release(owner);
638+
#endif
612639
return (payloadType != nullptr) ? 1 : 0;
613640
}
614641

@@ -637,7 +664,9 @@ void swift_EnumMirror_subscript(String *outString,
637664
type->vw_destructiveInjectEnumTag(const_cast<OpaqueValue *>(value),
638665
(int) (tag - Description.getNumPayloadCases()));
639666

667+
#ifndef SWIFT_RUNTIME_ENABLE_GUARANTEED_NORMAL_ARGUMENTS
640668
swift_release(owner);
669+
#endif
641670

642671
owner = pair.object;
643672
value = pair.buffer;
@@ -665,7 +694,9 @@ intptr_t swift_ClassMirror_count(HeapObject *owner,
665694
const OpaqueValue *value,
666695
const Metadata *type) {
667696
auto Clas = static_cast<const ClassMetadata*>(type);
697+
#ifndef SWIFT_RUNTIME_ENABLE_GUARANTEED_NORMAL_ARGUMENTS
668698
swift_release(owner);
699+
#endif
669700
auto count = Clas->getDescription()->Class.NumFields;
670701

671702
// If the class has a superclass, the superclass instance is treated as the
@@ -771,7 +802,9 @@ intptr_t swift_ObjCMirror_count(HeapObject *owner,
771802
if (isa->SuperClass)
772803
count += 1;
773804

805+
#ifndef SWIFT_RUNTIME_ENABLE_GUARANTEED_NORMAL_ARGUMENTS
774806
swift_release(owner);
807+
#endif
775808
return count;
776809
}
777810

@@ -810,7 +843,9 @@ void swift_ObjCMirror_subscript(String *outString,
810843
swift_ClassMirror_quickLookObject(HeapObject *owner, const OpaqueValue *value,
811844
const Metadata *type) {
812845
id object = [*reinterpret_cast<const id *>(value) retain];
846+
#ifndef SWIFT_RUNTIME_ENABLE_GUARANTEED_NORMAL_ARGUMENTS
813847
swift_release(owner);
848+
#endif
814849
if ([object respondsToSelector:@selector(debugQuickLookObject)]) {
815850
id quickLookObject = [object debugQuickLookObject];
816851
[quickLookObject retain];
@@ -906,6 +941,10 @@ static Mirror getMirrorForSuperclass(const ClassMetadata *sup,
906941
Mirror resultBuf;
907942
MagicMirror *result = ::new (&resultBuf) MagicMirror;
908943

944+
#ifdef SWIFT_RUNTIME_ENABLE_GUARANTEED_NORMAL_ARGUMENTS
945+
swift_retain(owner);
946+
#endif
947+
909948
result->Self = ClassSuperMirrorMetadata();
910949
result->MirrorWitness = &ClassSuperMirrorWitnessTable;
911950
result->Data.Owner = owner;
@@ -925,6 +964,10 @@ static Mirror ObjC_getMirrorForSuperclass(Class sup,
925964
Mirror resultBuf;
926965
MagicMirror *result = ::new (&resultBuf) MagicMirror;
927966

967+
#ifdef SWIFT_RUNTIME_ENABLE_GUARANTEED_NORMAL_ARGUMENTS
968+
swift_retain(owner);
969+
#endif
970+
928971
result->Self = ObjCSuperMirrorMetadata();
929972
result->MirrorWitness = &ObjCSuperMirrorWitnessTable;
930973
result->Data.Owner = owner;
@@ -1073,11 +1116,19 @@ static Mirror ObjC_getMirrorForSuperclass(Class sup,
10731116
Mirror result;
10741117
// Take the value, unless we projected a subvalue from it. We don't want to
10751118
// deal with partial value deinitialization.
1076-
bool take = mirrorValue == value;
1119+
bool take =
1120+
#ifndef SWIFT_RUNTIME_ENABLE_GUARANTEED_NORMAL_ARGUMENTS
1121+
mirrorValue == value;
1122+
#else
1123+
false;
1124+
#endif
10771125
::new (&result) MagicMirror(mirrorValue, mirrorType, take);
1126+
1127+
#ifndef SWIFT_RUNTIME_ENABLE_GUARANTEED_NORMAL_ARGUMENTS
10781128
// Destroy the whole original value if we couldn't take it.
10791129
if (!take)
10801130
T->vw_destroy(value);
1131+
#endif
10811132
return MirrorReturn(result);
10821133
}
10831134

0 commit comments

Comments
 (0)