Skip to content

Commit f96b099

Browse files
authored
Merge pull request #67485 from drexin/wip-fix-offset-writing-resolve
[Runtime] Fix issues with dynamic layout string instantiation
2 parents 1835aaf + 6fb2325 commit f96b099

File tree

3 files changed

+73
-3
lines changed

3 files changed

+73
-3
lines changed

stdlib/public/runtime/BytecodeLayouts.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1034,7 +1034,7 @@ void swift::swift_resolve_resilientAccessors(uint8_t *layoutStr,
10341034
reader.skip(sizeof(uintptr_t));
10351035
break;
10361036
case RefCountingKind::SinglePayloadEnumSimple:
1037-
reader.skip((3 * sizeof(uint64_t)) + (4 * sizeof(size_t)));
1037+
reader.skip((2 * sizeof(uint64_t)) + (4 * sizeof(size_t)));
10381038
break;
10391039

10401040
case RefCountingKind::SinglePayloadEnumFN: {

stdlib/public/runtime/Metadata.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -2827,9 +2827,9 @@ void swift::_swift_addRefCountStringForMetatype(LayoutStringWriter &writer,
28272827
}
28282828

28292829
if (offset) {
2830+
LayoutStringReader tagReader {writer.layoutStr, writer.offset};
28302831
auto writerOffsetCopy = writer.offset;
2831-
reader.offset = layoutStringHeaderSize;
2832-
auto firstTagAndOffset = reader.readBytes<uint64_t>();
2832+
auto firstTagAndOffset = tagReader.readBytes<uint64_t>();
28332833
firstTagAndOffset += offset;
28342834
writer.writeBytes(firstTagAndOffset);
28352835
writer.offset = writerOffsetCopy;

test/Interpreter/layout_string_witnesses_dynamic.swift

+70
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,41 @@ func testGenericSinglePayloadEnumManyXI() {
753753

754754
testGenericSinglePayloadEnumManyXI()
755755

756+
struct RefPlusEnumResolve {
757+
let x: SimpleClass
758+
let y: ResilientSinglePayloadEnumComplex
759+
}
760+
761+
func testRefPlusEnumResolve() {
762+
let ptr = allocateInternalGenericPtr(of: RefPlusEnumResolve.self)
763+
764+
do {
765+
let x = RefPlusEnumResolve(x: SimpleClass(x: 23), y: .nonEmpty(.nonEmpty1(SimpleClass(x: 23))))
766+
testGenericInit(ptr, to: x)
767+
}
768+
769+
do {
770+
let y = RefPlusEnumResolve(x: SimpleClass(x: 23), y: .nonEmpty(.nonEmpty1(SimpleClass(x: 23))))
771+
// CHECK: Before deinit
772+
print("Before deinit")
773+
774+
// CHECK-NEXT: SimpleClass deinitialized!
775+
// CHECK-NEXT: SimpleClass deinitialized!
776+
testGenericAssign(ptr, from: y)
777+
}
778+
779+
// CHECK-NEXT: Before deinit
780+
print("Before deinit")
781+
782+
// CHECK-NEXT: SimpleClass deinitialized!
783+
// CHECK-NEXT: SimpleClass deinitialized!
784+
testGenericDestroy(ptr, of: RefPlusEnumResolve.self)
785+
786+
ptr.deallocate()
787+
}
788+
789+
testRefPlusEnumResolve()
790+
756791
func testResilientSingletonEnumTag() {
757792
let x = switch getResilientSingletonEnumNonEmpty(SimpleClass(x: 23)) {
758793
case .nonEmpty: 0
@@ -939,6 +974,41 @@ func testResilientPayloadSinglePayloadEnum() {
939974

940975
testResilientPayloadSinglePayloadEnum()
941976

977+
struct SinglePayloadSimpleResolve {
978+
let x: ResilientSinglePayloadEnumSimple
979+
let y: ResilientSinglePayloadEnumComplex
980+
}
981+
982+
func testSinglePayloadSimpleResolve() {
983+
let ptr = allocateInternalGenericPtr(of: SinglePayloadSimpleResolve.self)
984+
985+
do {
986+
let x = SinglePayloadSimpleResolve(x: .nonEmpty(SimpleClass(x: 23)), y: .nonEmpty(.nonEmpty1(SimpleClass(x: 23))))
987+
testGenericInit(ptr, to: x)
988+
}
989+
990+
do {
991+
let y = SinglePayloadSimpleResolve(x: .nonEmpty(SimpleClass(x: 32)), y: .nonEmpty(.nonEmpty1(SimpleClass(x: 32))))
992+
// CHECK: Before deinit
993+
print("Before deinit")
994+
995+
// CHECK-NEXT: SimpleClass deinitialized!
996+
// CHECK-NEXT: SimpleClass deinitialized!
997+
testGenericAssign(ptr, from: y)
998+
}
999+
1000+
// CHECK-NEXT: Before deinit
1001+
print("Before deinit")
1002+
1003+
// CHECK-NEXT: SimpleClass deinitialized!
1004+
// CHECK-NEXT: SimpleClass deinitialized!
1005+
testGenericDestroy(ptr, of: SinglePayloadSimpleResolve.self)
1006+
1007+
ptr.deallocate()
1008+
}
1009+
1010+
testSinglePayloadSimpleResolve()
1011+
9421012
#if os(macOS)
9431013

9441014
import Foundation

0 commit comments

Comments
 (0)