杨锴
2025-04-16 09a372bc45fde16fd42257ab6f78b8deeecf720b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//
//  FieldDescriptor.swift
//  HandyJSON
//
//  Created by chantu on 2019/1/31.
//  Copyright © 2019 aliyun. All rights reserved.
//
 
import Foundation
 
enum FieldDescriptorKind : UInt16 {
    // Swift nominal types.
    case Struct = 0
    case Class
    case Enum
 
    // Fixed-size multi-payload enums have a special descriptor format that
    // encodes spare bits.
    //
    // FIXME: Actually implement this. For now, a descriptor with this kind
    // just means we also have a builtin descriptor from which we get the
    // size and alignment.
    case MultiPayloadEnum
 
    // A Swift opaque protocol. There are no fields, just a record for the
    // type itself.
    case `Protocol`
 
    // A Swift class-bound protocol.
    case ClassProtocol
 
    // An Objective-C protocol, which may be imported or defined in Swift.
    case ObjCProtocol
 
    // An Objective-C class, which may be imported or defined in Swift.
    // In the former case, field type metadata is not emitted, and
    // must be obtained from the Objective-C runtime.
    case ObjCClass
}
 
struct FieldDescriptor: PointerType {
 
    var pointer: UnsafePointer<_FieldDescriptor>
 
    var fieldRecordSize: Int {
        return Int(pointer.pointee.fieldRecordSize)
    }
 
    var numFields: Int {
        return Int(pointer.pointee.numFields)
    }
 
    var fieldRecords: [FieldRecord] {
        return (0..<numFields).map({ (i) -> FieldRecord in
            return FieldRecord(pointer: UnsafePointer<_FieldRecord>(pointer + 1) + i)
        })
    }
}
 
struct _FieldDescriptor {
    var mangledTypeNameOffset: Int32
    var superClassOffset: Int32
    var fieldDescriptorKind: FieldDescriptorKind
    var fieldRecordSize: Int16
    var numFields: Int32
}
 
struct FieldRecord: PointerType {
 
    var pointer: UnsafePointer<_FieldRecord>
 
    var fieldRecordFlags: Int {
        return Int(pointer.pointee.fieldRecordFlags)
    }
 
    var mangledTypeName: UnsafePointer<UInt8>? {
        let address = Int(bitPattern: pointer) + 1 * 4
        let offset = Int(pointer.pointee.mangledTypeNameOffset)
        let cString = UnsafePointer<UInt8>(bitPattern: address + offset)
        return cString
    }
 
    var fieldName: String {
        let address = Int(bitPattern: pointer) + 2 * 4
        let offset = Int(pointer.pointee.fieldNameOffset)
        if let cString = UnsafePointer<UInt8>(bitPattern: address + offset) {
            return String(cString: cString)
        }
        return ""
    }
}
 
struct _FieldRecord {
    var fieldRecordFlags: Int32
    var mangledTypeNameOffset: Int32
    var fieldNameOffset: Int32
}