thrift 0.8.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
 - data/{README → README.md} +0 -0
 - data/ext/binary_protocol_accelerated.c +33 -14
 - data/ext/bytes.c +36 -0
 - data/ext/bytes.h +31 -0
 - data/ext/compact_protocol.c +27 -8
 - data/ext/constants.h +8 -5
 - data/ext/extconf.rb +5 -1
 - data/ext/memory_buffer.c +12 -9
 - data/ext/protocol.c +0 -185
 - data/ext/protocol.h +0 -20
 - data/ext/strlcpy.h +7 -3
 - data/ext/struct.c +27 -7
 - data/ext/thrift_native.c +16 -11
 - data/lib/thrift.rb +10 -4
 - data/lib/thrift/bytes.rb +131 -0
 - data/lib/thrift/client.rb +13 -4
 - data/lib/thrift/exceptions.rb +3 -0
 - data/lib/thrift/multiplexed_processor.rb +76 -0
 - data/lib/thrift/processor.rb +24 -6
 - data/lib/thrift/protocol/base_protocol.rb +109 -12
 - data/lib/thrift/protocol/binary_protocol.rb +22 -7
 - data/lib/thrift/protocol/binary_protocol_accelerated.rb +8 -0
 - data/lib/thrift/protocol/compact_protocol.rb +23 -6
 - data/lib/thrift/protocol/json_protocol.rb +786 -0
 - data/lib/thrift/protocol/multiplexed_protocol.rb +44 -0
 - data/lib/thrift/protocol/protocol_decorator.rb +194 -0
 - data/lib/thrift/server/base_server.rb +8 -2
 - data/lib/thrift/server/mongrel_http_server.rb +2 -0
 - data/lib/thrift/server/simple_server.rb +5 -1
 - data/lib/thrift/server/thin_http_server.rb +91 -0
 - data/lib/thrift/server/thread_pool_server.rb +5 -1
 - data/lib/thrift/server/threaded_server.rb +5 -1
 - data/lib/thrift/struct.rb +1 -1
 - data/lib/thrift/struct_union.rb +2 -2
 - data/lib/thrift/transport/base_server_transport.rb +1 -1
 - data/lib/thrift/transport/base_transport.rb +30 -20
 - data/lib/thrift/transport/buffered_transport.rb +25 -11
 - data/lib/thrift/transport/framed_transport.rb +20 -11
 - data/lib/thrift/transport/http_client_transport.rb +16 -6
 - data/lib/thrift/transport/io_stream_transport.rb +5 -2
 - data/lib/thrift/transport/memory_buffer_transport.rb +10 -6
 - data/lib/thrift/transport/server_socket.rb +6 -1
 - data/lib/thrift/transport/socket.rb +23 -17
 - data/lib/thrift/transport/ssl_server_socket.rb +41 -0
 - data/lib/thrift/transport/ssl_socket.rb +51 -0
 - data/lib/thrift/transport/unix_server_socket.rb +5 -1
 - data/lib/thrift/transport/unix_socket.rb +5 -1
 - data/lib/thrift/union.rb +3 -6
 - data/spec/BaseService.thrift +27 -0
 - data/spec/ExtendedService.thrift +25 -0
 - data/spec/Referenced.thrift +44 -0
 - data/spec/ThriftNamespacedSpec.thrift +53 -0
 - data/spec/ThriftSpec.thrift +52 -1
 - data/spec/base_protocol_spec.rb +158 -93
 - data/spec/base_transport_spec.rb +194 -157
 - data/spec/binary_protocol_accelerated_spec.rb +14 -14
 - data/spec/binary_protocol_spec.rb +29 -16
 - data/spec/binary_protocol_spec_shared.rb +148 -65
 - data/spec/bytes_spec.rb +160 -0
 - data/spec/client_spec.rb +45 -47
 - data/spec/compact_protocol_spec.rb +36 -22
 - data/spec/exception_spec.rb +79 -80
 - data/spec/flat_spec.rb +62 -0
 - data/spec/http_client_spec.rb +91 -16
 - data/spec/json_protocol_spec.rb +552 -0
 - data/spec/namespaced_spec.rb +67 -0
 - data/spec/nonblocking_server_spec.rb +26 -28
 - data/spec/processor_spec.rb +29 -32
 - data/spec/serializer_spec.rb +31 -33
 - data/spec/server_socket_spec.rb +32 -28
 - data/spec/server_spec.rb +112 -84
 - data/spec/socket_spec.rb +27 -20
 - data/spec/socket_spec_shared.rb +32 -32
 - data/spec/spec_helper.rb +17 -11
 - data/spec/ssl_server_socket_spec.rb +34 -0
 - data/spec/ssl_socket_spec.rb +78 -0
 - data/spec/struct_nested_containers_spec.rb +191 -0
 - data/spec/struct_spec.rb +159 -161
 - data/spec/thin_http_server_spec.rb +141 -0
 - data/spec/types_spec.rb +71 -69
 - data/spec/union_spec.rb +97 -76
 - data/spec/unix_socket_spec.rb +49 -41
 - metadata +268 -188
 - data/CHANGELOG +0 -1
 - data/benchmark/gen-rb/benchmark_constants.rb +0 -10
 - data/benchmark/gen-rb/benchmark_service.rb +0 -80
 - data/benchmark/gen-rb/benchmark_types.rb +0 -9
 - data/spec/gen-rb/nonblocking_service.rb +0 -272
 - data/spec/gen-rb/thrift_spec_constants.rb +0 -10
 - data/spec/gen-rb/thrift_spec_types.rb +0 -345
 - data/spec/mongrel_http_server_spec.rb +0 -117
 - data/test/debug_proto/gen-rb/debug_proto_test_constants.rb +0 -273
 - data/test/debug_proto/gen-rb/debug_proto_test_types.rb +0 -760
 - data/test/debug_proto/gen-rb/empty_service.rb +0 -24
 - data/test/debug_proto/gen-rb/inherited.rb +0 -79
 - data/test/debug_proto/gen-rb/reverse_order_service.rb +0 -82
 - data/test/debug_proto/gen-rb/service_for_exception_with_a_map.rb +0 -81
 - data/test/debug_proto/gen-rb/srv.rb +0 -330
 
    
        checksums.yaml
    ADDED
    
    | 
         @@ -0,0 +1,7 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            SHA256:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 6c894aeced9c6d4f7f4e66441472dbe37603b45722cffe89007e6faa1d2771c8
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 3417f5e29c4459b18933e1a6c2eb6575ce0b8c6c073bac4836043742854a8c01
         
     | 
| 
      
 5 
     | 
    
         
            +
            SHA512:
         
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 4daf374c7752cfd11fb60fa7f1a5323f026bacbff118987f7e4342bfc79e9da8cc80e2872ddf571e2b705a310fe7921bc0c011215ec5f222cee252e0ec9a513f
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 4712fd01cd41fde2877df76808af17ce303656c3a003dcda92c876766aba508cdaf802511e3698ce5f4476064a435057e47493f05a2e4f928c67e16ec7554562
         
     | 
    
        data/{README → README.md}
    RENAMED
    
    | 
         
            File without changes
         
     | 
| 
         @@ -22,7 +22,8 @@ 
     | 
|
| 
       22 
22 
     | 
    
         
             
            #include <stdint.h>
         
     | 
| 
       23 
23 
     | 
    
         
             
            #include <constants.h>
         
     | 
| 
       24 
24 
     | 
    
         
             
            #include <struct.h>
         
     | 
| 
       25 
     | 
    
         
            -
            #include  
     | 
| 
      
 25 
     | 
    
         
            +
            #include <macros.h>
         
     | 
| 
      
 26 
     | 
    
         
            +
            #include <bytes.h>
         
     | 
| 
       26 
27 
     | 
    
         | 
| 
       27 
