Skip to content

Commit e801e4e

Browse files
committed
[Distributed] Runtime: Add a way to fetch witness tables for given generic env/arguments
1 parent cf47cfa commit e801e4e

File tree

4 files changed

+63
-1
lines changed

4 files changed

+63
-1
lines changed

stdlib/public/Distributed/DistributedActorSystem.swift

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,10 @@ extension DistributedActorSystem {
176176
}
177177

178178
var substitutionsBuffer: UnsafeMutablePointer<Any.Type>? = nil
179+
var witnessTablesBuffer: UnsafeRawPointer? = nil
180+
var numWitnessTables: Int = 0
179181

180-
if genericEnv != nil {
182+
if let genericEnv = genericEnv {
181183
let subs = try invocationDecoder.decodeGenericSubstitutions()
182184

183185
if subs.isEmpty {
@@ -191,6 +193,17 @@ extension DistributedActorSystem {
191193
let element = substitutionsBuffer?.advanced(by: offset)
192194
element?.initialize(to: substitution)
193195
}
196+
197+
(witnessTablesBuffer, numWitnessTables) = _getWitnessTablesFor(environment: genericEnv,
198+
genericArguments: substitutionsBuffer!)
199+
defer {
200+
witnessTablesBuffer?.deallocate()
201+
}
202+
203+
if numWitnessTables < 0 {
204+
throw ExecuteDistributedTargetError(
205+
message: "Generic substitutions \(subs) do not satisfy generic requirements of \(mangledTargetName)")
206+
}
194207
}
195208

196209
let paramCount = nameUTF8.withUnsafeBufferPointer { nameUTF8 in

stdlib/public/Distributed/DistributedMetadata.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,11 @@ func _getGenericEnvironmentOfDistributedTarget(
100100
_ targetNameStart: UnsafePointer<UInt8>,
101101
_ targetNameLength: UInt
102102
) -> UnsafeRawPointer?
103+
104+
@available(SwiftStdlib 5.6, *)
105+
@_silgen_name("swift_distributed_getWitnessTables")
106+
public // SPI _Distributed
107+
func _getWitnessTablesFor(
108+
environment: UnsafeRawPointer,
109+
genericArguments: UnsafeRawPointer
110+
) -> (UnsafeRawPointer, Int)

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2092,6 +2092,40 @@ swift_func_getParameterTypeInfo(
20922092
return typesLength;
20932093
}
20942094

2095+
SWIFT_CC(swift)
2096+
SWIFT_RUNTIME_STDLIB_SPI
2097+
BufferAndSize
2098+
swift_distributed_getWitnessTables(GenericEnvironmentDescriptor *genericEnv,
2099+
const void *const *genericArguments) {
2100+
assert(genericEnv);
2101+
assert(genericArguments);
2102+
2103+
llvm::SmallVector<const void *, 4> witnessTables;
2104+
SubstGenericParametersFromMetadata substFn(genericEnv, genericArguments);
2105+
2106+
auto error = _checkGenericRequirements(
2107+
genericEnv->getGenericRequirements(), witnessTables,
2108+
[&substFn](unsigned depth, unsigned index) {
2109+
return substFn.getMetadata(depth, index);
2110+
},
2111+
[&substFn](const Metadata *type, unsigned index) {
2112+
return substFn.getWitnessTable(type, index);
2113+
});
2114+
2115+
if (error) {
2116+
return {/*ptr=*/nullptr, -1};
2117+
}
2118+
2119+
if (witnessTables.empty())
2120+
return {/*ptr=*/nullptr, 0};
2121+
2122+
void **tables = (void **)malloc(witnessTables.size() * sizeof(void *));
2123+
for (unsigned i = 0, n = witnessTables.size(); i != n; ++i)
2124+
tables[i] = const_cast<void *>(witnessTables[i]);
2125+
2126+
return {tables, static_cast<intptr_t>(witnessTables.size())};
2127+
}
2128+
20952129
// ==== End of Function metadata functions ---------------------------------------
20962130

20972131
SWIFT_CC(swift) SWIFT_RUNTIME_EXPORT

stdlib/public/runtime/Private.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,13 @@ class TypeReferenceOwnership {
5858
bool isStrong() const { return Data == 0; }
5959
};
6060

61+
/// A struct to return pointer and its size back to Swift
62+
/// as `(UnsafePointer<UInt8>, Int)`.
63+
struct BufferAndSize {
64+
const void *buffer;
65+
intptr_t length; // negative length means error.
66+
};
67+
6168
/// Type information consists of metadata and its ownership info,
6269
/// such information is used by `_typeByMangledName` accessor
6370
/// since we don't represent ownership attributes in the metadata

0 commit comments

Comments
 (0)