Created
March 21, 2019 23:25
-
-
Save kateinoigakukun/89cc89048fc9fa6c86c26bb4230617b9 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
struct RelativePointer<Pointee> { | |
var offset: Int32 | |
mutating func advanced() -> UnsafeMutablePointer<Pointee> { | |
return withUnsafePointer(to: &self) { [offset] pointer in | |
let rawPointer = UnsafeRawPointer(pointer) | |
let advanced = rawPointer.advanced(by: Int(offset)) | |
let pointer = advanced.assumingMemoryBound(to: Pointee.self) | |
return UnsafeMutablePointer(mutating: pointer) | |
} | |
} | |
} | |
struct StructTypeMetadata { | |
let kind: Int8 | |
var typeDescriptor: UnsafeMutablePointer<StructTypeDescriptor> | |
} | |
struct StructTypeDescriptor { | |
let flags: Int32 | |
let parentContextDescriptor: Int32 | |
var name: RelativePointer<CChar> | |
} | |
struct Animal {} | |
let type: Any.Type = Animal.self | |
let metadata = unsafeBitCast(type, to: UnsafePointer<StructTypeMetadata>.self).pointee | |
let namePointer = metadata.typeDescriptor.pointee.name.advanced() | |
print(String(cString: namePointer)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment