mirror of
https://github.com/valitydev/thrift.git
synced 2024-11-07 10:48:51 +00:00
THRIFT-418. rb: Don't do runtime sorting of struct fields
A simpler version of the already-committed patch. Patch: Ilya Maykov git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1136189 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
6e292e5bfa
commit
d1df20a20d
@ -620,13 +620,9 @@ void t_rb_generator::generate_field_defns(std::ofstream& out, t_struct* tstruct)
|
|||||||
indent_down();
|
indent_down();
|
||||||
out << endl;
|
out << endl;
|
||||||
indent(out) << "}" << endl << 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_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,
|
void t_rb_generator::generate_field_data(std::ofstream& out, t_type* field_type,
|
||||||
|
@ -77,7 +77,6 @@ extern ID read_all_method_id;
|
|||||||
extern ID native_qmark_method_id;
|
extern ID native_qmark_method_id;
|
||||||
|
|
||||||
extern ID fields_const_id;
|
extern ID fields_const_id;
|
||||||
extern ID field_ids_const_id;
|
|
||||||
extern ID transport_ivar_id;
|
extern ID transport_ivar_id;
|
||||||
extern ID strict_read_ivar_id;
|
extern ID strict_read_ivar_id;
|
||||||
extern ID strict_write_ivar_id;
|
extern ID strict_write_ivar_id;
|
||||||
|
@ -55,10 +55,10 @@ ID setvalue_id;
|
|||||||
|
|
||||||
ID to_s_method_id;
|
ID to_s_method_id;
|
||||||
ID name_to_id_method_id;
|
ID name_to_id_method_id;
|
||||||
|
static ID sorted_field_ids_method_id;
|
||||||
|
|
||||||
#define IS_CONTAINER(ttype) ((ttype) == TTYPE_MAP || (ttype) == TTYPE_LIST || (ttype) == TTYPE_SET)
|
#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_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
|
// Writing section
|
||||||
@ -376,11 +376,11 @@ static VALUE rb_thrift_struct_write(VALUE self, VALUE protocol) {
|
|||||||
|
|
||||||
// iterate through all the fields here
|
// iterate through all the fields here
|
||||||
VALUE struct_fields = STRUCT_FIELDS(self);
|
VALUE struct_fields = STRUCT_FIELDS(self);
|
||||||
VALUE struct_field_ids_ordered = STRUCT_FIELD_IDS(self);
|
VALUE sorted_field_ids = rb_funcall(self, sorted_field_ids_method_id, 0);
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (i=0; i < RARRAY_LEN(struct_field_ids_ordered); i++) {
|
for (i=0; i < RARRAY_LEN(sorted_field_ids); i++) {
|
||||||
VALUE field_id = rb_ary_entry(struct_field_ids_ordered, i);
|
VALUE field_id = rb_ary_entry(sorted_field_ids, i);
|
||||||
|
|
||||||
VALUE field_info = rb_hash_aref(struct_fields, field_id);
|
VALUE field_info = rb_hash_aref(struct_fields, field_id);
|
||||||
|
|
||||||
@ -713,4 +713,5 @@ void Init_struct() {
|
|||||||
|
|
||||||
to_s_method_id = rb_intern("to_s");
|
to_s_method_id = rb_intern("to_s");
|
||||||
name_to_id_method_id = rb_intern("name_to_id");
|
name_to_id_method_id = rb_intern("name_to_id");
|
||||||
|
sorted_field_ids_method_id = rb_intern("sorted_field_ids");
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,6 @@ ID native_qmark_method_id;
|
|||||||
|
|
||||||
// constant ids
|
// constant ids
|
||||||
ID fields_const_id;
|
ID fields_const_id;
|
||||||
ID field_ids_const_id;
|
|
||||||
ID transport_ivar_id;
|
ID transport_ivar_id;
|
||||||
ID strict_read_ivar_id;
|
ID strict_read_ivar_id;
|
||||||
ID strict_write_ivar_id;
|
ID strict_write_ivar_id;
|
||||||
@ -175,7 +174,6 @@ void Init_thrift_native() {
|
|||||||
|
|
||||||
// constant ids
|
// constant ids
|
||||||
fields_const_id = rb_intern("FIELDS");
|
fields_const_id = rb_intern("FIELDS");
|
||||||
field_ids_const_id = rb_intern("FIELD_IDS");
|
|
||||||
transport_ivar_id = rb_intern("@trans");
|
transport_ivar_id = rb_intern("@trans");
|
||||||
strict_read_ivar_id = rb_intern("@strict_read");
|
strict_read_ivar_id = rb_intern("@strict_read");
|
||||||
strict_write_ivar_id = rb_intern("@strict_write");
|
strict_write_ivar_id = rb_intern("@strict_write");
|
||||||
|
@ -32,8 +32,17 @@ module Thrift
|
|||||||
names_to_ids[name]
|
names_to_ids[name]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def sorted_field_ids
|
||||||
|
sorted_field_ids = self.class.instance_variable_get(:@sorted_field_ids)
|
||||||
|
unless sorted_field_ids
|
||||||
|
sorted_field_ids = struct_fields.keys.sort
|
||||||
|
self.class.instance_variable_set(:@sorted_field_ids, sorted_field_ids)
|
||||||
|
end
|
||||||
|
sorted_field_ids
|
||||||
|
end
|
||||||
|
|
||||||
def each_field
|
def each_field
|
||||||
struct_field_ids.each do |fid|
|
sorted_field_ids.each do |fid|
|
||||||
data = struct_fields[fid]
|
data = struct_fields[fid]
|
||||||
yield fid, data
|
yield fid, data
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user