Created
November 5, 2017 01:32
-
-
Save NSExceptional/3af82c6945c55540c159a4a6b12f2cd4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// SwiftMetadata.h | |
// Swift Test | |
// | |
// Created by Tanner on 10/28/17. | |
// Copyright © 2017 Tanner Bennett. All rights reserved. | |
// | |
#import <Foundation/Foundation.h> | |
typedef NS_ENUM(UInt32, NominalTypeDescriptorKind) { | |
NominalTypeDescriptorKindClass = 0, | |
NominalTypeDescriptorKindStruct = 1, | |
NominalTypeDescriptorKindEnum = 2 | |
}; | |
typedef NS_ENUM(NSUInteger, MetadataKind) { | |
MetadataKindStruct = 1, | |
MetadataKindEnum, | |
MetadataKindOptional, | |
MetadataKindOpaque = 8, | |
MetadataKindTuple, | |
MetadataKindFunction, | |
MetadataKindExistential = 12, | |
MetadataKindMetatype, | |
MetadataKindObjcClassWrapper, | |
MetadataKindExistentialMetatype, | |
MetadataKindForeignClass, | |
MetadataKindHeapLocalVariable = 64, | |
MetadataKindHeapGenericLocalVariable = 65, | |
MetadataKindErrorObject = 128 | |
// MetadataKindClass = isa | |
}; | |
typedef union _CommonMetadata { | |
MetadataKind kind; | |
Class isa; | |
} _Metadata; | |
typedef const _Metadata* Metadata; | |
typedef struct NominalTypeDescriptor { | |
SInt32 mangledNameRelativeOffset; | |
union { | |
struct { | |
UInt32 count; | |
SInt32 fieldOffsetVectorOffset; | |
SInt32 namesRelativeOffset; | |
SInt32 typesAccessorRelativeOffset; | |
// Metadata *(*typesAccessor)(void *typeMetadata); | |
} ivars; // structs / classes | |
struct { | |
NSUInteger payloadInfo; | |
NSUInteger noPayloadCaseCount; | |
const char **caseNames; | |
Metadata *(*fieldTypesAccessor)(void *typeMetadata); | |
} cases; // enums | |
} typeInfo; | |
struct { | |
const void *metadataPattern; | |
NSInteger parameterVectorOffset; | |
NSUInteger typeParamCount; // Includes associated types | |
NSUInteger formalTypeParamCount; | |
NSUInteger witnessTableCount[1]; // Variable-length with size .typeParamCount | |
} generic; | |
} NominalTypeDescriptor; | |
#if __LP64__ | |
#define _High8BitMask 0xFF00000000000000 | |
#define _High8Offset 24 | |
#else | |
#define _High8BitMask 0xFF000000 | |
#define _High8Offset 56 | |
#endif | |
#define LowBits(highbits) 8*sizeof(NSUInteger) - highbits | |
#define ArgumentIsInOut(arg) (arg & 0x1) | |
#define EnumPayloadGetCaseCount(enum) (enum->payloadInfo & 0xFFFFFF) | |
#define EnumPayloadGetSizeOffset(enum) ((enum->payloadInfo & _High8BitMask) >> _High8Offset) | |
#define GetByOffset(type, pointer, ivar) (type)((uintptr_t)&pointer->ivar + (NSInteger)pointer->ivar) | |
#define NDTGetMangledName(ndt) GetByOffset(const char *, ndt, mangledNameRelativeOffset) | |
#define StructureGetNames(desc) GetByOffset(const char *, desc, typeInfo.ivars.namesRelativeOffset) | |
#define MetadataGetNDT(md) GetByOffset(NominalTypeDescriptor *, md, nominalTypeDescriptorRelativeOffset) | |
#define StructureGetAccessor(desc) ({ \ | |
(Metadata *(*)(void *))((uintptr_t)desc + desc->typesAccessorRelativeOffset); \ | |
}) | |
typedef struct _SwiftClassMetadata { | |
const Class isa; | |
const struct _SwiftClassMetadata *superclass; | |
uintptr_t reserved[2]; | |
uintptr_t rodata; // (rodata & 0x1) -> isSwiftClass, except SwiftObject | |
UInt32 classFlags; | |
UInt32 instanceAddressOffset; | |
UInt32 instanceSize; | |
UInt16 instanceAlignmentMask; | |
UInt16 reserved_; | |
UInt32 classObjectSize; | |
UInt32 classObjectAddressPoint; | |
NSInteger nominalTypeDescriptorRelativeOffset; | |
// Inline variable-sized arrays | |
struct ClassHierarchyInfo { | |
struct _SwiftClassMetadata *parent; // Currently always nil | |
// struct GenericParameterVector { | |
// TypeMetadata *T, *U, *V; | |
// GenericWitnessTable *T_wt, *U_wt, *V_wt; | |
// } genericParameters[genericCount]; | |
// IMP vtable[methodCount]; | |
// idk FieldOffsetVector; | |
} classHierarchy[1]; // Sized to superclass count | |
} ClassMetadata; | |
typedef struct _SwiftStructMetadata { | |
MetadataKind kind; | |
NSInteger nominalTypeDescriptorRelativeOffset; | |
const Metadata parent; // Always nil for now | |
NSUInteger fieldOffsets[1]; // Sized to ivar count | |
// struct GenericParameterVector { | |
// TypeMetadata T, U, V; | |
// GenericWitnessTable *T_wt, *U_wt, *V_wt; | |
// } genericParameters[genericCount]; | |
} StructMetadata; | |
typedef struct _SwiftEnumMetadata { | |
MetadataKind kind; | |
NSInteger nominalTypeDescriptorRelativeOffset; | |
const Metadata parent; // Always nil for now | |
// struct GenericParameterVector { | |
// TypeMetadata T, U, V; | |
// GenericWitnessTable *T_wt, *U_wt, *V_wt; | |
// } genericParameters[genericCount]; | |
} EnumMetadata; | |
typedef struct _SwiftTupleMetadata { | |
MetadataKind kind; | |
NSUInteger numberOfArguments; | |
const char *names; // Inline array of names like ["foo", "bar", etc] | |
struct { | |
NominalTypeDescriptor *type; | |
NSUInteger offset; | |
} arguments[1]; // Sized to .numberOfArguments | |
} TupleMetadata; | |
typedef struct _SwiftFunctionMetadata { | |
MetadataKind kind; | |
UInt8 throws; | |
UInt8 metadataConvention; | |
NSUInteger numberOfArguments : LowBits(16); | |
const Metadata arguments[1]; // Sized to numberOfArguments | |
// Metadata *returnType; | |
} FunctionMetadata; | |
typedef struct _SwiftProtocolMetadata { | |
MetadataKind kind; | |
union { | |
struct { | |
BOOL classConstrained : 1; | |
NSUInteger witnessTableCount : 31; | |
} flags; | |
NSUInteger unused; | |
} layout; | |
NSUInteger conformedCount; | |
const void *protocolDescriptors; | |
} ProtocolMetadata; | |
typedef struct _SwiftMetatypeMetadata { | |
MetadataKind kind; | |
const Metadata instanceType; | |
} MetatypeMetadata; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment