From d69f482883309840eef9108fbce6eb32d05db98f Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Mon, 29 Mar 2021 17:35:21 -0700 Subject: [PATCH 1/2] Fixed message equality in cases where the message type is different. If the message types are different, equality comparison must return false. --- ruby/ext/google/protobuf_c/message.c | 3 ++- ruby/tests/common_tests.rb | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ruby/ext/google/protobuf_c/message.c b/ruby/ext/google/protobuf_c/message.c index b01741b61ce..e3e6f94bb43 100644 --- a/ruby/ext/google/protobuf_c/message.c +++ b/ruby/ext/google/protobuf_c/message.c @@ -704,7 +704,8 @@ static VALUE Message_eq(VALUE _self, VALUE _other) { Message* self = ruby_to_Message(_self); Message* other = ruby_to_Message(_other); - return Message_Equal(self->msg, other->msg, self->msgdef) + return self->msgdef == other->msgdef && + Message_Equal(self->msg, other->msg, self->msgdef) ? Qtrue : Qfalse; } diff --git a/ruby/tests/common_tests.rb b/ruby/tests/common_tests.rb index 1957422fa93..3549ca7414d 100644 --- a/ruby/tests/common_tests.rb +++ b/ruby/tests/common_tests.rb @@ -687,12 +687,13 @@ def test_deep_copy assert m.repeated_msg[0].object_id != m2.repeated_msg[0].object_id end - def test_eq + def test_message_eq m = proto_module::TestMessage.new(:optional_int32 => 42, :repeated_int32 => [1, 2, 3]) m2 = proto_module::TestMessage.new(:optional_int32 => 43, :repeated_int32 => [1, 2, 3]) assert m != m2 + assert_not_equal proto_module::TestMessage.new, proto_module::TestMessage2.new end def test_enum_lookup From 38e1b592581983548eb8012e45a3a1da64b6504f Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Thu, 1 Apr 2021 10:22:35 -0700 Subject: [PATCH 2/2] Elided the TYPE() and msgdef checks by using CLASS_OF. --- ruby/ext/google/protobuf_c/message.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/ruby/ext/google/protobuf_c/message.c b/ruby/ext/google/protobuf_c/message.c index e3e6f94bb43..1eb0cb76dc8 100644 --- a/ruby/ext/google/protobuf_c/message.c +++ b/ruby/ext/google/protobuf_c/message.c @@ -697,17 +697,13 @@ bool Message_Equal(const upb_msg *m1, const upb_msg *m2, const upb_msgdef *m) { * field is of a primitive type). */ static VALUE Message_eq(VALUE _self, VALUE _other) { - if (TYPE(_self) != TYPE(_other)) { - return Qfalse; - } + if (CLASS_OF(_self) != CLASS_OF(_other)) return Qfalse; Message* self = ruby_to_Message(_self); Message* other = ruby_to_Message(_other); + assert(self->msgdef == other->msgdef); - return self->msgdef == other->msgdef && - Message_Equal(self->msg, other->msg, self->msgdef) - ? Qtrue - : Qfalse; + return Message_Equal(self->msg, other->msg, self->msgdef) ? Qtrue : Qfalse; } uint64_t Message_Hash(const upb_msg* msg, const upb_msgdef* m, uint64_t seed) {