Files
Jordan Rose 7629253ab5 Test that newer libobjcs let the Swift runtime set up a class's layout (#21942)
Specifically, when the class is referenced from Objective-C first,
before being referenced from Swift in any way. This is important for
resilience, since up until now Objective-C isn't used to the size of a
class changing based on anything other than a superclass's size
changing.

This is basically the test that would have gone with 9024768b0 had
there been a build of libobjc to test it with.

rdar://problem/45718008
2019-01-17 17:39:44 -08:00

66 lines
2.0 KiB
Swift

import Resilient
import Foundation
import OneWordSuperclass
public class StaticClass: OneWordSuperclass {
@objc var first: Int32 = 0
var middle = GrowsToInt64()
@objc var last: Int = 0
@objc public static var offsetOfFirst: Int {
// IRGen lays out Swift classes that subclass Objective-C classes as if the
// only superclass was NSObject, so the starting (offset % alignment) isn't
// always 0. This means that on 32-bit platforms we'll have a gap *before*
// 'first' when we need 8-byte alignment, rather than after as you'd see in
// a struct (or base class).
return max(MemoryLayout<Int>.size, MemoryLayout<GrowsToInt64>.alignment) +
MemoryLayout<Int>.size
}
@objc public static var totalSize: Int {
return (2 * MemoryLayout<Int>.size) +
(2 * MemoryLayout<GrowsToInt64>.size) + // alignment
MemoryLayout<Int>.size
}
}
/// This class has the same layout as `StaticClass`, but will be accessed using
/// `NSClassFromString` instead of `+class`.
public class DynamicClass: OneWordSuperclass {
@objc var first: Int32 = 0
var middle = GrowsToInt64()
@objc var last: Int = 0
@objc public static var offsetOfFirst: Int {
// See above.
return max(MemoryLayout<Int>.size, MemoryLayout<GrowsToInt64>.alignment) +
MemoryLayout<Int>.size
}
@objc public static var totalSize: Int {
return (2 * MemoryLayout<Int>.size) +
(2 * MemoryLayout<GrowsToInt64>.size) + // alignment
MemoryLayout<Int>.size
}
}
public class PureSwiftBaseClass {
var word: Int64 = 0
}
public class PureSwiftClass: PureSwiftBaseClass {
@objc var first: Int32 = 0
var middle = GrowsToInt64()
@objc var last: Int = 0
@objc public static var offsetOfFirst: Int {
return (2 * MemoryLayout<Int>.size) + MemoryLayout<Int64>.size
}
@objc public static var totalSize: Int {
return (2 * MemoryLayout<Int>.size) + MemoryLayout<Int64>.size +
(2 * MemoryLayout<GrowsToInt64>.size) + // alignment
MemoryLayout<Int>.size
}
}