blob: 7c45961c63c460dca7c3c3272ad2ebb54040668f [file] [log] [blame]
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
}
}