Skip to content

Commit c3d378b

Browse files
committed
"childForInstance" can drill into a closure context
1 parent ea54c3b commit c3d378b

File tree

1 file changed

+9
-31
lines changed

1 file changed

+9
-31
lines changed

stdlib/tools/swift-reflection-test/swift-reflection-test.c

Lines changed: 9 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -648,47 +648,25 @@ int reflectEnumValue(SwiftReflectionContextRef RC,
648648
{
649649
// Get the pointer value from the target
650650
void *outFreeContext = NULL;
651-
const void *rawPtr = PipeMemoryReader_readBytes(&Pipe, EnumInstance, 8, &outFreeContext);
651+
const void *rawPtr = PipeMemoryReader_readBytes((void *)&Pipe, EnumInstance, 8, &outFreeContext);
652652
uintptr_t instance = *(uintptr_t *)rawPtr;
653653

654+
// Indirect enum is stored as the first field of a closure context...
654655
swift_typeinfo_t TI = swift_reflection_infoForInstance(RC, instance);
655656
if (TI.Kind == SWIFT_CLOSURE_CONTEXT) {
656-
printf("********** FOUND Closure Context **************\n");
657-
swift_typeref_t TR = swift_reflection_typeRefForInstance(RC, instance);
658-
printf("Type reference for instance: ");
659-
swift_reflection_dumpTypeRef(TR);
660-
printf("\n");
661-
662-
swift_typeinfo_t TI1 = swift_reflection_infoForTypeRef(RC, TR);
663-
printf("Type info for type ref: Kind: %d NumFields: %d\n", TI1.Kind, TI1.NumFields);
664-
665-
swift_typeinfo_t TI = swift_reflection_infoForInstance(RC, instance);
666-
printf("Type info for instance: Kind: %d NumFields: %d\n", TI.Kind, TI.NumFields);
667-
668-
printf("Type info for instance:\n");
669-
swift_reflection_dumpInfoForInstance(RC, instance);
670-
printf("\n");
671-
672-
// XXX FIXME THIS BREAKS?! What is the right way to reflect a closure context?
673657
swift_childinfo_t CaseInfo
674-
= swift_reflection_childOfTypeRef(RC, TR, 0);
675-
658+
= swift_reflection_childOfInstance(RC, instance, 0);
676659
if (CaseInfo.TR != 0) {
677-
printf("******** Read Case 0 *************\n");
678-
swift_typeinfo_t maybeEnumTI = swift_reflection_infoForTypeRef(RC, CaseInfo.TR);
679-
if (maybeEnumTI.Kind == SWIFT_NO_PAYLOAD_ENUM
680-
|| maybeEnumTI.Kind == SWIFT_SINGLE_PAYLOAD_ENUM
681-
|| maybeEnumTI.Kind == SWIFT_MULTI_PAYLOAD_ENUM) {
682-
printf("******** FOUND INDIRECT ENUM *************\n");
683-
EnumTypeRef = 0; // REMOVE ME
660+
if (CaseInfo.Kind == SWIFT_NO_PAYLOAD_ENUM
661+
|| CaseInfo.Kind == SWIFT_SINGLE_PAYLOAD_ENUM
662+
|| CaseInfo.Kind == SWIFT_MULTI_PAYLOAD_ENUM) {
663+
EnumTypeRef = CaseInfo.TR;
664+
EnumInstance = instance + CaseInfo.Offset;
684665
break;
685666
}
686-
} else {
687-
printf("!!!!!!!!! Case 0 has no TR\n");
688667
}
689-
} else {
690-
printf("!!!!!!!!!! Not a closure context\n");
691668
}
669+
__attribute__((fallthrough));
692670
}
693671
default:
694672
{

0 commit comments

Comments
 (0)