mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
The approach here is to split this into two cases: - If all case payloads have a fixed size, spare bits may be potentially used to differentiate between cases, and the remote reflection library does not have enough information to compute the layout itself. However, the total size must be fixed, so IRGen just emits a builtin type descriptor (which I need to rename to 'fixed type descriptor' since these are also used for imported value types, and now, certain enums). - If at least one case has a size that depends on a generic parameter or is a resilient type, IRGen does not know the size, but this means fancy tricks with spare bits cannot be used either. The remote reflection library uses the same approach as the runtime, basically taking the maximum of the payload size and alignment, and adding a tag byte. As with single-payload enums, we produce a new kind of RecordTypeInfo, this time with a field for every enum case. All cases start at offset zero (but of course this might change, if for example we put the enum tag before the address point). Also, just as with single-payload enums, there is no remote 'project case index' operation on ReflectionContext yet. So the the main benefit from this change is that we don't entirely give up when doing layout of class instances containing enums; however, tools still cannot look inside the enum values themselves, except in the simplest cases involving optionals. Notably, the remote reflection library finally understands all of the standard library's collection types -- Array, Character, Dictionary, Set, and String.
49 lines
1.6 KiB
Swift
49 lines
1.6 KiB
Swift
// RUN: rm -rf %t && mkdir -p %t
|
|
// RUN: %target-build-swift -lswiftSwiftReflectionTest %s -o %t/reflect_Int32
|
|
// RUN: %target-run %target-swift-reflection-test %t/reflect_Int32 2>&1 | FileCheck %s --check-prefix=CHECK-%target-ptrsize
|
|
// REQUIRES: objc_interop
|
|
// REQUIRES: executable_test
|
|
|
|
import SwiftReflectionTest
|
|
|
|
class TestClass {
|
|
var t: Int32
|
|
init(t: Int32) {
|
|
self.t = t
|
|
}
|
|
}
|
|
|
|
var obj = TestClass(t: 123)
|
|
|
|
reflect(object: obj)
|
|
|
|
// CHECK-64: Reflecting an object.
|
|
// CHECK-64: Instance pointer in child address space: 0x{{[0-9a-fA-F]+}}
|
|
// CHECK-64: Type reference:
|
|
// CHECK-64: (class reflect_Int32.TestClass)
|
|
|
|
// CHECK-64: Type info:
|
|
// CHECK-64: (class_instance size=20 alignment=16 stride=32 num_extra_inhabitants=0
|
|
// CHECK-64: (field name=t offset=16
|
|
// CHECK-64: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=0
|
|
// CHECK-64: (field name=_value offset=0
|
|
// CHECK-64: (builtin size=4 alignment=4 stride=4 num_extra_inhabitants=0)))))
|
|
|
|
// CHECK-32: Reflecting an object.
|
|
// CHECK-32: Instance pointer in child address space: 0x{{[0-9a-fA-F]+}}
|
|
// CHECK-32: Type reference:
|
|
// CHECK-32: (class reflect_Int32.TestClass)
|
|
|
|
// CHECK-32: Type info:
|
|
// CHECK-32: (class_instance size=16 alignment=16 stride=16 num_extra_inhabitants=0
|
|
// CHECK-32: (field name=t offset=12
|
|
// CHECK-32: (struct size=4 alignment=4 stride=4 num_extra_inhabitants=0
|
|
// CHECK-32: (field name=_value offset=0
|
|
// CHECK-32: (builtin size=4 alignment=4 stride=4 num_extra_inhabitants=0)))))
|
|
|
|
doneReflecting()
|
|
|
|
// CHECK-64: Done.
|
|
|
|
// CHECK-32: Done.
|