Skip to content

Commit 0ec1f4b

Browse files
authored
Merge pull request swiftlang#76799 from drexin/wip-137066879
[Runtime] Properly compute offset for unmanaged properties in generic…
2 parents 07c4a8f + a5bb53a commit 0ec1f4b

File tree

3 files changed

+42
-2
lines changed

3 files changed

+42
-2
lines changed

stdlib/public/runtime/Metadata.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2855,11 +2855,12 @@ void swift::swift_initStructMetadataWithLayoutString(
28552855

28562856
auto tagAndOffset = ((uint64_t)tag << 56) | offset;
28572857
writer.writeBytes(tagAndOffset);
2858+
previousFieldOffset = fieldType->size - sizeof(uintptr_t);
2859+
} else {
2860+
previousFieldOffset += fieldType->size;
28582861
}
28592862

28602863
fullOffset += fieldType->size;
2861-
previousFieldOffset = fieldType->size - sizeof(uintptr_t);
2862-
28632864
continue;
28642865
}
28652866

test/Interpreter/Inputs/layout_string_witnesses_types_resilient.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,17 @@ public struct GenericResilient<C, T> {
1919
}
2020
}
2121

22+
public struct GenericResilientWithUnmanagedAndWeak<T> {
23+
public let x: T
24+
public unowned(unsafe) var y: AnyObject?
25+
public let z: Int = 500
26+
public weak var w: AnyObject?
27+
28+
public init(x: T) {
29+
self.x = x
30+
}
31+
}
32+
2233
public enum ResilientSinglePayloadEnumGeneric<T> {
2334
case empty0
2435
case empty1

test/Interpreter/layout_string_witnesses_dynamic.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1209,6 +1209,34 @@ func testWeakRefOptionalNative() {
12091209

12101210
testWeakRefOptionalNative()
12111211

1212+
func testGenericResilientWithUnmanagedAndWeak() {
1213+
let ptr = allocateInternalGenericPtr(of: GenericResilientWithUnmanagedAndWeak<TestClass>.self)
1214+
1215+
do {
1216+
let x = GenericResilientWithUnmanagedAndWeak<TestClass>(x: TestClass())
1217+
testGenericInit(ptr, to: x)
1218+
}
1219+
1220+
do {
1221+
let y = GenericResilientWithUnmanagedAndWeak<TestClass>(x: TestClass())
1222+
// CHECK: Before deinit
1223+
print("Before deinit")
1224+
1225+
// CHECK-NEXT: TestClass deinitialized!
1226+
testGenericAssign(ptr, from: y)
1227+
}
1228+
1229+
// CHECK-NEXT: Before deinit
1230+
print("Before deinit")
1231+
1232+
// CHECK-NEXT: TestClass deinitialized!
1233+
testGenericDestroy(ptr, of: GenericResilientWithUnmanagedAndWeak<TestClass>.self)
1234+
1235+
ptr.deallocate()
1236+
}
1237+
1238+
testGenericResilientWithUnmanagedAndWeak()
1239+
12121240
#if os(macOS)
12131241

12141242
import Foundation

0 commit comments

Comments
 (0)