Index: third_party/protobuf/ruby/ext/google/protobuf_c/repeated_field.c |
diff --git a/third_party/protobuf/ruby/ext/google/protobuf_c/repeated_field.c b/third_party/protobuf/ruby/ext/google/protobuf_c/repeated_field.c |
index 1c651c192ddcf5d3181cd9d52fe4ddf546ff7bfc..83afbc915db46c39626e79a3d295a70d9da6df54 100644 |
--- a/third_party/protobuf/ruby/ext/google/protobuf_c/repeated_field.c |
+++ b/third_party/protobuf/ruby/ext/google/protobuf_c/repeated_field.c |
@@ -244,11 +244,6 @@ void* RepeatedField_index_native(VALUE _self, int index) { |
return RepeatedField_memoryat(self, index, element_size); |
} |
-int RepeatedField_size(VALUE _self) { |
- RepeatedField* self = ruby_to_RepeatedField(_self); |
- return self->size; |
-} |
- |
/* |
* Private ruby method, used by RepeatedField.pop |
*/ |
@@ -447,8 +442,9 @@ VALUE RepeatedField_eq(VALUE _self, VALUE _other) { |
*/ |
VALUE RepeatedField_hash(VALUE _self) { |
RepeatedField* self = ruby_to_RepeatedField(_self); |
- st_index_t h = rb_hash_start(0); |
- VALUE hash_sym = rb_intern("hash"); |
+ |
+ VALUE hash = LL2NUM(0); |
+ |
upb_fieldtype_t field_type = self->field_type; |
VALUE field_type_class = self->field_type_class; |
size_t elem_size = native_slot_size(field_type); |
@@ -456,11 +452,12 @@ VALUE RepeatedField_hash(VALUE _self) { |
for (int i = 0; i < self->size; i++, off += elem_size) { |
void* mem = ((uint8_t *)self->elements) + off; |
VALUE elem = native_slot_get(field_type, field_type_class, mem); |
- h = rb_hash_uint(h, NUM2LONG(rb_funcall(elem, hash_sym, 0))); |
+ hash = rb_funcall(hash, rb_intern("<<"), 1, INT2NUM(2)); |
+ hash = rb_funcall(hash, rb_intern("^"), 1, |
+ rb_funcall(elem, rb_intern("hash"), 0)); |
} |
- h = rb_hash_end(h); |
- return INT2FIX(h); |
+ return hash; |
} |
/* |