Skip to content

Instantly share code, notes, and snippets.

@kateinoigakukun
Created March 21, 2019 23:25
Show Gist options
  • Save kateinoigakukun/89cc89048fc9fa6c86c26bb4230617b9 to your computer and use it in GitHub Desktop.
Save kateinoigakukun/89cc89048fc9fa6c86c26bb4230617b9 to your computer and use it in GitHub Desktop.
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