@@ -30,6 +30,11 @@ import Swift
3030 typealias Address = UInt64
3131 typealias Size = UInt64
3232
33+ /// Fill the specified buffer with data from the specified location in
34+ /// the source.
35+ func fetch( from address: Address ,
36+ into buffer: UnsafeMutableRawBufferPointer ) throws
37+
3338 /// Fill the specified buffer with data from the specified location in
3439 /// the source.
3540 func fetch< T> ( from address: Address ,
@@ -51,6 +56,11 @@ import Swift
5156
5257extension MemoryReader {
5358
59+ public func fetch< T> ( from address: Address ,
60+ into buffer: UnsafeMutableBufferPointer < T > ) throws {
61+ try fetch ( from: address, into: UnsafeMutableRawBufferPointer ( buffer) )
62+ }
63+
5464 public func fetch< T> ( from addr: Address ,
5565 into pointer: UnsafeMutablePointer < T > ) throws {
5666 try fetch ( from: addr,
@@ -96,10 +106,12 @@ extension MemoryReader {
96106@_spi ( MemoryReaders) public struct UnsafeLocalMemoryReader : MemoryReader {
97107 public init ( ) { }
98108
99- public func fetch< T> ( from address: Address ,
100- into buffer: UnsafeMutableBufferPointer < T > ) throws {
101- buffer. baseAddress!. update ( from: UnsafePointer < T > ( bitPattern: UInt ( address) ) !,
102- count: buffer. count)
109+ public func fetch( from address: Address ,
110+ into buffer: UnsafeMutableRawBufferPointer ) throws {
111+ buffer. baseAddress!. copyMemory (
112+ from: UnsafeRawPointer ( bitPattern: UInt ( address) ) !,
113+ byteCount: buffer. count
114+ )
103115 }
104116}
105117
@@ -116,9 +128,9 @@ extension MemoryReader {
116128 self . task = task as! task_t
117129 }
118130
119- public func fetch< T > ( from address: Address ,
120- into buffer: UnsafeMutableBufferPointer < T > ) throws {
121- let size = UInt64 ( MemoryLayout < T > . stride * buffer. count)
131+ public func fetch( from address: Address ,
132+ into buffer: UnsafeMutableRawBufferPointer ) throws {
133+ let size = buffer. count
122134 var sizeOut = UInt64 ( 0 )
123135 let result = mach_vm_read_overwrite ( task,
124136 UInt64 ( address) ,
@@ -138,8 +150,8 @@ extension MemoryReader {
138150 public typealias Address = UInt64
139151 public typealias Size = UInt64
140152
141- public func fetch< T > ( from address: Address ,
142- into buffer: UnsafeMutableBufferPointer < T > ) throws {
153+ public func fetch( from address: Address ,
154+ into buffer: UnsafeMutableRawBufferPointer ) throws {
143155 let reader = RemoteMemoryReader ( task: mach_task_self ( ) )
144156 return try reader. fetch ( from: address, into: buffer)
145157 }
@@ -221,34 +233,31 @@ extension MemoryReader {
221233 return response
222234 }
223235
224- public func fetch< T> ( from addr: Address ,
225- into buffer: UnsafeMutableBufferPointer < T > ) throws {
226- try buffer. withMemoryRebound ( to: UInt8 . self) {
227- let bytes = UnsafeMutableRawBufferPointer ( $0)
228- try sendRequest ( for: Size ( bytes. count) , from: addr)
236+ public func fetch( from addr: Address ,
237+ into buffer: UnsafeMutableRawBufferPointer ) throws {
238+ try sendRequest ( for: Size ( buffer. count) , from: addr)
229239
230- var done = 0
231- while done < bytes. count {
232- let reply = try receiveReply ( )
233-
234- if reply. len < 0 {
235- throw MemserverError ( message: " Unreadable at \( hex ( addr) ) " )
236- }
240+ var done = 0
241+ while done < buffer. count {
242+ let reply = try receiveReply ( )
237243
238- if done + Int ( reply. len) > bytes . count {
239- throw MemserverError ( message: " Overrun at \( hex ( addr) ) trying to read \( bytes . count ) bytes " )
240- }
244+ if reply. len < 0 {
245+ throw MemserverError ( message: " Unreadable at \( hex ( addr) ) " )
246+ }
241247
242- let ret = try safeRead ( fd ,
243- UnsafeMutableRawBufferPointer (
244- rebasing : bytes [ done ..< done + Int ( reply . len ) ] ) )
248+ if done + Int ( reply . len ) > bytes . count {
249+ throw MemserverError ( message : " Overrun at \( hex ( addr ) ) trying to read \( bytes . count ) bytes " )
250+ }
245251
246- if ret != reply . len {
247- throw MemserverError ( message : " Channel closed prematurely " )
248- }
252+ let ret = try safeRead ( fd ,
253+ UnsafeMutableRawBufferPointer (
254+ rebasing : buffer [ done ..< done + Int ( reply . len ) ] ) )
249255
250- done += Int ( reply. len)
256+ if ret != reply. len {
257+ throw MemserverError ( message: " Channel closed prematurely " )
251258 }
259+
260+ done += Int ( reply. len)
252261 }
253262 }
254263}
@@ -260,9 +269,9 @@ extension MemoryReader {
260269 self . pid = pid as! pid_t
261270 }
262271
263- public func fetch< T > ( from address: Address ,
264- into buffer: UnsafeMutableBufferPointer < T > ) throws {
265- let size = size_t ( MemoryLayout < T > . stride * buffer. count)
272+ public func fetch( from address: Address ,
273+ into buffer: UnsafeMutableRawBufferPointer ) throws {
274+ let size = buffer. count
266275 var fromIOVec = iovec ( iov_base: UnsafeMutableRawPointer (
267276 bitPattern: UInt ( address) ) ,
268277 iov_len: size)
@@ -281,8 +290,8 @@ extension MemoryReader {
281290 reader = RemoteMemoryReader ( pid: getpid ( ) )
282291 }
283292
284- public func fetch< T > ( from address: Address ,
285- into buffer: UnsafeMutableBufferPointer < T > ) throws {
293+ public func fetch( from address: Address ,
294+ into buffer: UnsafeMutableRawBufferPointer ) throws {
286295 return try reader. fetch ( from: address, into: buffer)
287296 }
288297}
0 commit comments