THRIFT-418. rb: Don't do runtime sorting of struct fields
Patch: Ilya Maykov
git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1134122 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/rb/ext/constants.h b/lib/rb/ext/constants.h
index 57df544..38b1d61 100644
--- a/lib/rb/ext/constants.h
+++ b/lib/rb/ext/constants.h
@@ -77,6 +77,7 @@
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;
diff --git a/lib/rb/ext/struct.c b/lib/rb/ext/struct.c
index 90c4b05..4455c1c 100644
--- a/lib/rb/ext/struct.c
+++ b/lib/rb/ext/struct.c
@@ -58,6 +58,7 @@
#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 @@
// 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++) {
diff --git a/lib/rb/ext/thrift_native.c b/lib/rb/ext/thrift_native.c
index 09b9fe4..2a61a3e 100644
--- a/lib/rb/ext/thrift_native.c
+++ b/lib/rb/ext/thrift_native.c
@@ -92,6 +92,7 @@
// 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 @@
// 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");
diff --git a/lib/rb/lib/thrift/struct_union.rb b/lib/rb/lib/thrift/struct_union.rb
index 849c856..8627508 100644
--- a/lib/rb/lib/thrift/struct_union.rb
+++ b/lib/rb/lib/thrift/struct_union.rb
@@ -33,7 +33,7 @@
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