Skip to content

Commit b3cdcda

Browse files
authored
Merge pull request #67173 from drexin/wip-singleton-inject
Support destructiveInjectEnumTag in singleton enums with layout strings
2 parents 7cc38fd + c046253 commit b3cdcda

File tree

5 files changed

+37
-1
lines changed

5 files changed

+37
-1
lines changed

include/swift/Runtime/RuntimeFunctions.def

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2336,6 +2336,17 @@ FUNCTION(SingletonEnumGetEnumTag,
23362336
ATTRS(NoUnwind, WillReturn),
23372337
EFFECT(NoEffect))
23382338

2339+
// void swift_singletonEnum_destructiveInjectEnumTag(swift::OpaqueValue *address,
2340+
// unsigned tag,
2341+
// const Metadata *metadata)
2342+
FUNCTION(SingletonEnumDestructiveInjectEnumTag,
2343+
swift_singletonEnum_destructiveInjectEnumTag,
2344+
C_CC, AlwaysAvailable,
2345+
RETURNS(VoidTy),
2346+
ARGS(Int8PtrTy, Int32Ty, TypeMetadataPtrTy),
2347+
ATTRS(NoUnwind, WillReturn),
2348+
EFFECT(NoEffect))
2349+
23392350
// unsigned swift_enumSimple_getEnumTag(swift::OpaqueValue *address,
23402351
// const Metadata *metadata);
23412352
FUNCTION(EnumSimpleGetEnumTag,

lib/IRGen/GenValueWitness.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -940,7 +940,7 @@ getDestructiveInjectEnumTagFunction(IRGenModule &IGM,
940940
!isRuntimeInstatiatedLayoutString(IGM, typeLayoutEntry))) {
941941
return nullptr;
942942
} else if (typeLayoutEntry->isSingleton()) {
943-
return nullptr;
943+
return IGM.getSingletonEnumDestructiveInjectEnumTagFn();
944944
} else if (!typeLayoutEntry->isFixedSize(IGM)) {
945945
if (typeLayoutEntry->isMultiPayloadEnum()) {
946946
return IGM.getMultiPayloadEnumGenericDestructiveInjectEnumTagFn();

stdlib/public/runtime/BytecodeLayouts.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,11 @@ extern "C" unsigned swift_singletonEnum_getEnumTag(swift::OpaqueValue *address,
659659
return 0;
660660
}
661661

662+
extern "C" void swift_singletonEnum_destructiveInjectEnumTag(
663+
swift::OpaqueValue *address, unsigned tag, const Metadata *metadata) {
664+
return;
665+
}
666+
662667
template <typename T>
663668
static inline T handleSinglePayloadEnumSimpleTag(
664669
LayoutStringReader &reader, uint8_t *addr,

stdlib/public/runtime/BytecodeLayouts.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,10 @@ SWIFT_RUNTIME_EXPORT
121121
unsigned swift_singletonEnum_getEnumTag(swift::OpaqueValue *address,
122122
const Metadata *metadata);
123123
SWIFT_RUNTIME_EXPORT
124+
void swift_singletonEnum_destructiveInjectEnumTag(swift::OpaqueValue *address,
125+
unsigned tag,
126+
const Metadata *metadata);
127+
SWIFT_RUNTIME_EXPORT
124128
unsigned swift_enumSimple_getEnumTag(swift::OpaqueValue *address,
125129
const Metadata *metadata);
126130
SWIFT_RUNTIME_EXPORT

test/Interpreter/layout_string_witnesses_dynamic.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -670,6 +670,22 @@ func testResilientMultiPayloadEnumGenericInjectTag() {
670670

671671
testResilientMultiPayloadEnumGenericInjectTag()
672672

673+
@inline(never)
674+
func matchResilientSingletonEnumTag(_ x: ResilientSingletonEnum) -> Int {
675+
return switch x {
676+
case .nonEmpty: 0
677+
}
678+
}
679+
680+
func testResilientSingletonEnumGenericInjectTag() {
681+
let x = ResilientSingletonEnum.nonEmpty(SimpleClass(x: 23))
682+
683+
// CHECK: Enum case: 0
684+
print("Enum case: \(matchResilientSingletonEnumTag(x))")
685+
}
686+
687+
testResilientSingletonEnumGenericInjectTag()
688+
673689
#if os(macOS)
674690

675691
import Foundation

0 commit comments

Comments
 (0)