From b0cb2bb41e76c4c3bfedd87f49e5ff70e9b830e2 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 4 Dec 2015 22:49:29 +0000 Subject: rely on optimized case dispatch Ruby-trunk (as of r52931) optimizes case dispatch for additional immediate values such as `nil', `true', and `false'. Rearrange our case statements (and take away some safety-checks :x) to take advantage of these optimizations in ruby-trunk. ref: https://bugs.ruby-lang.org/issues/11769 http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/71818 http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/71825 --- lib/yahns/http_client.rb | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) (limited to 'lib/yahns/http_client.rb') diff --git a/lib/yahns/http_client.rb b/lib/yahns/http_client.rb index db53587..117300e 100644 --- a/lib/yahns/http_client.rb +++ b/lib/yahns/http_client.rb @@ -28,15 +28,13 @@ class Yahns::HttpClient < Kgio::Socket # :nodoc: when :ignore # :ignore on hijack @state = :ignore return :ignore - when Yahns::StreamFile - @state = rv # continue looping when true, false # done return http_response_done(rv) when :ccc_done, :r100_done @state = rv return :wait_writable - else - raise "BUG: #{@state.inspect}#wbuf_flush returned #{rv.inspect}" + else # Yahns::StreamFile + @state = rv # continue looping end while true end @@ -79,14 +77,14 @@ class Yahns::HttpClient < Kgio::Socket # :nodoc: # returns :wait_readable/wait_writable/nil to yield back to epoll def fill_body(rsize, rbuf) case rv = kgio_tryread(rsize, rbuf) - when String - @hs.filter_body(rbuf, @hs.buf << rbuf) - @input.write(rbuf) - true # keep looping on kgio_tryread (but check body_eof? first) when :wait_readable, :wait_writable rv # have epoll/kqueue wait for more when nil # unexpected EOF @input.close # nil + else # String + @hs.filter_body(rbuf, @hs.buf << rbuf) + @input.write(rbuf) + true # keep looping on kgio_tryread (but check body_eof? first) end end @@ -94,16 +92,16 @@ class Yahns::HttpClient < Kgio::Socket # :nodoc: # returns :wait_readable/wait_writable/nil to yield back to epoll def read_trailers(rsize, rbuf) case rv = kgio_tryread(rsize, rbuf) - when String + when :wait_readable, :wait_writable + return rv # wait for more + when nil # unexpected EOF + return @input.close # nil + else # String if @hs.add_parse(rbuf) @input.rewind return true end # keep looping on kgio_tryread... - when :wait_readable, :wait_writable - return rv # wait for more - when nil # unexpected EOF - return @input.close # nil end while true end @@ -132,7 +130,9 @@ class Yahns::HttpClient < Kgio::Socket # :nodoc: # continue to outer loop when :headers case rv = kgio_tryread(k.client_header_buffer_size, rbuf) - when String + when :wait_readable, :wait_writable, nil + return rv + else # String if @hs.add_parse(rv) case input = input_ready when :wait_readable, :wait_writable, :close then return input @@ -142,8 +142,6 @@ class Yahns::HttpClient < Kgio::Socket # :nodoc: end end # keep looping on kgio_tryread - when :wait_readable, :wait_writable, nil - return rv end while true when :body if @hs.body_eof? @@ -234,12 +232,12 @@ class Yahns::HttpClient < Kgio::Socket # :nodoc: # used by StreamInput (and thus TeeInput) for input_buffering {false|:lazy} def yahns_read(bytes, buf) case rv = kgio_tryread(bytes, buf) - when String, nil - return rv when :wait_readable kgio_wait_readable or raise Yahns::ClientTimeout, "waiting for read", [] when :wait_writable kgio_wait_writable or raise Yahns::ClientTimeout, "waiting for write", [] + else # String, nil + return rv end while true end -- cgit v1.2.3-24-ge0c7