@@ -648,47 +648,25 @@ int reflectEnumValue(SwiftReflectionContextRef RC,
648
648
{
649
649
// Get the pointer value from the target
650
650
void * outFreeContext = NULL ;
651
- const void * rawPtr = PipeMemoryReader_readBytes (& Pipe , EnumInstance , 8 , & outFreeContext );
651
+ const void * rawPtr = PipeMemoryReader_readBytes (( void * ) & Pipe , EnumInstance , 8 , & outFreeContext );
652
652
uintptr_t instance = * (uintptr_t * )rawPtr ;
653
653
654
+ // Indirect enum is stored as the first field of a closure context...
654
655
swift_typeinfo_t TI = swift_reflection_infoForInstance (RC , instance );
655
656
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?
673
657
swift_childinfo_t CaseInfo
674
- = swift_reflection_childOfTypeRef (RC , TR , 0 );
675
-
658
+ = swift_reflection_childOfInstance (RC , instance , 0 );
676
659
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 ;
684
665
break ;
685
666
}
686
- } else {
687
- printf ("!!!!!!!!! Case 0 has no TR\n" );
688
667
}
689
- } else {
690
- printf ("!!!!!!!!!! Not a closure context\n" );
691
668
}
669
+ __attribute__((fallthrough ));
692
670
}
693
671
default :
694
672
{
0 commit comments