Swift Bridging: use C++ instead of C bridging for BridgedSuccessor

This commit is contained in:
Erik Eckstein
2023-03-16 08:23:25 +01:00
parent eecea088e7
commit fc2ad09d4b
4 changed files with 64 additions and 48 deletions

View File

@@ -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
}
}