mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Use the `%target-swift-5.X-abi-triple` substitutions to compile the tests for deployment to the minimum OS versions required for the APIs used in the tests, instead of disabling availability checking.
130 lines
4.5 KiB
Swift
130 lines
4.5 KiB
Swift
// RUN: %empty-directory(%t)
|
|
// RUN: %target-swift-frontend-emit-module -emit-module-path %t/FakeDistributedActorSystems.swiftmodule -module-name FakeDistributedActorSystems -target %target-swift-5.7-abi-triple %S/../Inputs/FakeDistributedActorSystems.swift
|
|
// RUN: %target-build-swift -module-name main -target %target-swift-5.7-abi-triple -j2 -parse-as-library -I %t %s %S/../Inputs/FakeDistributedActorSystems.swift -o %t/a.out
|
|
// RUN: %target-codesign %t/a.out
|
|
// RUN: %target-run %t/a.out | %FileCheck %s
|
|
|
|
// REQUIRES: executable_test
|
|
// REQUIRES: concurrency
|
|
// REQUIRES: distributed
|
|
|
|
// rdar://76038845
|
|
// UNSUPPORTED: use_os_stdlib
|
|
// UNSUPPORTED: back_deployment_runtime
|
|
|
|
import Distributed
|
|
|
|
struct SomeValue: Sendable, Codable {}
|
|
|
|
distributed actor Worker {
|
|
distributed func empty() { }
|
|
distributed func one(s: String) -> Int { 1337 }
|
|
distributed func two(s: String, i: Int) -> Int { 1337 }
|
|
distributed func three(s: String, i: Int, sv: SomeValue) -> Int { 1337 }
|
|
distributed func hello(name: String) -> String { name }
|
|
}
|
|
|
|
typealias DefaultDistributedActorSystem = FakeActorSystem
|
|
|
|
// ==== Execute ----------------------------------------------------------------
|
|
|
|
@main struct Main {
|
|
static let empty = "$s14SomeModuleName6WorkerC5emptyyyF"
|
|
static let one = "$s14SomeModuleName6WorkerC3one1sSiSS_tF"
|
|
static let two = "$s14SomeModuleName6WorkerC3two1s1iSiSS_SitF"
|
|
|
|
static func test_count() {
|
|
print("~~ \(#function)")
|
|
// CHECK: _getParameterCount: empty() = 0
|
|
print("_getParameterCount: empty() = \(_getParameterCount(mangledMethodName: empty))")
|
|
// CHECK: _getParameterCount: one(s:) = 1
|
|
print("_getParameterCount: one(s:) = \(_getParameterCount(mangledMethodName: one))")
|
|
// CHECK: _getParameterCount: two(s:i:) = 2
|
|
print("_getParameterCount: two(s:i:) = \(_getParameterCount(mangledMethodName: two))")
|
|
}
|
|
|
|
static func test_returnType() {
|
|
print("~~ \(#function)")
|
|
// CHECK: _getReturnTypeInfo: empty() = ()
|
|
print("_getReturnTypeInfo: empty() = \(String(reflecting: _getReturnTypeInfo(mangledMethodName: empty, genericEnv: nil, genericArguments: nil)!))")
|
|
|
|
// CHECK: _getReturnTypeInfo: one(s:) = Swift.Int
|
|
print("_getReturnTypeInfo: one(s:) = \(String(reflecting: _getReturnTypeInfo(mangledMethodName: one, genericEnv: nil, genericArguments: nil)!))")
|
|
}
|
|
|
|
static func test_paramTypes() {
|
|
print("~~ \(#function)")
|
|
// CHECK: _withParameterTypeInfo: empty() = []
|
|
_withParameterTypeInfo(mangledMethodName: empty) { params in
|
|
print("_withParameterTypeInfo: empty() = \(params)")
|
|
}
|
|
|
|
// CHECK: _withParameterTypeInfo: one(s:) = [Swift.String]
|
|
_withParameterTypeInfo(mangledMethodName: one) { params in
|
|
print("_withParameterTypeInfo: one(s:) = \(params)")
|
|
}
|
|
|
|
// CHECK: _withParameterTypeInfo: two(s:i:) = [Swift.String, Swift.Int]
|
|
_withParameterTypeInfo(mangledMethodName: two) { params in
|
|
print("_withParameterTypeInfo: two(s:i:) = \(params)")
|
|
}
|
|
}
|
|
|
|
static func main() {
|
|
test_count()
|
|
test_returnType()
|
|
test_paramTypes()
|
|
|
|
// CHECK: done
|
|
print("done")
|
|
}
|
|
}
|
|
|
|
func _withParameterTypeInfo(
|
|
mangledMethodName name: String,
|
|
body: ([Any.Type]) -> ()
|
|
) {
|
|
let nameUTF8 = Array(name.utf8)
|
|
|
|
return nameUTF8.withUnsafeBufferPointer { nameUTF8 in
|
|
// 1) demangle to get the expected parameter count of the func
|
|
let paramCount = __getParameterCount(nameUTF8.baseAddress!, UInt(nameUTF8.endIndex))
|
|
|
|
guard paramCount > 0 else {
|
|
body([])
|
|
return
|
|
}
|
|
|
|
// prepare buffer for the parameter types to be decoded into:
|
|
let infoBuffer = UnsafeMutableRawBufferPointer
|
|
.allocate(byteCount: MemoryLayout<Any.Type>.size * Int(paramCount),
|
|
alignment: MemoryLayout<Any.Type>.alignment) // TODO: is this right always?
|
|
defer {
|
|
infoBuffer.deallocate()
|
|
}
|
|
|
|
// 2) demangle and write all parameter types into the prepared buffer
|
|
let decodedNum = __getParameterTypeInfo(
|
|
nameUTF8.baseAddress!, UInt(nameUTF8.endIndex),
|
|
/*genericEnvironment=*/nil,
|
|
/*genericArguments=*/nil,
|
|
infoBuffer.baseAddress!._rawValue, Int(paramCount))
|
|
|
|
// if we failed demangling the types, return an empty array
|
|
guard decodedNum >= 0 else {
|
|
body([])
|
|
return
|
|
}
|
|
|
|
// copy the types from the buffer into a Swift Array
|
|
var types: [Any.Type] = []
|
|
types.reserveCapacity(Int(decodedNum))
|
|
for i in infoBuffer.bindMemory(to: Any.Type.self) {
|
|
types.append(i)
|
|
}
|
|
|
|
body(types)
|
|
return
|
|
}
|
|
}
|