28 
     | 
    
         
             
            VALUE rb_thrift_binary_proto_native_qmark(VALUE self) {
         
     | 
| 
       28 
29 
     | 
    
         
             
              return Qtrue;
         
     | 
| 
         @@ -78,8 +79,9 @@ static void write_i64_direct(VALUE trans, int64_t value) { 
     | 
|
| 
       78 
79 
     | 
    
         | 
| 
       79 
80 
     | 
    
         
             
            static void write_string_direct(VALUE trans, VALUE str) {
         
     | 
| 
       80 
81 
     | 
    
         
             
              if (TYPE(str) != T_STRING) {
         
     | 
| 
       81 
     | 
    
         
            -
                rb_raise(rb_eStandardError, "Value should be a string"); 
     | 
| 
      
 82 
     | 
    
         
            +
                rb_raise(rb_eStandardError, "Value should be a string");
         
     | 
| 
       82 
83 
     | 
    
         
             
              }
         
     | 
| 
      
 84 
     | 
    
         
            +
              str = convert_to_utf8_byte_buffer(str);
         
     | 
| 
       83 
85 
     | 
    
         
             
              write_i32_direct(trans, RSTRING_LEN(str));
         
     | 
| 
       84 
86 
     | 
    
         
             
              rb_funcall(trans, write_method_id, 1, str);
         
     | 
| 
       85 
87 
     | 
    
         
             
            }
         
     | 
| 
         @@ -217,11 +219,21 @@ VALUE rb_thrift_binary_proto_write_string(VALUE self, VALUE str) { 
     | 
|
| 
       217 
219 
     | 
    
         
             
              return Qnil;
         
     | 
| 
       218 
220 
     | 
    
         
             
            }
         
     | 
| 
       219 
221 
     | 
    
         | 
| 
      
 222 
     | 
    
         
            +
            VALUE rb_thrift_binary_proto_write_binary(VALUE self, VALUE buf) {
         
     | 
| 
      
 223 
     | 
    
         
            +
              CHECK_NIL(buf);
         
     | 
| 
      
 224 
     | 
    
         
            +
              VALUE trans = GET_TRANSPORT(self);
         
     | 
| 
      
 225 
     | 
    
         
            +
              buf = force_binary_encoding(buf);
         
     | 
| 
      
 226 
     | 
    
         
            +
              write_i32_direct(trans, RSTRING_LEN(buf));
         
     | 
| 
      
 227 
     | 
    
         
            +
              rb_funcall(trans, write_method_id, 1, buf);
         
     | 
| 
      
 228 
     | 
    
         
            +
              return Qnil;
         
     | 
| 
      
 229 
     | 
    
         
            +
            }
         
     | 
| 
      
 230 
     | 
    
         
            +
             
     | 
| 
       220 
231 
     | 
    
         
             
            //---------------------------------------
         
     | 
| 
       221 
232 
     | 
    
         
             
            // interface reading methods
         
     | 
| 
       222 
233 
     | 
    
         
             
            //---------------------------------------
         
     | 
| 
       223 
234 
     | 
    
         | 
| 
       224 
235 
     | 
    
         
             
            VALUE rb_thrift_binary_proto_read_string(VALUE self);
         
     | 
| 
      
 236 
     | 
    
         
            +
            VALUE rb_thrift_binary_proto_read_binary(VALUE self);
         
     | 
| 
       225 
237 
     | 
    
         
             
            VALUE rb_thrift_binary_proto_read_byte(VALUE self);
         
     | 
| 
       226 
238 
     | 
    
         
             
            VALUE rb_thrift_binary_proto_read_i32(VALUE self);
         
     | 
| 
       227 
239 
     | 
    
         
             
            VALUE rb_thrift_binary_proto_read_i16(VALUE self);
         
     | 
| 
         @@ -271,27 +283,27 @@ VALUE rb_thrift_binary_proto_read_message_end(VALUE self) { 
     | 
|
| 
       271 
283 
     | 
    
         
             
              return Qnil;
         
     | 
| 
       272 
284 
     | 
    
         
             
            }
         
     | 
| 
       273 
285 
     | 
    
         | 
| 
       274 
     | 
    
         
            -
            VALUE  
     | 
| 
      
 286 
     | 
    
         
            +
            VALUE rb_thrift_binary_proto_read_struct_begin(VALUE self) {
         
     | 
| 
       275 
287 
     | 
    
         
             
              return Qnil;
         
     | 
| 
       276 
288 
     | 
    
         
             
            }
         
     | 
| 
       277 
289 
     | 
    
         | 
| 
       278 
     | 
    
         
            -
            VALUE  
     | 
| 
      
 290 
     | 
    
         
            +
            VALUE rb_thrift_binary_proto_read_struct_end(VALUE self) {
         
     | 
| 
       279 
291 
     | 
    
         
             
              return Qnil;
         
     | 
| 
       280 
292 
     | 
    
         
             
            }
         
     | 
| 
       281 
293 
     | 
    
         | 
| 
       282 
     | 
    
         
            -
            VALUE  
     | 
| 
      
 294 
     | 
    
         
            +
            VALUE rb_thrift_binary_proto_read_field_end(VALUE self) {
         
     | 
| 
       283 
295 
     | 
    
         
             
              return Qnil;
         
     | 
| 
       284 
296 
     | 
    
         
             
            }
         
     | 
| 
       285 
297 
     | 
    
         | 
| 
       286 
     | 
    
         
            -
            VALUE  
     | 
| 
      
 298 
     | 
    
         
            +
            VALUE rb_thrift_binary_proto_read_map_end(VALUE self) {
         
     | 
| 
       287 
299 
     | 
    
         
             
              return Qnil;
         
     | 
| 
       288 
300 
     | 
    
         
             
            }
         
     | 
| 
       289 
301 
     | 
    
         | 
| 
       290 
     | 
    
         
            -
            VALUE  
     | 
| 
      
 302 
     | 
    
         
            +
            VALUE rb_thrift_binary_proto_read_list_end(VALUE self) {
         
     | 
| 
       291 
303 
     | 
    
         
             
              return Qnil;
         
     | 
| 
       292 
304 
     | 
    
         
             
            }
         
     | 
| 
       293 
305 
     | 
    
         | 
| 
       294 
     | 
    
         
            -
            VALUE  
     | 
| 
      
 306 
     | 
    
         
            +
            VALUE rb_thrift_binary_proto_read_set_end(VALUE self) {
         
     | 
| 
       295 
307 
     | 
    
         
             
              return Qnil;
         
     | 
| 
       296 
308 
     | 
    
         
             
            }
         
     | 
| 
       297 
309 
     | 
    
         | 
| 
         @@ -379,6 +391,11 @@ VALUE rb_thrift_binary_proto_read_double(VALUE self) { 
     | 
|
| 
       379 
391 
     | 
    
         
             
            }
         
     | 
| 
       380 
392 
     | 
    
         | 
| 
       381 
393 
     | 
    
         
             
            VALUE rb_thrift_binary_proto_read_string(VALUE self) {
         
     | 
| 
      
 394 
     | 
    
         
            +
              VALUE buffer = rb_thrift_binary_proto_read_binary(self);
         
     | 
| 
      
 395 
     | 
    
         
            +
              return convert_to_string(buffer);
         
     | 
| 
      
 396 
     | 
    
         
            +
            }
         
     | 
| 
      
 397 
     | 
    
         
            +
             
     | 
| 
      
 398 
     | 
    
         
            +
            VALUE rb_thrift_binary_proto_read_binary(VALUE self) {
         
     | 
| 
       382 
399 
     | 
    
         
             
              int size = read_i32_direct(self);
         
     | 
| 
       383 
400 
     | 
    
         
             
              return READ(self, size);
         
     | 
| 
       384 
401 
     | 
    
         
             
            }
         
     | 
| 
         @@ -407,6 +424,7 @@ void Init_binary_protocol_accelerated() { 
     | 
|
| 
       407 
424 
     | 
    
         
             
              rb_define_method(bpa_class, "write_i64",           rb_thrift_binary_proto_write_i64, 1);
         
     | 
| 
       408 
425 
     | 
    
         
             
              rb_define_method(bpa_class, "write_double",        rb_thrift_binary_proto_write_double, 1);
         
     | 
| 
       409 
426 
     | 
    
         
             
              rb_define_method(bpa_class, "write_string",        rb_thrift_binary_proto_write_string, 1);
         
     | 
| 
      
 427 
     | 
    
         
            +
              rb_define_method(bpa_class, "write_binary",        rb_thrift_binary_proto_write_binary, 1);
         
     | 
| 
       410 
428 
     | 
    
         
             
              // unused methods
         
     | 
| 
       411 
429 
     | 
    
         
             
              rb_define_method(bpa_class, "write_message_end", rb_thrift_binary_proto_write_message_end, 0);
         
     | 
| 
       412 
430 
     | 
    
         
             
              rb_define_method(bpa_class, "write_struct_begin", rb_thrift_binary_proto_write_struct_begin, 1);
         
     | 
| 
         @@ -428,14 +446,15 @@ void Init_binary_protocol_accelerated() { 
     | 
|
| 
       428 
446 
     | 
    
         
             
              rb_define_method(bpa_class, "read_i64",            rb_thrift_binary_proto_read_i64, 0);
         
     | 
| 
       429 
447 
     | 
    
         
             
              rb_define_method(bpa_class, "read_double",         rb_thrift_binary_proto_read_double, 0);
         
     | 
| 
       430 
448 
     | 
    
         
             
              rb_define_method(bpa_class, "read_string",         rb_thrift_binary_proto_read_string, 0);
         
     | 
| 
      
 449 
     | 
    
         
            +
              rb_define_method(bpa_class, "read_binary",         rb_thrift_binary_proto_read_binary, 0);
         
     | 
| 
       431 
450 
     | 
    
         
             
              // unused methods
         
     | 
| 
       432 
451 
     | 
    
         
             
              rb_define_method(bpa_class, "read_message_end", rb_thrift_binary_proto_read_message_end, 0);
         
     | 
| 
       433 
     | 
    
         
            -
              rb_define_method(bpa_class, "read_struct_begin",  
     | 
| 
       434 
     | 
    
         
            -
              rb_define_method(bpa_class, "read_struct_end",  
     | 
| 
       435 
     | 
    
         
            -
              rb_define_method(bpa_class, "read_field_end",  
     | 
| 
       436 
     | 
    
         
            -
              rb_define_method(bpa_class, "read_map_end",  
     | 
| 
       437 
     | 
    
         
            -
              rb_define_method(bpa_class, "read_list_end",  
     | 
| 
       438 
     | 
    
         
            -
              rb_define_method(bpa_class, "read_set_end",  
     | 
| 
      
 452 
     | 
    
         
            +
              rb_define_method(bpa_class, "read_struct_begin", rb_thrift_binary_proto_read_struct_begin, 0);
         
     | 
| 
      
 453 
     | 
    
         
            +
              rb_define_method(bpa_class, "read_struct_end", rb_thrift_binary_proto_read_struct_end, 0);
         
     | 
| 
      
 454 
     | 
    
         
            +
              rb_define_method(bpa_class, "read_field_end", rb_thrift_binary_proto_read_field_end, 0);
         
     | 
| 
      
 455 
     | 
    
         
            +
              rb_define_method(bpa_class, "read_map_end", rb_thrift_binary_proto_read_map_end, 0);
         
     | 
| 
      
 456 
     | 
    
         
            +
              rb_define_method(bpa_class, "read_list_end", rb_thrift_binary_proto_read_list_end, 0);
         
     | 
| 
      
 457 
     | 
    
         
            +
              rb_define_method(bpa_class, "read_set_end", rb_thrift_binary_proto_read_set_end, 0);
         
     | 
| 
       439 
458 
     | 
    
         | 
| 
       440 
459 
     | 
    
         
             
              rbuf_ivar_id = rb_intern("@rbuf");
         
     | 
| 
       441 
460 
     | 
    
         
             
            }
         
     | 
    
        data/ext/bytes.c
    ADDED
    
    | 
         @@ -0,0 +1,36 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            /**
         
     | 
| 
      
 2 
     | 
    
         
            +
             * Licensed to the Apache Software Foundation (ASF) under one
         
     | 
| 
      
 3 
     | 
    
         
            +
             * or more contributor license agreements. See the NOTICE file
         
     | 
| 
      
 4 
     | 
    
         
            +
             * distributed with this work for additional information
         
     | 
| 
      
 5 
     | 
    
         
            +
             * regarding copyright ownership. The ASF licenses this file
         
     | 
| 
      
 6 
     | 
    
         
            +
             * to you under the Apache License, Version 2.0 (the
         
     | 
| 
      
 7 
     | 
    
         
            +
             * "License"); you may not use this file except in compliance
         
     | 
| 
      
 8 
     | 
    
         
            +
             * with the License. You may obtain a copy of the License at
         
     | 
| 
      
 9 
     | 
    
         
            +
             *
         
     | 
| 
      
 10 
     | 
    
         
            +
             *   http://www.apache.org/licenses/LICENSE-2.0
         
     | 
| 
      
 11 
     | 
    
         
            +
             *
         
     | 
| 
      
 12 
     | 
    
         
            +
             * Unless required by applicable law or agreed to in writing,
         
     | 
| 
      
 13 
     | 
    
         
            +
             * software distributed under the License is distributed on an
         
     | 
| 
      
 14 
     | 
    
         
            +
             * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
         
     | 
| 
      
 15 
     | 
    
         
            +
             * KIND, either express or implied. See the License for the
         
     | 
| 
      
 16 
     | 
    
         
            +
             * specific language governing permissions and limitations
         
     | 
| 
      
 17 
     | 
    
         
            +
             * under the License.
         
     | 
| 
      
 18 
     | 
    
         
            +
             */
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            #include <ruby.h>
         
     | 
| 
      
 21 
     | 
    
         
            +
            #ifdef HAVE_RUBY_ENCODING_H
         
     | 
| 
      
 22 
     | 
    
         
            +
            #include <ruby/encoding.h>
         
     | 
| 
      
 23 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 24 
     | 
    
         
            +
            #include <constants.h>
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            VALUE force_binary_encoding(VALUE buffer) {
         
     | 
| 
      
 27 
     | 
    
         
            +
              return rb_funcall(thrift_bytes_module, force_binary_encoding_id, 1, buffer);
         
     | 
| 
      
 28 
     | 
    
         
            +
            }
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            VALUE convert_to_utf8_byte_buffer(VALUE string) {
         
     | 
| 
      
 31 
     | 
    
         
            +
              return rb_funcall(thrift_bytes_module, convert_to_utf8_byte_buffer_id, 1, string);
         
     | 
| 
      
 32 
     | 
    
         
            +
            }
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
            VALUE convert_to_string(VALUE utf8_buffer) {
         
     | 
| 
      
 35 
     | 
    
         
            +
              return rb_funcall(thrift_bytes_module, convert_to_string_id, 1, utf8_buffer);
         
     | 
| 
      
 36 
     | 
    
         
            +
            }
         
     | 
    
        data/ext/bytes.h
    ADDED
    
    | 
         @@ -0,0 +1,31 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            /**
         
     | 
| 
      
 2 
     | 
    
         
            +
             * Licensed to the Apache Software Foundation (ASF) under one
         
     | 
| 
      
 3 
     | 
    
         
            +
             * or more contributor license agreements. See the NOTICE file
         
     | 
| 
      
 4 
     | 
    
         
            +
             * distributed with this work for additional information
         
     | 
| 
      
 5 
     | 
    
         
            +
             * regarding copyright ownership. The ASF licenses this file
         
     | 
| 
      
 6 
     | 
    
         
            +
             * to you under the Apache License, Version 2.0 (the
         
     | 
| 
      
 7 
     | 
    
         
            +
             * "License"); you may not use this file except in compliance
         
     | 
| 
      
 8 
     | 
    
         
            +
             * with the License. You may obtain a copy of the License at
         
     | 
| 
      
 9 
     | 
    
         
            +
             *
         
     | 
| 
      
 10 
     | 
    
         
            +
             *   http://www.apache.org/licenses/LICENSE-2.0
         
     | 
| 
      
 11 
     | 
    
         
            +
             *
         
     | 
| 
      
 12 
     | 
    
         
            +
             * Unless required by applicable law or agreed to in writing,
         
     | 
| 
      
 13 
     | 
    
         
            +
             * software distributed under the License is distributed on an
         
     | 
| 
      
 14 
     | 
    
         
            +
             * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
         
     | 
| 
      
 15 
     | 
    
         
            +
             * KIND, either express or implied. See the License for the
         
     | 
| 
      
 16 
     | 
    
         
            +
             * specific language governing permissions and limitations
         
     | 
| 
      
 17 
     | 
    
         
            +
             * under the License.
         
     | 
| 
      
 18 
     | 
    
         
            +
             */
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            #include <ruby.h>
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            /*
         
     | 
| 
      
 23 
     | 
    
         
            +
             * A collection of utilities for working with bytes and byte buffers.
         
     | 
| 
      
 24 
     | 
    
         
            +
             *
         
     | 
| 
      
 25 
     | 
    
         
            +
             * These methods are the native analogies to some of the methods in
         
     | 
| 
      
 26 
     | 
    
         
            +
             * Thrift::Bytes (thrift/bytes.rb).
         
     | 
| 
      
 27 
     | 
    
         
            +
             */
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            VALUE force_binary_encoding(VALUE buffer);
         
     | 
| 
      
 30 
     | 
    
         
            +
            VALUE convert_to_utf8_byte_buffer(VALUE string);
         
     | 
| 
      
 31 
     | 
    
         
            +
            VALUE convert_to_string(VALUE utf8_buffer);
         
     | 
    
        data/ext/compact_protocol.c
    CHANGED
    
    | 
         @@ -20,9 +20,10 @@ 
     | 
|
| 
       20 
20 
     | 
    
         
             
            #include <ruby.h>
         
     | 
| 
       21 
21 
     | 
    
         
             
            #include <stdbool.h>
         
     | 
| 
       22 
22 
     | 
    
         
             
            #include <stdint.h>
         
     | 
| 
       23 
     | 
    
         
            -
            #include  
     | 
| 
       24 
     | 
    
         
            -
            #include  
     | 
| 
       25 
     | 
    
         
            -
            #include  
     | 
| 
      
 23 
     | 
    
         
            +
            #include <constants.h>
         
     | 
| 
      
 24 
     | 
    
         
            +
            #include <struct.h>
         
     | 
| 
      
 25 
     | 
    
         
            +
            #include <macros.h>
         
     | 
| 
      
 26 
     | 
    
         
            +
            #include <bytes.h>
         
     | 
| 
       26 
27 
     | 
    
         | 
| 
       27 
28 
     | 
    
         
             
            #define LAST_ID(obj) FIX2INT(rb_ary_pop(rb_ivar_get(obj, last_field_id)))
         
     | 
| 
       28 
29 
     | 
    
         
             
            #define SET_LAST_ID(obj, val) rb_ary_push(rb_ivar_get(obj, last_field_id), val)
         
     | 
| 
         @@ -39,6 +40,7 @@ static ID rbuf_ivar_id; 
     | 
|
| 
       39 
40 
     | 
    
         
             
            static int VERSION;
         
     | 
| 
       40 
41 
     | 
    
         
             
            static int VERSION_MASK;
         
     | 
| 
       41 
42 
     | 
    
         
             
            static int TYPE_MASK;
         
     | 
| 
      
 43 
     | 
    
         
            +
            static int TYPE_BITS;
         
     | 
| 
       42 
44 
     | 
    
         
             
            static int TYPE_SHIFT_AMOUNT;
         
     | 
| 
       43 
45 
     | 
    
         
             
            static int PROTOCOL_ID;
         
     | 
| 
       44 
46 
     | 
    
         | 
| 
         @@ -166,6 +168,7 @@ static void write_collection_begin(VALUE transport, VALUE elem_type, VALUE size_ 
     | 
|
| 
       166 
168 
     | 
    
         | 
| 
       167 
169 
     | 
    
         
             
            VALUE rb_thrift_compact_proto_write_i32(VALUE self, VALUE i32);
         
     | 
| 
       168 
170 
     | 
    
         
             
            VALUE rb_thrift_compact_proto_write_string(VALUE self, VALUE str);
         
     | 
| 
      
 171 
     | 
    
         
            +
            VALUE rb_thrift_compact_proto_write_binary(VALUE self, VALUE buf);
         
     | 
| 
       169 
172 
     | 
    
         | 
| 
       170 
173 
     | 
    
         
             
            VALUE rb_thrift_compact_proto_write_message_end(VALUE self) {
         
     | 
| 
       171 
174 
     | 
    
         
             
              return Qnil;
         
     | 
| 
         @@ -304,9 +307,16 @@ VALUE rb_thrift_compact_proto_write_double(VALUE self, VALUE dub) { 
     | 
|
| 
       304 
307 
     | 
    
         
             
            }
         
     | 
| 
       305 
308 
     | 
    
         | 
| 
       306 
309 
     | 
    
         
             
            VALUE rb_thrift_compact_proto_write_string(VALUE self, VALUE str) {
         
     | 
| 
      
 310 
     | 
    
         
            +
              str = convert_to_utf8_byte_buffer(str);
         
     | 
| 
      
 311 
     | 
    
         
            +
              rb_thrift_compact_proto_write_binary(self, str);
         
     | 
| 
      
 312 
     | 
    
         
            +
              return Qnil;
         
     | 
| 
      
 313 
     | 
    
         
            +
            }
         
     | 
| 
      
 314 
     | 
    
         
            +
             
     | 
| 
      
 315 
     | 
    
         
            +
            VALUE rb_thrift_compact_proto_write_binary(VALUE self, VALUE buf) {
         
     | 
| 
      
 316 
     | 
    
         
            +
              buf = force_binary_encoding(buf);
         
     | 
| 
       307 
317 
     | 
    
         
             
              VALUE transport = GET_TRANSPORT(self);
         
     | 
| 
       308 
     | 
    
         
            -
              write_varint32(transport, RSTRING_LEN( 
     | 
| 
       309 
     | 
    
         
            -
              WRITE(transport,  
     | 
| 
      
 318 
     | 
    
         
            +
              write_varint32(transport, RSTRING_LEN(buf));
         
     | 
| 
      
 319 
     | 
    
         
            +
              WRITE(transport, StringValuePtr(buf), RSTRING_LEN(buf));
         
     | 
| 
       310 
320 
     | 
    
         
             
              return Qnil;
         
     | 
| 
       311 
321 
     | 
    
         
             
            }
         
     | 
| 
       312 
322 
     | 
    
         | 
| 
         @@ -317,6 +327,7 @@ VALUE rb_thrift_compact_proto_write_string(VALUE self, VALUE str) { 
     | 
|
| 
       317 
327 
     | 
    
         
             
            #define is_bool_type(ctype) (((ctype) & 0x0F) == CTYPE_BOOLEAN_TRUE || ((ctype) & 0x0F) == CTYPE_BOOLEAN_FALSE)
         
     | 
| 
       318 
328 
     | 
    
         | 
| 
       319 
329 
     | 
    
         
             
            VALUE rb_thrift_compact_proto_read_string(VALUE self);
         
     | 
| 
      
 330 
     | 
    
         
            +
            VALUE rb_thrift_compact_proto_read_binary(VALUE self);
         
     | 
| 
       320 
331 
     | 
    
         
             
            VALUE rb_thrift_compact_proto_read_byte(VALUE self);
         
     | 
| 
       321 
332 
     | 
    
         
             
            VALUE rb_thrift_compact_proto_read_i32(VALUE self);
         
     | 
| 
       322 
333 
     | 
    
         
             
            VALUE rb_thrift_compact_proto_read_i16(VALUE self);
         
     | 
| 
         @@ -440,7 +451,7 @@ VALUE rb_thrift_compact_proto_read_message_begin(VALUE self) { 
     | 
|
| 
       440 
451 
     | 
    
         
             
                rb_exc_raise(get_protocol_exception(INT2FIX(-1), rb_str_new2(buf)));
         
     | 
| 
       441 
452 
     | 
    
         
             
              }
         
     | 
| 
       442 
453 
     | 
    
         | 
| 
       443 
     | 
    
         
            -
              int8_t type = (version_and_type >> TYPE_SHIFT_AMOUNT) &  
     | 
| 
      
 454 
     | 
    
         
            +
              int8_t type = (version_and_type >> TYPE_SHIFT_AMOUNT) & TYPE_BITS;
         
     | 
| 
       444 
455 
     | 
    
         
             
              int32_t seqid = read_varint64(self);
         
     | 
| 
       445 
456 
     | 
    
         
             
              VALUE messageName = rb_thrift_compact_proto_read_string(self);
         
     | 
| 
       446 
457 
     | 
    
         
             
              return rb_ary_new3(3, messageName, INT2FIX(type), INT2NUM(seqid));
         
     | 
| 
         @@ -545,19 +556,25 @@ VALUE rb_thrift_compact_proto_read_double(VALUE self) { 
     | 
|
| 
       545 
556 
     | 
    
         
             
            }
         
     | 
| 
       546 
557 
     | 
    
         | 
| 
       547 
558 
     | 
    
         
             
            VALUE rb_thrift_compact_proto_read_string(VALUE self) {
         
     | 
| 
      
 559 
     | 
    
         
            +
              VALUE buffer = rb_thrift_compact_proto_read_binary(self);
         
     | 
| 
      
 560 
     | 
    
         
            +
              return convert_to_string(buffer);
         
     | 
| 
      
 561 
     | 
    
         
            +
            }
         
     | 
| 
      
 562 
     | 
    
         
            +
             
     | 
| 
      
 563 
     | 
    
         
            +
            VALUE rb_thrift_compact_proto_read_binary(VALUE self) {
         
     | 
| 
       548 
564 
     | 
    
         
             
              int64_t size = read_varint64(self);
         
     | 
| 
       549 
565 
     | 
    
         
             
              return READ(self, size);
         
     | 
| 
       550 
566 
     | 
    
         
             
            }
         
     | 
| 
       551 
567 
     | 
    
         | 
| 
       552 
568 
     | 
    
         
             
            static void Init_constants() {
         
     | 
| 
       553 
569 
     | 
    
         
             
              thrift_compact_protocol_class = rb_const_get(thrift_module, rb_intern("CompactProtocol"));
         
     | 
| 
       554 
     | 
    
         
            -
             
     | 
| 
      
 570 
     | 
    
         
            +
             
     | 
| 
       555 
571 
     | 
    
         
             
              VERSION = rb_num2ll(rb_const_get(thrift_compact_protocol_class, rb_intern("VERSION")));
         
     | 
| 
       556 
572 
     | 
    
         
             
              VERSION_MASK = rb_num2ll(rb_const_get(thrift_compact_protocol_class, rb_intern("VERSION_MASK")));
         
     | 
| 
       557 
573 
     | 
    
         
             
              TYPE_MASK = rb_num2ll(rb_const_get(thrift_compact_protocol_class, rb_intern("TYPE_MASK")));
         
     | 
| 
      
 574 
     | 
    
         
            +
              TYPE_BITS = rb_num2ll(rb_const_get(thrift_compact_protocol_class, rb_intern("TYPE_BITS")));
         
     | 
| 
       558 
575 
     | 
    
         
             
              TYPE_SHIFT_AMOUNT = FIX2INT(rb_const_get(thrift_compact_protocol_class, rb_intern("TYPE_SHIFT_AMOUNT")));
         
     | 
| 
       559 
576 
     | 
    
         
             
              PROTOCOL_ID = FIX2INT(rb_const_get(thrift_compact_protocol_class, rb_intern("PROTOCOL_ID")));
         
     | 
| 
       560 
     | 
    
         
            -
             
     | 
| 
      
 577 
     | 
    
         
            +
             
     | 
| 
       561 
578 
     | 
    
         
             
              last_field_id = rb_intern("@last_field");
         
     | 
| 
       562 
579 
     | 
    
         
             
              boolean_field_id = rb_intern("@boolean_field");
         
     | 
| 
       563 
580 
     | 
    
         
             
              bool_value_id = rb_intern("@bool_value");
         
     | 
| 
         @@ -580,6 +597,7 @@ static void Init_rb_methods() { 
     | 
|
| 
       580 
597 
     | 
    
         
             
              rb_define_method(thrift_compact_protocol_class, "write_i64",           rb_thrift_compact_proto_write_i64, 1);
         
     | 
| 
       581 
598 
     | 
    
         
             
              rb_define_method(thrift_compact_protocol_class, "write_double",        rb_thrift_compact_proto_write_double, 1);
         
     | 
| 
       582 
599 
     | 
    
         
             
              rb_define_method(thrift_compact_protocol_class, "write_string",        rb_thrift_compact_proto_write_string, 1);
         
     | 
| 
      
 600 
     | 
    
         
            +
              rb_define_method(thrift_compact_protocol_class, "write_binary",        rb_thrift_compact_proto_write_binary, 1);
         
     | 
| 
       583 
601 
     | 
    
         | 
| 
       584 
602 
     | 
    
         
             
              rb_define_method(thrift_compact_protocol_class, "write_message_end", rb_thrift_compact_proto_write_message_end, 0);
         
     | 
| 
       585 
603 
     | 
    
         
             
              rb_define_method(thrift_compact_protocol_class, "write_struct_begin", rb_thrift_compact_proto_write_struct_begin, 1);
         
     | 
| 
         @@ -602,6 +620,7 @@ static void Init_rb_methods() { 
     | 
|
| 
       602 
620 
     | 
    
         
             
              rb_define_method(thrift_compact_protocol_class, "read_i64",            rb_thrift_compact_proto_read_i64, 0);
         
     | 
| 
       603 
621 
     | 
    
         
             
              rb_define_method(thrift_compact_protocol_class, "read_double",         rb_thrift_compact_proto_read_double, 0);
         
     | 
| 
       604 
622 
     | 
    
         
             
              rb_define_method(thrift_compact_protocol_class, "read_string",         rb_thrift_compact_proto_read_string, 0);
         
     | 
| 
      
 623 
     | 
    
         
            +
              rb_define_method(thrift_compact_protocol_class, "read_binary",         rb_thrift_compact_proto_read_binary, 0);
         
     | 
| 
       605 
624 
     | 
    
         | 
| 
       606 
625 
     | 
    
         
             
              rb_define_method(thrift_compact_protocol_class, "read_message_end", rb_thrift_compact_proto_read_message_end, 0);
         
     | 
| 
       607 
626 
     | 
    
         
             
              rb_define_method(thrift_compact_protocol_class, "read_struct_begin",  rb_thrift_compact_proto_read_struct_begin, 0);
         
     | 
    
        data/ext/constants.h
    CHANGED
    
    | 
         @@ -42,19 +42,20 @@ extern ID write_i32_method_id; 
     | 
|
| 
       42 
42 
     | 
    
         
             
            extern ID write_i64_method_id;
         
     | 
| 
       43 
43 
     | 
    
         
             
            extern ID write_double_method_id;
         
     | 
| 
       44 
44 
     | 
    
         
             
            extern ID write_string_method_id;
         
     | 
| 
      
 45 
     | 
    
         
            +
            extern ID write_binary_method_id;
         
     | 
| 
       45 
46 
     | 
    
         
             
            extern ID write_map_begin_method_id;
         
     | 
| 
       46 
47 
     | 
    
         
             
            extern ID write_map_end_method_id;
         
     | 
| 
       47 
48 
     | 
    
         
             
            extern ID write_list_begin_method_id;
         
     | 
| 
       48 
49 
     | 
    
         
             
            extern ID write_list_end_method_id;
         
     | 
| 
       49 
50 
     | 
    
         
             
            extern ID write_set_begin_method_id;
         
     | 
| 
       50 
51 
     | 
    
         
             
            extern ID write_set_end_method_id;
         
     | 
| 
       51 
     | 
    
         
            -
            extern ID size_method_id;
         
     | 
| 
       52 
52 
     | 
    
         
             
            extern ID read_bool_method_id;
         
     | 
| 
       53 
53 
     | 
    
         
             
            extern ID read_byte_method_id;
         
     | 
| 
       54 
54 
     | 
    
         
             
            extern ID read_i16_method_id;
         
     | 
| 
       55 
55 
     | 
    
         
             
            extern ID read_i32_method_id;
         
     | 
| 
       56 
56 
     | 
    
         
             
            extern ID read_i64_method_id;
         
     | 
| 
       57 
57 
     | 
    
         
             
            extern ID read_string_method_id;
         
     | 
| 
      
 58 
     | 
    
         
            +
            extern ID read_binary_method_id;
         
     | 
| 
       58 
59 
     | 
    
         
             
            extern ID read_double_method_id;
         
     | 
| 
       59 
60 
     | 
    
         
             
            extern ID read_map_begin_method_id;
         
     | 
| 
       60 
61 
     | 
    
         
             
            extern ID read_map_end_method_id;
         
     | 
| 
         @@ -67,15 +68,15 @@ extern ID read_struct_end_method_id; 
     | 
|
| 
       67 
68 
     | 
    
         
             
            extern ID read_field_begin_method_id;
         
     | 
| 
       68 
69 
     | 
    
         
             
            extern ID read_field_end_method_id;
         
     | 
| 
       69 
70 
     | 
    
         
             
            extern ID keys_method_id;
         
     | 
| 
       70 
     | 
    
         
            -
            extern ID entries_method_id; 
     | 
| 
       71 
     | 
    
         
            -
            extern ID name_method_id; 
         
     | 
| 
       72 
     | 
    
         
            -
            extern ID sort_method_id;
         
     | 
| 
      
 71 
     | 
    
         
            +
            extern ID entries_method_id;
         
     | 
| 
       73 
72 
     | 
    
         
             
            extern ID write_field_stop_method_id;
         
     | 
| 
       74 
73 
     | 
    
         
             
            extern ID skip_method_id;
         
     | 
| 
       75 
74 
     | 
    
         
             
            extern ID write_method_id;
         
     | 
| 
       76 
75 
     | 
    
         
             
            extern ID read_all_method_id;
         
     | 
| 
       77 
76 
     | 
    
         
             
            extern ID read_into_buffer_method_id;
         
     | 
| 
       78 
     | 
    
         
            -
            extern ID  
     | 
| 
      
 77 
     | 
    
         
            +
            extern ID force_binary_encoding_id;
         
     | 
| 
      
 78 
     | 
    
         
            +
            extern ID convert_to_utf8_byte_buffer_id;
         
     | 
| 
      
 79 
     | 
    
         
            +
            extern ID convert_to_string_id;
         
     | 
| 
       79 
80 
     | 
    
         | 
| 
       80 
81 
     | 
    
         
             
            extern ID fields_const_id;
         
     | 
| 
       81 
82 
     | 
    
         
             
            extern ID transport_ivar_id;
         
     | 
| 
         @@ -88,9 +89,11 @@ extern VALUE key_sym; 
     | 
|
| 
       88 
89 
     | 
    
         
             
            extern VALUE value_sym;
         
     | 
| 
       89 
90 
     | 
    
         
             
            extern VALUE element_sym;
         
     | 
| 
       90 
91 
     | 
    
         
             
            extern VALUE class_sym;
         
     | 
| 
      
 92 
     | 
    
         
            +
            extern VALUE binary_sym;
         
     | 
| 
       91 
93 
     | 
    
         | 
| 
       92 
94 
     | 
    
         
             
            extern VALUE rb_cSet;
         
     | 
| 
       93 
95 
     | 
    
         
             
            extern VALUE thrift_module;
         
     | 
| 
       94 
96 
     | 
    
         
             
            extern VALUE thrift_types_module;
         
     | 
| 
      
 97 
     | 
    
         
            +
            extern VALUE thrift_bytes_module;
         
     | 
| 
       95 
98 
     | 
    
         
             
            extern VALUE class_thrift_protocol;
         
     | 
| 
       96 
99 
     | 
    
         
             
            extern VALUE protocol_exception_class;
         
     | 
    
        data/ext/extconf.rb
    CHANGED
    
    | 
         @@ -21,8 +21,12 @@ if defined?(RUBY_ENGINE) && RUBY_ENGINE =~ /jruby/ 
     | 
|
| 
       21 
21 
     | 
    
         
             
              File.open('Makefile', 'w'){|f| f.puts "all:\n\ninstall:\n" }
         
     | 
| 
       22 
22 
     | 
    
         
             
            else
         
     | 
| 
       23 
23 
     | 
    
         
             
              require 'mkmf'
         
     | 
| 
      
 24 
     | 
    
         
            +
              require 'rbconfig'
         
     | 
| 
       24 
25 
     | 
    
         | 
| 
       25 
     | 
    
         
            -
              $ 
     | 
| 
      
 26 
     | 
    
         
            +
              $ARCH_FLAGS = RbConfig::CONFIG['CFLAGS'].scan( /(-arch )(\S+)/ ).map{|x,y| x + y + ' ' }.join('')
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
              $CFLAGS = "-fsigned-char -g -O2 -Wall -Werror " + $ARCH_FLAGS
         
     | 
| 
       26 
30 
     | 
    
         | 
| 
       27 
31 
     | 
    
         
             
              have_func("strlcpy", "string.h")
         
     | 
| 
       28 
32 
     | 
    
         | 
    
        data/ext/memory_buffer.c
    CHANGED
    
    | 
         @@ -19,7 +19,8 @@ 
     | 
|
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
            #include <ruby.h>
         
     | 
| 
       21 
21 
     | 
    
         
             
            #include <constants.h>
         
     | 
| 
       22 
     | 
    
         
            -
            #include  
     | 
| 
      
 22 
     | 
    
         
            +
            #include <bytes.h>
         
     | 
| 
      
 23 
     | 
    
         
            +
            #include <macros.h>
         
     | 
| 
       23 
24 
     | 
    
         | 
| 
       24 
25 
     | 
    
         
             
            ID buf_ivar_id;
         
     | 
| 
       25 
26 
     | 
    
         
             
            ID index_ivar_id;
         
     | 
| 
         @@ -37,7 +38,8 @@ VALUE rb_thrift_memory_buffer_read_into_buffer(VALUE self, VALUE buffer_value, V 
     | 
|
| 
       37 
38 
     | 
    
         | 
| 
       38 
39 
     | 
    
         
             
            VALUE rb_thrift_memory_buffer_write(VALUE self, VALUE str) {
         
     | 
| 
       39 
40 
     | 
    
         
             
              VALUE buf = GET_BUF(self);
         
     | 
| 
       40 
     | 
    
         
            -
               
     | 
| 
      
 41 
     | 
    
         
            +
              str = force_binary_encoding(str);
         
     | 
| 
      
 42 
     | 
    
         
            +
              rb_str_buf_cat(buf, StringValuePtr(str), RSTRING_LEN(str));
         
     | 
| 
       41 
43 
     | 
    
         
             
              return Qnil;
         
     | 
| 
       42 
44 
     | 
    
         
             
            }
         
     | 
| 
       43 
45 
     | 
    
         | 
| 
         @@ -93,25 +95,26 @@ VALUE rb_thrift_memory_buffer_read_into_buffer(VALUE self, VALUE buffer_value, V 
     | 
|
| 
       93 
95 
     | 
    
         
             
              int index;
         
     | 
| 
       94 
96 
     | 
    
         
             
              VALUE buf = GET_BUF(self);
         
     | 
| 
       95 
97 
     | 
    
         | 
| 
      
 98 
     | 
    
         
            +
              index = FIX2INT(rb_ivar_get(self, index_ivar_id));
         
     | 
| 
       96 
99 
     | 
    
         
             
              while (i < size) {
         
     | 
| 
       97 
     | 
    
         
            -
                index = FIX2INT(rb_ivar_get(self, index_ivar_id));
         
     | 
| 
       98 
100 
     | 
    
         
             
                if (index >= RSTRING_LEN(buf)) {
         
     | 
| 
       99 
101 
     | 
    
         
             
                  rb_raise(rb_eEOFError, "Not enough bytes remain in memory buffer");
         
     | 
| 
       100 
102 
     | 
    
         
             
                }
         
     | 
| 
       101 
103 
     | 
    
         
             
                char byte = RSTRING_PTR(buf)[index++];
         
     | 
| 
       102 
104 
     | 
    
         | 
| 
       103 
     | 
    
         
            -
                if (index >= GARBAGE_BUFFER_SIZE) {
         
     | 
| 
       104 
     | 
    
         
            -
                  rb_ivar_set(self, buf_ivar_id, rb_funcall(buf, slice_method_id, 2, INT2FIX(index), INT2FIX(RSTRING_LEN(buf) - 1)));
         
     | 
| 
       105 
     | 
    
         
            -
                  index = 0;
         
     | 
| 
       106 
     | 
    
         
            -
                }
         
     | 
| 
       107 
     | 
    
         
            -
                rb_ivar_set(self, index_ivar_id, INT2FIX(index));
         
     | 
| 
       108 
     | 
    
         
            -
             
     | 
| 
       109 
105 
     | 
    
         
             
                if (i >= RSTRING_LEN(buffer_value)) {
         
     | 
| 
       110 
106 
     | 
    
         
             
                  rb_raise(rb_eIndexError, "index %d out of string", i);
         
     | 
| 
       111 
107 
     | 
    
         
             
                }
         
     | 
| 
       112 
108 
     | 
    
         
             
                ((char*)RSTRING_PTR(buffer_value))[i] = byte;
         
     | 
| 
       113 
109 
     | 
    
         
             
                i++;
         
     | 
| 
       114 
110 
     | 
    
         
             
              }
         
     | 
| 
      
 111 
     | 
    
         
            +
             
     | 
| 
      
 112 
     | 
    
         
            +
              if (index >= GARBAGE_BUFFER_SIZE) {
         
     | 
| 
      
 113 
     | 
    
         
            +
                rb_ivar_set(self, buf_ivar_id, rb_funcall(buf, slice_method_id, 2, INT2FIX(index), INT2FIX(RSTRING_LEN(buf) - 1)));
         
     | 
| 
      
 114 
     | 
    
         
            +
                index = 0;
         
     | 
| 
      
 115 
     | 
    
         
            +
              }
         
     | 
| 
      
 116 
     | 
    
         
            +
              rb_ivar_set(self, index_ivar_id, INT2FIX(index));
         
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
       115 
118 
     | 
    
         
             
              return INT2FIX(i);
         
     | 
| 
       116 
119 
     | 
    
         
             
            }
         
     | 
| 
       117 
120 
     | 
    
         | 
    
        data/ext/protocol.c
    CHANGED
    
    | 
         @@ -1,185 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            /**
         
     | 
| 
       2 
     | 
    
         
            -
             * Licensed to the Apache Software Foundation (ASF) under one
         
     | 
| 
       3 
     | 
    
         
            -
             * or more contributor license agreements. See the NOTICE file
         
     | 
| 
       4 
     | 
    
         
            -
             * distributed with this work for additional information
         
     | 
| 
       5 
     | 
    
         
            -
             * regarding copyright ownership. The ASF licenses this file
         
     | 
| 
       6 
     | 
    
         
            -
             * to you under the Apache License, Version 2.0 (the
         
     | 
| 
       7 
     | 
    
         
            -
             * "License"); you may not use this file except in compliance
         
     | 
| 
       8 
     | 
    
         
            -
             * with the License. You may obtain a copy of the License at
         
     | 
| 
       9 
     | 
    
         
            -
             *
         
     | 
| 
       10 
     | 
    
         
            -
             *   http://www.apache.org/licenses/LICENSE-2.0
         
     | 
| 
       11 
     | 
    
         
            -
             *
         
     | 
| 
       12 
     | 
    
         
            -
             * Unless required by applicable law or agreed to in writing,
         
     | 
| 
       13 
     | 
    
         
            -
             * software distributed under the License is distributed on an
         
     | 
| 
       14 
     | 
    
         
            -
             * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
         
     | 
| 
       15 
     | 
    
         
            -
             * KIND, either express or implied. See the License for the
         
     | 
| 
       16 
     | 
    
         
            -
             * specific language governing permissions and limitations
         
     | 
| 
       17 
     | 
    
         
            -
             * under the License.
         
     | 
| 
       18 
     | 
    
         
            -
             */
         
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
            #include <ruby.h>
         
     | 
| 
       21 
     | 
    
         
            -
            #include <protocol.h>
         
     | 
| 
       22 
     | 
    
         
            -
            #include <stdbool.h>
         
     | 
| 
       23 
     | 
    
         
            -
            #include <constants.h>
         
     | 
| 
       24 
     | 
    
         
            -
            #include <struct.h>
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
            static VALUE skip(VALUE self, int ttype) {
         
     | 
| 
       27 
     | 
    
         
            -
              if (ttype == TTYPE_STOP) {
         
     | 
| 
       28 
     | 
    
         
            -
                return Qnil;
         
     | 
| 
       29 
     | 
    
         
            -
              } else if (ttype == TTYPE_BOOL) {
         
     | 
| 
       30 
     | 
    
         
            -
                rb_funcall(self, read_bool_method_id, 0);
         
     | 
| 
       31 
     | 
    
         
            -
              } else if (ttype == TTYPE_BYTE) {
         
     | 
| 
       32 
     | 
    
         
            -
                rb_funcall(self, read_byte_method_id, 0);
         
     | 
| 
       33 
     | 
    
         
            -
              } else if (ttype == TTYPE_I16) {
         
     | 
| 
       34 
     | 
    
         
            -
                rb_funcall(self, read_i16_method_id, 0);
         
     | 
| 
       35 
     | 
    
         
            -
              } else if (ttype == TTYPE_I32) {
         
     | 
| 
       36 
     | 
    
         
            -
                rb_funcall(self, read_i32_method_id, 0);
         
     | 
| 
       37 
     | 
    
         
            -
              } else if (ttype == TTYPE_I64) {
         
     | 
| 
       38 
     | 
    
         
            -
                rb_funcall(self, read_i64_method_id, 0);
         
     | 
| 
       39 
     | 
    
         
            -
              } else if (ttype == TTYPE_DOUBLE) {
         
     | 
| 
       40 
     | 
    
         
            -
                rb_funcall(self, read_double_method_id, 0);
         
     | 
| 
       41 
     | 
    
         
            -
              } else if (ttype == TTYPE_STRING) {
         
     | 
| 
       42 
     | 
    
         
            -
                rb_funcall(self, read_string_method_id, 0);
         
     | 
| 
       43 
     | 
    
         
            -
              } else if (ttype == TTYPE_STRUCT) {
         
     | 
| 
       44 
     | 
    
         
            -
                rb_funcall(self, read_struct_begin_method_id, 0);
         
     | 
| 
       45 
     | 
    
         
            -
                while (true) {
         
     | 
| 
       46 
     | 
    
         
            -
                  VALUE field_header = rb_funcall(self, read_field_begin_method_id, 0);
         
     | 
| 
       47 
     | 
    
         
            -
                  if (NIL_P(field_header) || FIX2INT(rb_ary_entry(field_header, 1)) == TTYPE_STOP ) {
         
     | 
| 
       48 
     | 
    
         
            -
                    break;
         
     | 
| 
       49 
     | 
    
         
            -
                  } 
         
     | 
| 
       50 
     | 
    
         
            -
                  skip(self, FIX2INT(rb_ary_entry(field_header, 1)));
         
     | 
| 
       51 
     | 
    
         
            -
                  rb_funcall(self, read_field_end_method_id, 0);
         
     | 
| 
       52 
     | 
    
         
            -
                }
         
     | 
| 
       53 
     | 
    
         
            -
                rb_funcall(self, read_struct_end_method_id, 0);
         
     | 
| 
       54 
     | 
    
         
            -
              } else if (ttype == TTYPE_MAP) {
         
     | 
| 
       55 
     | 
    
         
            -
                int i;
         
     | 
| 
       56 
     | 
    
         
            -
                VALUE map_header = rb_funcall(self, read_map_begin_method_id, 0);
         
     | 
| 
       57 
     | 
    
         
            -
                int ktype = FIX2INT(rb_ary_entry(map_header, 0));
         
     | 
| 
       58 
     | 
    
         
            -
                int vtype = FIX2INT(rb_ary_entry(map_header, 1));
         
     | 
| 
       59 
     | 
    
         
            -
                int size = FIX2INT(rb_ary_entry(map_header, 2));
         
     | 
| 
       60 
     | 
    
         
            -
                
         
     | 
| 
       61 
     | 
    
         
            -
                for (i = 0; i < size; i++) {
         
     | 
| 
       62 
     | 
    
         
            -
                  skip(self, ktype);
         
     | 
| 
       63 
     | 
    
         
            -
                  skip(self, vtype);
         
     | 
| 
       64 
     | 
    
         
            -
                }
         
     | 
| 
       65 
     | 
    
         
            -
                rb_funcall(self, read_map_end_method_id, 0);
         
     | 
| 
       66 
     | 
    
         
            -
              } else if (ttype == TTYPE_LIST || ttype == TTYPE_SET) {
         
     | 
| 
       67 
     | 
    
         
            -
                int i;
         
     | 
| 
       68 
     | 
    
         
            -
                VALUE collection_header = rb_funcall(self, ttype == TTYPE_LIST ? read_list_begin_method_id : read_set_begin_method_id, 0);
         
     | 
| 
       69 
     | 
    
         
            -
                int etype = FIX2INT(rb_ary_entry(collection_header, 0));
         
     | 
| 
       70 
     | 
    
         
            -
                int size = FIX2INT(rb_ary_entry(collection_header, 1));
         
     | 
| 
       71 
     | 
    
         
            -
                for (i = 0; i < size; i++) {
         
     | 
| 
       72 
     | 
    
         
            -
                  skip(self, etype);
         
     | 
| 
       73 
     | 
    
         
            -
                }
         
     | 
| 
       74 
     | 
    
         
            -
                rb_funcall(self, ttype == TTYPE_LIST ? read_list_end_method_id : read_set_end_method_id, 0);
         
     | 
| 
       75 
     | 
    
         
            -
              } else {
         
     | 
| 
       76 
     | 
    
         
            -
                rb_raise(rb_eNotImpError, "don't know how to skip type %d", ttype);
         
     | 
| 
       77 
     | 
    
         
            -
              }
         
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
     | 
    
         
            -
              return Qnil;
         
     | 
| 
       80 
     | 
    
         
            -
            }
         
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
            VALUE rb_thrift_protocol_native_qmark(VALUE self) {
         
     | 
| 
       83 
     | 
    
         
            -
              return Qfalse;
         
     | 
| 
       84 
     | 
    
         
            -
            }
         
     | 
| 
       85 
     | 
    
         
            -
             
     | 
| 
       86 
     | 
    
         
            -
            VALUE rb_thrift_protocol_skip(VALUE protocol, VALUE ttype) {
         
     | 
| 
       87 
     | 
    
         
            -
              return skip(protocol, FIX2INT(ttype));
         
     | 
| 
       88 
     | 
    
         
            -
            }
         
     | 
| 
       89 
     | 
    
         
            -
             
     | 
| 
       90 
     | 
    
         
            -
            VALUE rb_thrift_write_message_end(VALUE self) {
         
     | 
| 
       91 
     | 
    
         
            -
              return Qnil;
         
     | 
| 
       92 
     | 
    
         
            -
            }
         
     | 
| 
       93 
     | 
    
         
            -
             
     | 
| 
       94 
     | 
    
         
            -
            VALUE rb_thrift_write_struct_begin(VALUE self, VALUE name) {
         
     | 
| 
       95 
     | 
    
         
            -
              return Qnil;
         
     | 
| 
       96 
     | 
    
         
            -
            }
         
     | 
| 
       97 
     | 
    
         
            -
             
     | 
| 
       98 
     | 
    
         
            -
            VALUE rb_thrift_write_struct_end(VALUE self) {
         
     | 
| 
       99 
     | 
    
         
            -
              return Qnil;
         
     | 
| 
       100 
     | 
    
         
            -
            }
         
     | 
| 
       101 
     | 
    
         
            -
             
     | 
| 
       102 
     | 
    
         
            -
            VALUE rb_thrift_write_field_end(VALUE self) {
         
     | 
| 
       103 
     | 
    
         
            -
              return Qnil;
         
     | 
| 
       104 
     | 
    
         
            -
            }
         
     | 
| 
       105 
     | 
    
         
            -
             
     | 
| 
       106 
     | 
    
         
            -
            VALUE rb_thrift_write_map_end(VALUE self) {
         
     | 
| 
       107 
     | 
    
         
            -
              return Qnil;
         
     | 
| 
       108 
     | 
    
         
            -
            }
         
     | 
| 
       109 
     | 
    
         
            -
             
     | 
| 
       110 
     | 
    
         
            -
            VALUE rb_thrift_write_list_end(VALUE self) {
         
     | 
| 
       111 
     | 
    
         
            -
              return Qnil;
         
     | 
| 
       112 
     | 
    
         
            -
            }
         
     | 
| 
       113 
     | 
    
         
            -
             
     | 
| 
       114 
     | 
    
         
            -
            VALUE rb_thrift_write_set_end(VALUE self) {
         
     | 
| 
       115 
     | 
    
         
            -
              return Qnil;
         
     | 
| 
       116 
     | 
    
         
            -
            }
         
     | 
| 
       117 
     | 
    
         
            -
             
     | 
| 
       118 
     | 
    
         
            -
            VALUE rb_thrift_read_message_end(VALUE self) {
         
     | 
| 
       119 
     | 
    
         
            -
              return Qnil;
         
     | 
| 
       120 
     | 
    
         
            -
            }
         
     | 
| 
       121 
     | 
    
         
            -
             
     | 
| 
       122 
     | 
    
         
            -
            VALUE rb_thift_read_struct_begin(VALUE self) {
         
     | 
| 
       123 
     | 
    
         
            -
              return Qnil;
         
     | 
| 
       124 
     | 
    
         
            -
            }
         
     | 
| 
       125 
     | 
    
         
            -
             
     | 
| 
       126 
     | 
    
         
            -
            VALUE rb_thift_read_struct_end(VALUE self) {
         
     | 
| 
       127 
     | 
    
         
            -
              return Qnil;
         
     | 
| 
       128 
     | 
    
         
            -
            }
         
     | 
| 
       129 
     | 
    
         
            -
             
     | 
| 
       130 
     | 
    
         
            -
            VALUE rb_thift_read_field_end(VALUE self) {
         
     | 
| 
       131 
     | 
    
         
            -
              return Qnil;
         
     | 
| 
       132 
     | 
    
         
            -
            }
         
     | 
| 
       133 
     | 
    
         
            -
             
     | 
| 
       134 
     | 
    
         
            -
            VALUE rb_thift_read_map_end(VALUE self) {
         
     | 
| 
       135 
     | 
    
         
            -
              return Qnil;
         
     | 
| 
       136 
     | 
    
         
            -
            }
         
     | 
| 
       137 
     | 
    
         
            -
             
     | 
| 
       138 
     | 
    
         
            -
            VALUE rb_thift_read_list_end(VALUE self) {
         
     | 
| 
       139 
     | 
    
         
            -
              return Qnil;
         
     | 
| 
       140 
     | 
    
         
            -
            }
         
     | 
| 
       141 
     | 
    
         
            -
             
     | 
| 
       142 
     | 
    
         
            -
            VALUE rb_thift_read_set_end(VALUE self) {
         
     | 
| 
       143 
     | 
    
         
            -
              return Qnil;
         
     | 
| 
       144 
     | 
    
         
            -
            }
         
     | 
| 
       145 
     | 
    
         
            -
             
     | 
| 
       146 
     | 
    
         
            -
            void Init_protocol() {
         
     | 
| 
       147 
     | 
    
         
            -
              VALUE c_protocol = rb_const_get(thrift_module, rb_intern("BaseProtocol"));
         
     | 
| 
       148 
     | 
    
         
            -
              
         
     | 
| 
       149 
     | 
    
         
            -
              rb_define_method(c_protocol, "skip", rb_thrift_protocol_skip, 1);
         
     | 
| 
       150 
     | 
    
         
            -
              rb_define_method(c_protocol, "write_message_end", rb_thrift_write_message_end, 0);
         
     | 
| 
       151 
     | 
    
         
            -
              rb_define_method(c_protocol, "write_struct_begin", rb_thrift_write_struct_begin, 1);
         
     | 
| 
       152 
     | 
    
         
            -
              rb_define_method(c_protocol, "write_struct_end", rb_thrift_write_struct_end, 0);
         
     | 
| 
       153 
     | 
    
         
            -
              rb_define_method(c_protocol, "write_field_end", rb_thrift_write_field_end, 0);
         
     | 
| 
       154 
     | 
    
         
            -
              rb_define_method(c_protocol, "write_map_end", rb_thrift_write_map_end, 0);
         
     | 
| 
       155 
     | 
    
         
            -
              rb_define_method(c_protocol, "write_list_end", rb_thrift_write_list_end, 0);
         
     | 
| 
       156 
     | 
    
         
            -
              rb_define_method(c_protocol, "write_set_end", rb_thrift_write_set_end, 0);
         
     | 
| 
       157 
     | 
    
         
            -
              rb_define_method(c_protocol, "read_message_end", rb_thrift_read_message_end, 0);
         
     | 
| 
       158 
     | 
    
         
            -
              rb_define_method(c_protocol, "read_struct_begin", rb_thift_read_struct_begin, 0);
         
     | 
| 
       159 
     | 
    
         
            -
              rb_define_method(c_protocol, "read_struct_end", rb_thift_read_struct_end, 0);
         
     | 
| 
       160 
     | 
    
         
            -
              rb_define_method(c_protocol, "read_field_end", rb_thift_read_field_end, 0);
         
     | 
| 
       161 
     | 
    
         
            -
              rb_define_method(c_protocol, "read_map_end", rb_thift_read_map_end, 0);
         
     | 
| 
       162 
     | 
    
         
            -
              rb_define_method(c_protocol, "read_list_end", rb_thift_read_list_end, 0);
         
     | 
| 
       163 
     | 
    
         
            -
              rb_define_method(c_protocol, "read_set_end", rb_thift_read_set_end, 0);
         
     | 
| 
       164 
     | 
    
         
            -
              rb_define_method(c_protocol, "native?", rb_thrift_protocol_native_qmark, 0);
         
     | 
| 
       165 
     | 
    
         
            -
              
         
     | 
| 
       166 
     | 
    
         
            -
              // native_proto_method_table *npmt;
         
     | 
| 
       167 
     | 
    
         
            -
              // npmt = ALLOC(native_proto_method_table);
         
     | 
| 
       168 
     | 
    
         
            -
              // npmt->write_message_end = rb_thrift_write_message_end;
         
     | 
| 
       169 
     | 
    
         
            -
              // npmt->write_struct_begin = rb_thrift_write_struct_begin;
         
     | 
| 
       170 
     | 
    
         
            -
              // npmt->write_struct_end = rb_thrift_write_struct_end;
         
     | 
| 
       171 
     | 
    
         
            -
              // npmt->write_field_end = rb_thrift_write_field_end;
         
     | 
| 
       172 
     | 
    
         
            -
              // npmt->write_map_end = rb_thrift_write_map_end;
         
     | 
| 
       173 
     | 
    
         
            -
              // npmt->write_list_end = rb_thrift_write_list_end;
         
     | 
| 
       174 
     | 
    
         
            -
              // npmt->write_set_end = rb_thrift_write_set_end;
         
     | 
| 
       175 
     | 
    
         
            -
              // npmt->read_message_end = rb_thrift_read_message_end;
         
     | 
| 
       176 
     | 
    
         
            -
              // npmt->read_struct_begin = rb_thift_read_struct_begin;
         
     | 
| 
       177 
     | 
    
         
            -
              // npmt->read_struct_end = rb_thift_read_struct_end;
         
     | 
| 
       178 
     | 
    
         
            -
              // npmt->read_field_end = rb_thift_read_field_end;
         
     | 
| 
       179 
     | 
    
         
            -
              // npmt->read_map_end = rb_thift_read_map_end;
         
     | 
| 
       180 
     | 
    
         
            -
              // npmt->read_list_end = rb_thift_read_list_end;
         
     | 
| 
       181 
     | 
    
         
            -
              // npmt->read_set_end = rb_thift_read_set_end;
         
     | 
| 
       182 
     | 
    
         
            -
              // 
         
     | 
| 
       183 
     | 
    
         
            -
              // VALUE method_table_object = Data_Wrap_Struct(rb_cObject, 0, free, npmt);
         
     | 
| 
       184 
     | 
    
         
            -
              // rb_const_set(c_protocol, rb_intern("@native_method_table"), method_table_object);
         
     | 
| 
       185 
     | 
    
         
            -
            }
         
     |