mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Swift Bridging: use C++ instead of C bridging for BridgedSuccessor
This commit is contained in:
@@ -143,19 +143,20 @@ public struct ArgumentArray : RandomAccessCollection {
|
||||
}
|
||||
|
||||
public struct SuccessorArray : RandomAccessCollection, FormattedLikeArray {
|
||||
private let succArray: BridgedArrayRef
|
||||
private let base: OptionalBridgedSuccessor
|
||||
public let count: Int
|
||||
|
||||
init(succArray: BridgedArrayRef) {
|
||||
self.succArray = succArray
|
||||
init(base: OptionalBridgedSuccessor, count: Int) {
|
||||
self.base = base
|
||||
self.count = count
|
||||
}
|
||||
|
||||
public var startIndex: Int { return 0 }
|
||||
public var endIndex: Int { return Int(succArray.numElements) }
|
||||
public var endIndex: Int { return count }
|
||||
|
||||
public subscript(_ index: Int) -> BasicBlock {
|
||||
assert(index >= 0 && index < endIndex)
|
||||
let s = BridgedSuccessor(succ: succArray.data! + index &* BridgedSuccessorSize);
|
||||
return SILSuccessor_getTargetBlock(s).block
|
||||
assert(index >= startIndex && index < endIndex)
|
||||
return base.advancedBy(index).getTargetBlock().block
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,10 +166,9 @@ public struct PredecessorList : CollectionLikeSequence, IteratorProtocol {
|
||||
public init(startAt: OptionalBridgedSuccessor) { currentSucc = startAt }
|
||||
|
||||
public mutating func next() -> BasicBlock? {
|
||||
if let succPtr = currentSucc.succ {
|
||||
let succ = BridgedSuccessor(succ: succPtr)
|
||||
currentSucc = SILSuccessor_getNext(succ)
|
||||
return SILSuccessor_getContainingInst(succ).instruction.parentBlock
|
||||
if let succ = currentSucc.successor {
|
||||
currentSucc = succ.getNext()
|
||||
return succ.getContainingInst().instruction.parentBlock
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -196,3 +196,12 @@ extension Optional where Wrapped == BasicBlock {
|
||||
OptionalBridgedBasicBlock(obj: self?.bridged.obj)
|
||||
}
|
||||
}
|
||||
|
||||
extension OptionalBridgedSuccessor {
|
||||
var successor: BridgedSuccessor? {
|
||||
if let succ = succ {
|
||||
return BridgedSuccessor(succ: succ)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user