THRIFT-498. rb: Compact and Binary native protocols, used at the same time, can cause some issues

Disable native method table usage.



git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@799693 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/rb/ext/struct.c b/lib/rb/ext/struct.c
index fee285e..31c62d5 100644
--- a/lib/rb/ext/struct.c
+++ b/lib/rb/ext/struct.c
@@ -45,28 +45,28 @@
 
 static native_proto_method_table *mt;
 static native_proto_method_table *default_mt;
-static VALUE last_proto_class = Qnil;
+// static VALUE last_proto_class = Qnil;
 
 #define IS_CONTAINER(ttype) ((ttype) == TTYPE_MAP || (ttype) == TTYPE_LIST || (ttype) == TTYPE_SET)
 #define STRUCT_FIELDS(obj) rb_const_get(CLASS_OF(obj), fields_const_id)
 
-static void set_native_proto_function_pointers(VALUE protocol) {
-  VALUE method_table_object = rb_const_get(CLASS_OF(protocol), rb_intern("@native_method_table"));
-  // TODO: check nil?
-  Data_Get_Struct(method_table_object, native_proto_method_table, mt);
-}
+// static void set_native_proto_function_pointers(VALUE protocol) {
+//   VALUE method_table_object = rb_const_get(CLASS_OF(protocol), rb_intern("@native_method_table"));
+//   // TODO: check nil?
+//   Data_Get_Struct(method_table_object, native_proto_method_table, mt);
+// }
 
-static void check_native_proto_method_table(VALUE protocol) {
-  VALUE protoclass = CLASS_OF(protocol);
-  if (protoclass != last_proto_class) {
-    last_proto_class = protoclass;
-    if (rb_funcall(protocol, native_qmark_method_id, 0) == Qtrue) {
-      set_native_proto_function_pointers(protocol);
-    } else {
-      mt = default_mt;
-    }
-  }
-}
+// static void check_native_proto_method_table(VALUE protocol) {
+//   VALUE protoclass = CLASS_OF(protocol);
+//   if (protoclass != last_proto_class) {
+//     last_proto_class = protoclass;
+//     if (rb_funcall(protocol, native_qmark_method_id, 0) == Qtrue) {
+//       set_native_proto_function_pointers(protocol);
+//     } else {
+//       mt = default_mt;
+//     }
+//   }
+// }
 
 //-------------------------------------------
 // Writing section
@@ -416,16 +416,16 @@
   // call validate
   rb_funcall(self, validate_method_id, 0);
 
-  check_native_proto_method_table(protocol);
-  
+  // check_native_proto_method_table(protocol);
+
   // write struct begin
   mt->write_struct_begin(protocol, rb_class_name(CLASS_OF(self)));
-  
+
   // iterate through all the fields here
   VALUE struct_fields = STRUCT_FIELDS(self);
   VALUE struct_field_ids_unordered = rb_funcall(struct_fields, keys_method_id, 0);
   VALUE struct_field_ids_ordered = rb_funcall(struct_field_ids_unordered, sort_method_id, 0);
-  
+
   int i = 0;
   for (i=0; i < RARRAY_LEN(struct_field_ids_ordered); i++) {
     VALUE field_id = rb_ary_entry(struct_field_ids_ordered, i);
@@ -444,12 +444,12 @@
       mt->write_field_end(protocol);
     }
   }
-  
+
   mt->write_field_stop(protocol);
-  
+
   // write struct end
   mt->write_struct_end(protocol);
-  
+
   return Qnil;
 }
 
@@ -470,7 +470,7 @@
 
 static VALUE read_anything(VALUE protocol, int ttype, VALUE field_info) {
   VALUE result = Qnil;
-  
+
   if (ttype == TTYPE_BOOL) {
     result = mt->read_bool(protocol);
   } else if (ttype == TTYPE_BYTE) {
@@ -496,21 +496,21 @@
     int key_ttype = FIX2INT(rb_ary_entry(map_header, 0));
     int value_ttype = FIX2INT(rb_ary_entry(map_header, 1));
     int num_entries = FIX2INT(rb_ary_entry(map_header, 2));
-    
+
     VALUE key_info = rb_hash_aref(field_info, key_sym);
     VALUE value_info = rb_hash_aref(field_info, value_sym);
 
     result = rb_hash_new();
-    
+
     for (i = 0; i < num_entries; ++i) {
       VALUE key, val;
-      
+
       key = read_anything(protocol, key_ttype, key_info);
       val = read_anything(protocol, value_ttype, value_info);
-      
+
       rb_hash_aset(result, key, val);
     }
-    
+
     mt->read_map_end(protocol);
   } else if (ttype == TTYPE_LIST) {
     int i;
@@ -519,7 +519,7 @@
     int element_ttype = FIX2INT(rb_ary_entry(list_header, 0));
     int num_elements = FIX2INT(rb_ary_entry(list_header, 1));
     result = rb_ary_new2(num_elements);
-    
+
     for (i = 0; i < num_elements; ++i) {
       rb_ary_push(result, read_anything(protocol, element_ttype, rb_hash_aref(field_info, element_sym)));
     }
@@ -534,36 +534,36 @@
     int element_ttype = FIX2INT(rb_ary_entry(set_header, 0));
     int num_elements = FIX2INT(rb_ary_entry(set_header, 1));
     items = rb_ary_new2(num_elements);
-    
+
     for (i = 0; i < num_elements; ++i) {
       rb_ary_push(items, read_anything(protocol, element_ttype, rb_hash_aref(field_info, element_sym)));
     }
-    
+
 
     mt->read_set_end(protocol);
-    
+
     result = rb_class_new_instance(1, &items, rb_cSet);
   } else {
     rb_raise(rb_eNotImpError, "read_anything not implemented for type %d!", ttype);
   }
-  
+
   return result;
 }
 
 static VALUE rb_thrift_struct_read(VALUE self, VALUE protocol) {
-  check_native_proto_method_table(protocol);
-  
+  // check_native_proto_method_table(protocol);
+
   // read struct begin
   mt->read_struct_begin(protocol);
 
   VALUE struct_fields = STRUCT_FIELDS(self);
-  
+
   // read each field
   while (true) {
     VALUE field_header = mt->read_field_begin(protocol);
     VALUE field_type_value = rb_ary_entry(field_header, 1);
     int field_type = FIX2INT(field_type_value);
-    
+
     if (field_type == TTYPE_STOP) {
       break;
     }
@@ -583,23 +583,24 @@
     } else {
       rb_funcall(protocol, skip_method_id, 1, field_type_value);
     }
-    
+
     // read field end
     mt->read_field_end(protocol);
   }
-  
+
   // read struct end
   mt->read_struct_end(protocol);
-  
+
   return Qnil;
 }
 
 void Init_struct() {
   VALUE struct_module = rb_const_get(thrift_module, rb_intern("Struct"));
-  
+
   rb_define_method(struct_module, "write", rb_thrift_struct_write, 1);
   rb_define_method(struct_module, "read", rb_thrift_struct_read, 1);
-  
+
   set_default_proto_function_pointers();
+  mt = default_mt;
 }