You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by br...@apache.org on 2011/06/10 00:46:28 UTC
svn commit: r1134122 - in /thrift/trunk:
compiler/cpp/src/generate/t_rb_generator.cc lib/rb/ext/constants.h
lib/rb/ext/struct.c lib/rb/ext/thrift_native.c
lib/rb/lib/thrift/struct_union.rb
Author: bryanduxbury
Date: Thu Jun 9 22:46:28 2011
New Revision: 1134122
URL: http://svn.apache.org/viewvc?rev=1134122&view=rev
Log:
THRIFT-418. rb: Don't do runtime sorting of struct fields
Patch: Ilya Maykov
Modified:
thrift/trunk/compiler/cpp/src/generate/t_rb_generator.cc
thrift/trunk/lib/rb/ext/constants.h
thrift/trunk/lib/rb/ext/struct.c
thrift/trunk/lib/rb/ext/thrift_native.c
thrift/trunk/lib/rb/lib/thrift/struct_union.rb
Modified: thrift/trunk/compiler/cpp/src/generate/t_rb_generator.cc
URL: http://svn.apache.org/viewvc/thrift/trunk/compiler/cpp/src/generate/t_rb_generator.cc?rev=1134122&r1=1134121&r2=1134122&view=diff
==============================================================================
--- thrift/trunk/compiler/cpp/src/generate/t_rb_generator.cc (original)
+++ thrift/trunk/compiler/cpp/src/generate/t_rb_generator.cc Thu Jun 9 22:46:28 2011
@@ -620,9 +620,13 @@ void t_rb_generator::generate_field_defn
indent_down();
out << endl;
indent(out) << "}" << endl << endl;
-
+
+ // Generate the pre-sorted array of field ids, used for iterating through the fields in sorted order.
+ indent(out) << "FIELD_IDS = FIELDS.keys.sort" << endl << endl;
+
indent(out) << "def struct_fields; FIELDS; end" << endl << endl;
-
+
+ indent(out) << "def struct_field_ids; FIELD_IDS; end" << endl << endl;
}
void t_rb_generator::generate_field_data(std::ofstream& out, t_type* field_type,
Modified: thrift/trunk/lib/rb/ext/constants.h
URL: http://svn.apache.org/viewvc/thrift/trunk/lib/rb/ext/constants.h?rev=1134122&r1=1134121&r2=1134122&view=diff
==============================================================================
--- thrift/trunk/lib/rb/ext/constants.h (original)
+++ thrift/trunk/lib/rb/ext/constants.h Thu Jun 9 22:46:28 2011
@@ -77,6 +77,7 @@ extern ID read_all_method_id;
extern ID native_qmark_method_id;
extern ID fields_const_id;
+extern ID field_ids_const_id;
extern ID transport_ivar_id;
extern ID strict_read_ivar_id;
extern ID strict_write_ivar_id;
Modified: thrift/trunk/lib/rb/ext/struct.c
URL: http://svn.apache.org/viewvc/thrift/trunk/lib/rb/ext/struct.c?rev=1134122&r1=1134121&r2=1134122&view=diff
==============================================================================
--- thrift/trunk/lib/rb/ext/struct.c (original)
+++ thrift/trunk/lib/rb/ext/struct.c Thu Jun 9 22:46:28 2011
@@ -58,6 +58,7 @@ ID name_to_id_method_id;
#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)
+#define STRUCT_FIELD_IDS(obj) rb_const_get(CLASS_OF(obj), field_ids_const_id)
//-------------------------------------------
// Writing section
@@ -375,9 +376,7 @@ static VALUE rb_thrift_struct_write(VALU
// 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);
+ VALUE struct_field_ids_ordered = STRUCT_FIELD_IDS(self);
int i = 0;
for (i=0; i < RARRAY_LEN(struct_field_ids_ordered); i++) {
Modified: thrift/trunk/lib/rb/ext/thrift_native.c
URL: http://svn.apache.org/viewvc/thrift/trunk/lib/rb/ext/thrift_native.c?rev=1134122&r1=1134121&r2=1134122&view=diff
==============================================================================
--- thrift/trunk/lib/rb/ext/thrift_native.c (original)
+++ thrift/trunk/lib/rb/ext/thrift_native.c Thu Jun 9 22:46:28 2011
@@ -92,6 +92,7 @@ ID native_qmark_method_id;
// constant ids
ID fields_const_id;
+ID field_ids_const_id;
ID transport_ivar_id;
ID strict_read_ivar_id;
ID strict_write_ivar_id;
@@ -174,6 +175,7 @@ void Init_thrift_native() {
// constant ids
fields_const_id = rb_intern("FIELDS");
+ field_ids_const_id = rb_intern("FIELD_IDS");
transport_ivar_id = rb_intern("@trans");
strict_read_ivar_id = rb_intern("@strict_read");
strict_write_ivar_id = rb_intern("@strict_write");
Modified: thrift/trunk/lib/rb/lib/thrift/struct_union.rb
URL: http://svn.apache.org/viewvc/thrift/trunk/lib/rb/lib/thrift/struct_union.rb?rev=1134122&r1=1134121&r2=1134122&view=diff
==============================================================================
--- thrift/trunk/lib/rb/lib/thrift/struct_union.rb (original)
+++ thrift/trunk/lib/rb/lib/thrift/struct_union.rb Thu Jun 9 22:46:28 2011
@@ -33,7 +33,7 @@ module Thrift
end
def each_field
- struct_fields.keys.sort.each do |fid|
+ struct_field_ids.each do |fid|
data = struct_fields[fid]
yield fid, data
end