1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
import WIT
struct StaticCanonicalLoading: CanonicalLoading {
typealias Operand = StaticMetaOperand
typealias Pointer = StaticMetaPointer
let printer: SourcePrinter
let builder: SwiftFunctionBuilder
private func loadByteSwappable(at pointer: Pointer, type: String) -> Operand {
let boundPointer = "\(pointer).assumingMemoryBound(to: \(type).self)"
let loadedVar = builder.variable("loaded")
printer.write(line: "let \(loadedVar) = \(boundPointer).pointee")
return .variable(loadedVar)
}
private func loadUInt(at pointer: Pointer, bitWidth: Int) -> Operand {
return loadByteSwappable(at: pointer, type: "UInt\(bitWidth)")
}
private func loadInt(at pointer: Pointer, bitWidth: Int) -> Operand {
let bitPattern = loadUInt(at: pointer, bitWidth: bitWidth)
return .call("Int\(bitWidth)", arguments: [("bitPattern", bitPattern)])
}
private func loadFloat(at pointer: Pointer, bitWidth: Int) -> Operand {
let bitPattern = loadUInt(at: pointer, bitWidth: bitWidth)
return .call("Float\(bitWidth)", arguments: [("bitPattern", bitPattern)])
}
func loadUInt8(at pointer: Pointer) -> Operand {
loadUInt(at: pointer, bitWidth: 8)
}
func loadUInt16(at pointer: Pointer) -> Operand {
loadUInt(at: pointer, bitWidth: 16)
}
func loadUInt32(at pointer: Pointer) -> Operand {
loadUInt(at: pointer, bitWidth: 32)
}
func loadUInt64(at pointer: Pointer) -> Operand {
loadUInt(at: pointer, bitWidth: 64)
}
func loadInt8(at pointer: Pointer) -> Operand {
loadInt(at: pointer, bitWidth: 8)
}
func loadInt16(at pointer: Pointer) -> Operand {
loadInt(at: pointer, bitWidth: 16)
}
func loadInt32(at pointer: Pointer) -> Operand {
loadInt(at: pointer, bitWidth: 32)
}
func loadInt64(at pointer: Pointer) -> Operand {
loadInt(at: pointer, bitWidth: 64)
}
func loadFloat32(at pointer: Pointer) -> Operand {
loadFloat(at: pointer, bitWidth: 32)
}
func loadFloat64(at pointer: Pointer) -> Operand {
loadFloat(at: pointer, bitWidth: 64)
}
}
|