[embedded] Add IVarDestroyers into class metadata, add support for throws in initializers

This commit is contained in:
Kuba Mracek
2024-03-22 14:23:46 -07:00
parent 55c4956fba
commit b8bd832fba
9 changed files with 128 additions and 10 deletions

View File

@@ -17,10 +17,15 @@ import SwiftShims
public struct ClassMetadata {
var superclassMetadata: UnsafeMutablePointer<ClassMetadata>?
// There is no way to express the actual calling convention on the heap desroy
// There is no way to express the actual calling convention on this
// function (swiftcc with 'self') currently, so let's use UnsafeRawPointer
// and a helper function in C (_swift_embedded_invoke_heap_object_destroy).
var destroy: UnsafeRawPointer
// There is no way to express the actual calling convention on this
// function (swiftcc with 'self') currently, so let's use UnsafeRawPointer
// and a helper function in C (_swift_embedded_invoke_heap_object_ivardestroyer).
var ivarDestroyer: UnsafeRawPointer
}
public struct HeapObject {
@@ -116,6 +121,20 @@ func swift_deallocClassInstance(object: UnsafeMutablePointer<HeapObject>, alloca
free(object._rawValue)
}
@_cdecl("swift_deallocPartialClassInstance")
public func swift_deallocPartialClassInstance(object: Builtin.RawPointer, metadata: Builtin.RawPointer, allocatedSize: Int, allocatedAlignMask: Int) {
swift_deallocPartialClassInstance(object: UnsafeMutablePointer<HeapObject>(object), metadata: UnsafeMutablePointer<ClassMetadata>(metadata), allocatedSize: allocatedSize, allocatedAlignMask: allocatedAlignMask)
}
func swift_deallocPartialClassInstance(object: UnsafeMutablePointer<HeapObject>, metadata: UnsafeMutablePointer<ClassMetadata>, allocatedSize: Int, allocatedAlignMask: Int) {
var classMetadata = _swift_embedded_get_heap_object_metadata_pointer(object).assumingMemoryBound(to: ClassMetadata.self)
while classMetadata != metadata {
_swift_embedded_invoke_heap_object_ivardestroyer(object, classMetadata)
guard let superclassMetadata = classMetadata.pointee.superclassMetadata else { break }
classMetadata = superclassMetadata
}
}
@_cdecl("swift_initStaticObject")
public func swift_initStaticObject(metadata: Builtin.RawPointer, object: Builtin.RawPointer) -> Builtin.RawPointer {
return swift_initStaticObject(metadata: UnsafeMutablePointer<ClassMetadata>(metadata), object: UnsafeMutablePointer<HeapObject>(object))._rawValue