Skip to content

Commit 37d9be6

Browse files
committed
[embedded] Handle NULL IVarDestroyers, expand test
1 parent b8bd832 commit 37d9be6

File tree

3 files changed

+22
-8
lines changed

3 files changed

+22
-8
lines changed

stdlib/public/SwiftShims/swift/shims/EmbeddedShims.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,15 @@ _swift_embedded_invoke_heap_object_destroy(void *object) {
6363
}
6464

6565
static inline void
66-
_swift_embedded_invoke_heap_object_ivardestroyer(void *object, void *metadata) {
66+
_swift_embedded_invoke_heap_object_optional_ivardestroyer(void *object, void *metadata) {
6767
void **ivardestroyer_location = &((void **)metadata)[2];
68+
if (*ivardestroyer_location) {
6869
#if __has_feature(ptrauth_calls)
69-
(*(HeapObjectDestroyer __ptrauth(0, 1, 0xbbbf) *)ivardestroyer_location)(object);
70+
(*(HeapObjectDestroyer __ptrauth(0, 1, 0xbbbf) *)ivardestroyer_location)(object);
7071
#else
71-
(*(HeapObjectDestroyer *)ivardestroyer_location)(object);
72+
(*(HeapObjectDestroyer *)ivardestroyer_location)(object);
7273
#endif
74+
}
7375
}
7476

7577
static inline void *_swift_embedded_get_heap_object_metadata_pointer(void *object) {

stdlib/public/core/EmbeddedRuntime.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ public struct ClassMetadata {
2424

2525
// There is no way to express the actual calling convention on this
2626
// function (swiftcc with 'self') currently, so let's use UnsafeRawPointer
27-
// and a helper function in C (_swift_embedded_invoke_heap_object_ivardestroyer).
28-
var ivarDestroyer: UnsafeRawPointer
27+
// and a helper function in C (_swift_embedded_invoke_heap_object_optional_ivardestroyer).
28+
var ivarDestroyer: UnsafeRawPointer?
2929
}
3030

3131
public struct HeapObject {
@@ -129,7 +129,7 @@ public func swift_deallocPartialClassInstance(object: Builtin.RawPointer, metada
129129
func swift_deallocPartialClassInstance(object: UnsafeMutablePointer<HeapObject>, metadata: UnsafeMutablePointer<ClassMetadata>, allocatedSize: Int, allocatedAlignMask: Int) {
130130
var classMetadata = _swift_embedded_get_heap_object_metadata_pointer(object).assumingMemoryBound(to: ClassMetadata.self)
131131
while classMetadata != metadata {
132-
_swift_embedded_invoke_heap_object_ivardestroyer(object, classMetadata)
132+
_swift_embedded_invoke_heap_object_optional_ivardestroyer(object, classMetadata)
133133
guard let superclassMetadata = classMetadata.pointee.superclassMetadata else { break }
134134
classMetadata = superclassMetadata
135135
}

test/embedded/init-throwing.swift

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,28 @@ public class Foo {
2222
}
2323
}
2424

25-
_ = try? Foo(shouldThrow: true)
25+
public class Bar: Foo {
26+
var value: Int = 17
27+
}
28+
29+
public class Wibble: Bar {
30+
var c: PrintingClass = .init()
31+
}
32+
33+
_ = try? Wibble(shouldThrow: true)
2634
print("OK 1")
2735
// CHECK: PrintingClass.init
36+
// CHECK: PrintingClass.init
37+
// CHECK: PrintingClass.deinit
2838
// CHECK: PrintingClass.deinit
2939
// CHECK: OK 1
3040

31-
_ = try? Foo(shouldThrow: false)
41+
_ = try? Wibble(shouldThrow: false)
3242
print("OK 2")
3343
// CHECK: PrintingClass.init
3444
// CHECK: PrintingClass.init
45+
// CHECK: PrintingClass.init
46+
// CHECK: PrintingClass.deinit
3547
// CHECK: PrintingClass.deinit
3648
// CHECK: PrintingClass.deinit
3749
// CHECK: OK 2

0 commit comments

Comments
 (0)