Fix separate issues in JRuby's "native" `dup` and `inspect` methods. (#15265)

Update the stress test to exercise `proto3_optional` fields.

Closes #15265

COPYBARA_INTEGRATE_REVIEW=https://github.com/protocolbuffers/protobuf/pull/15265 from protocolbuffers:fix_jruby_proto3_optional 4040e13a7b
PiperOrigin-RevId: 596028361
pull/15306/head
Jason Lunn 1 year ago committed by Copybara-Service
parent a8b8ea02b7
commit bb38ba5575
  1. 5
      ruby/src/main/java/com/google/protobuf/jruby/RubyMessage.java
  2. 4
      ruby/tests/stress.proto
  3. 4
      ruby/tests/stress.rb

@ -203,7 +203,7 @@ public class RubyMessage extends RubyObject {
sb.append(cname).append(colon);
for (FieldDescriptor fd : descriptor.getFields()) {
if (fd.hasPresence() && !fields.containsKey(fd)) {
if (fd.hasPresence() && !(fields.containsKey(fd) || builder.hasField(fd))) {
continue;
}
if (addComma) {
@ -551,7 +551,8 @@ public class RubyMessage extends RubyObject {
} else if (fields.containsKey(fieldDescriptor)) {
dup.setFieldInternal(context, fieldDescriptor, fields.get(fieldDescriptor));
} else if (this.builder.hasField(fieldDescriptor)) {
dup.fields.put(
dup.setFieldInternal(
context,
fieldDescriptor,
wrapField(context, fieldDescriptor, this.builder.getField(fieldDescriptor)));
}

@ -3,10 +3,10 @@ syntax = "proto3";
package stress_test_protos;
message TestMessage {
int32 a = 1;
optional int32 a = 1;
repeated M b = 2;
}
message M {
string foo = 1;
optional string foo = 1;
}

@ -19,9 +19,11 @@ module StressTest
data = TestMessage.encode(m)
100_000.times do
mnew = TestMessage.decode(data)
mnew = mnew.dup
mnew2 = mnew.dup
assert_equal m.inspect, mnew.inspect
assert_equal data, TestMessage.encode(mnew)
assert_equal m.inspect, mnew2.inspect
assert_equal data, TestMessage.encode(mnew2)
end
end
end

Loading…
Cancel
Save