Skip to content

Instantly share code, notes, and snippets.

@NSExceptional
Created November 5, 2017 01:32
Show Gist options
  • Save NSExceptional/3af82c6945c55540c159a4a6b12f2cd4 to your computer and use it in GitHub Desktop.
Save NSExceptional/3af82c6945c55540c159a4a6b12f2cd4 to your computer and use it in GitHub Desktop.
//
// 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