THRIFT-401. rb: Speed up FramedTransport

Author: Tyler Kovacs

git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@758510 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/rb/lib/thrift/transport.rb b/lib/rb/lib/thrift/transport.rb
index 503c6dd..4aa50d0 100644
--- a/lib/rb/lib/thrift/transport.rb
+++ b/lib/rb/lib/thrift/transport.rb
@@ -91,6 +91,7 @@
       @transport = transport
       @wbuf = ''
       @rbuf = ''
+      @index = 0
     end
 
     def open?
@@ -107,13 +108,16 @@
     end
 
     def read(sz)
-      ret = @rbuf.slice!(0...sz) 
+      @index += sz
+      ret = @rbuf.slice(@index - sz, sz) || ''
+
       if ret.length == 0
-        @rbuf = @transport.read([sz, DEFAULT_BUFFER].max) 
-        @rbuf.slice!(0...sz) 
-      else 
-        ret 
+        @rbuf = @transport.read([sz, DEFAULT_BUFFER].max)
+        @index = sz
+        ret = @rbuf.slice(0, sz) || ''
       end
+
+      ret
     end
 
     def write(buf)
@@ -143,6 +147,7 @@
       @wbuf      = ''
       @read      = read
       @write     = write
+      @index      = 0
     end
 
     def open?
@@ -162,9 +167,10 @@
 
       return '' if sz <= 0
 
-      read_frame if @rbuf.empty?
+      read_frame if @index >= @rbuf.length
 
-      @rbuf.slice!(0, sz)
+      @index += sz
+      @rbuf.slice(@index - sz, sz) || ''
     end
 
     def write(buf,sz=nil)
@@ -192,7 +198,8 @@
     def read_frame
       sz = @transport.read_all(4).unpack('N').first
 
-      @rbuf = @transport.read_all(sz).dup # protect against later #slice!
+      @index = 0
+      @rbuf = @transport.read_all(sz)
     end
   end