@@ -265,37 +265,53 @@ def io_write(fiber, io, buffer, length, offset = 0)
265265 return total
266266 end
267267
268- private def buffer_read ( io , buffer , offset )
269- if RUBY_ENGINE == "jruby"
268+ unless IO :: Buffer . method_defined? ( :read ) and IO :: Buffer . method_defined? ( :write )
269+ private def buffer_read ( io , buffer , offset )
270270 string = io . read_nonblock ( buffer . size - offset )
271271 buffer . set_string ( string , offset )
272272 return string . bytesize
273- else
274- Fiber . blocking { buffer . read ( io , 0 , offset ) }
273+ rescue EOFError
274+ return 0
275+ rescue IOError
276+ return -Errno ::EBADF ::Errno
277+ rescue IO ::WaitReadable
278+ return EAGAIN
279+ rescue SystemCallError => error
280+ return -error . errno
275281 end
276- rescue EOFError
277- return 0
278- rescue IOError
279- return -Errno ::EBADF ::Errno
280- rescue IO ::WaitReadable
281- return EAGAIN
282- rescue SystemCallError => error
283- return -error . errno
284- end
285-
286- private def buffer_write ( io , buffer , offset )
287- if RUBY_ENGINE == "jruby"
282+
283+ private def buffer_write ( io , buffer , offset )
288284 string = buffer . get_string ( offset , buffer . size - offset )
289285 return io . write_nonblock ( string )
290- else
286+ rescue IO ::WaitWritable
287+ return EAGAIN
288+ rescue IOError
289+ return -Errno ::EBADF ::Errno
290+ rescue SystemCallError => error
291+ return -error . errno
292+ end
293+ else
294+ private def buffer_read ( io , buffer , offset )
295+ Fiber . blocking { buffer . read ( io , 0 , offset ) }
296+ rescue EOFError
297+ return 0
298+ rescue IOError
299+ return -Errno ::EBADF ::Errno
300+ rescue IO ::WaitReadable
301+ return EAGAIN
302+ rescue SystemCallError => error
303+ return -error . errno
304+ end
305+
306+ private def buffer_write ( io , buffer , offset )
291307 Fiber . blocking { buffer . write ( io , 0 , offset ) }
308+ rescue IO ::WaitWritable
309+ return EAGAIN
310+ rescue IOError
311+ return -Errno ::EBADF ::Errno
312+ rescue SystemCallError => error
313+ return -error . errno
292314 end
293- rescue IO ::WaitWritable
294- return EAGAIN
295- rescue IOError
296- return -Errno ::EBADF ::Errno
297- rescue SystemCallError => error
298- return -error . errno
299315 end
300316
301317 # Wait for a process to change state.
0 commit comments