From d5ef16c6eb6ee2f2a998926b702a6c54cc4f2f88 Mon Sep 17 00:00:00 2001 From: Adam Cozzette Date: Wed, 9 Feb 2022 10:21:13 -0800 Subject: [PATCH] Ruby: rename max_recursion_depth to recursion_limit (#9486) This will help keep the terminology consistent with the other language implementations. --- ruby/ext/google/protobuf_c/message.c | 8 ++-- .../com/google/protobuf/jruby/RubyMap.java | 4 +- .../google/protobuf/jruby/RubyMessage.java | 38 +++++++++---------- ruby/tests/common_tests.rb | 2 +- ruby/tests/encode_decode_test.rb | 8 ++-- 5 files changed, 30 insertions(+), 30 deletions(-) diff --git a/ruby/ext/google/protobuf_c/message.c b/ruby/ext/google/protobuf_c/message.c index 8d25b7928c..b889230843 100644 --- a/ruby/ext/google/protobuf_c/message.c +++ b/ruby/ext/google/protobuf_c/message.c @@ -959,7 +959,7 @@ static VALUE Message_index_set(VALUE _self, VALUE field_name, VALUE value) { * format) under the interpretration given by this message class's definition * and returns a message object with the corresponding field values. * @param options [Hash] options for the decoder - * max_recursion_depth: set to maximum decoding depth for message (default is 64) + * recursion_limit: set to maximum decoding depth for message (default is 64) */ static VALUE Message_decode(int argc, VALUE* argv, VALUE klass) { VALUE data = argv[0]; @@ -975,7 +975,7 @@ static VALUE Message_decode(int argc, VALUE* argv, VALUE klass) { rb_raise(rb_eArgError, "Expected hash arguments."); } - VALUE depth = rb_hash_lookup(hash_args, ID2SYM(rb_intern("max_recursion_depth"))); + VALUE depth = rb_hash_lookup(hash_args, ID2SYM(rb_intern("recursion_limit"))); if (depth != Qnil && TYPE(depth) == T_FIXNUM) { options |= UPB_DECODE_MAXDEPTH(FIX2INT(depth)); @@ -1070,7 +1070,7 @@ static VALUE Message_decode_json(int argc, VALUE* argv, VALUE klass) { * Encodes the given message object to its serialized form in protocol buffers * wire format. * @param options [Hash] options for the encoder - * max_recursion_depth: set to maximum encoding depth for message (default is 64) + * recursion_limit: set to maximum encoding depth for message (default is 64) */ static VALUE Message_encode(int argc, VALUE* argv, VALUE klass) { Message* msg = ruby_to_Message(argv[0]); @@ -1091,7 +1091,7 @@ static VALUE Message_encode(int argc, VALUE* argv, VALUE klass) { if (TYPE(hash_args) != T_HASH) { rb_raise(rb_eArgError, "Expected hash arguments."); } - VALUE depth = rb_hash_lookup(hash_args, ID2SYM(rb_intern("max_recursion_depth"))); + VALUE depth = rb_hash_lookup(hash_args, ID2SYM(rb_intern("recursion_limit"))); if (depth != Qnil && TYPE(depth) == T_FIXNUM) { options |= UPB_DECODE_MAXDEPTH(FIX2INT(depth)); diff --git a/ruby/src/main/java/com/google/protobuf/jruby/RubyMap.java b/ruby/src/main/java/com/google/protobuf/jruby/RubyMap.java index b5e4903e2e..7956eebe76 100644 --- a/ruby/src/main/java/com/google/protobuf/jruby/RubyMap.java +++ b/ruby/src/main/java/com/google/protobuf/jruby/RubyMap.java @@ -389,7 +389,7 @@ public class RubyMap extends RubyObject { return newMap; } - protected List build(ThreadContext context, RubyDescriptor descriptor, int depth, int maxRecursionDepth) { + protected List build(ThreadContext context, RubyDescriptor descriptor, int depth, int recursionLimit) { List list = new ArrayList(); RubyClass rubyClass = (RubyClass) descriptor.msgclass(context); FieldDescriptor keyField = descriptor.getField("key"); @@ -398,7 +398,7 @@ public class RubyMap extends RubyObject { RubyMessage mapMessage = (RubyMessage) rubyClass.newInstance(context, Block.NULL_BLOCK); mapMessage.setField(context, keyField, key); mapMessage.setField(context, valueField, table.get(key)); - list.add(mapMessage.build(context, depth + 1, maxRecursionDepth)); + list.add(mapMessage.build(context, depth + 1, recursionLimit)); } return list; } diff --git a/ruby/src/main/java/com/google/protobuf/jruby/RubyMessage.java b/ruby/src/main/java/com/google/protobuf/jruby/RubyMessage.java index 2ba132e628..b0a1f9010b 100644 --- a/ruby/src/main/java/com/google/protobuf/jruby/RubyMessage.java +++ b/ruby/src/main/java/com/google/protobuf/jruby/RubyMessage.java @@ -467,7 +467,7 @@ public class RubyMessage extends RubyObject { * Encodes the given message object to its serialized form in protocol buffers * wire format. * @param options [Hash] options for the encoder - * max_recursion_depth: set to maximum encoding depth for message (default is 64) + * recursion_limit: set to maximum encoding depth for message (default is 64) */ @JRubyMethod(required = 1, optional = 1, meta = true) public static IRubyObject encode(ThreadContext context, IRubyObject recv, IRubyObject[] args) { @@ -475,17 +475,17 @@ public class RubyMessage extends RubyObject { throw context.runtime.newArgumentError("Tried to encode a " + args[0].getMetaClass() + " message with " + recv); } RubyMessage message = (RubyMessage) args[0]; - int maxRecursionDepthInt = SINK_MAXIMUM_NESTING; + int recursionLimitInt = SINK_MAXIMUM_NESTING; if (args.length > 1) { RubyHash options = (RubyHash) args[1]; - IRubyObject maxRecursionDepth = options.fastARef(context.runtime.newSymbol("max_recursion_depth")); + IRubyObject recursionLimit = options.fastARef(context.runtime.newSymbol("recursion_limit")); - if (maxRecursionDepth != null) { - maxRecursionDepthInt = ((RubyNumeric) maxRecursionDepth).getIntValue(); + if (recursionLimit != null) { + recursionLimitInt = ((RubyNumeric) recursionLimit).getIntValue(); } } - return context.runtime.newString(new ByteList(message.build(context, 0, maxRecursionDepthInt).toByteArray())); + return context.runtime.newString(new ByteList(message.build(context, 0, recursionLimitInt).toByteArray())); } /* @@ -496,7 +496,7 @@ public class RubyMessage extends RubyObject { * format) under the interpretation given by this message class's definition * and returns a message object with the corresponding field values. * @param options [Hash] options for the decoder - * max_recursion_depth: set to maximum decoding depth for message (default is 100) + * recursion_limit: set to maximum decoding depth for message (default is 100) */ @JRubyMethod(required = 1, optional = 1, meta = true) public static IRubyObject decode(ThreadContext context, IRubyObject recv, IRubyObject[] args) { @@ -510,9 +510,9 @@ public class RubyMessage extends RubyObject { throw context.runtime.newArgumentError("Expected hash arguments."); } - IRubyObject maxRecursionDepth = ((RubyHash) args[1]).fastARef(context.runtime.newSymbol("max_recursion_depth")); - if (maxRecursionDepth != null) { - input.setRecursionLimit(((RubyNumeric) maxRecursionDepth).getIntValue()); + IRubyObject recursionLimit = ((RubyHash) args[1]).fastARef(context.runtime.newSymbol("recursion_limit")); + if (recursionLimit != null) { + input.setRecursionLimit(((RubyNumeric) recursionLimit).getIntValue()); } } @@ -664,9 +664,9 @@ public class RubyMessage extends RubyObject { return ret; } - protected DynamicMessage build(ThreadContext context, int depth, int maxRecursionDepth) { - if (depth >= maxRecursionDepth) { - throw context.runtime.newRuntimeError("Maximum recursion depth exceeded during encoding."); + protected DynamicMessage build(ThreadContext context, int depth, int recursionLimit) { + if (depth >= recursionLimit) { + throw context.runtime.newRuntimeError("Recursion limit exceeded during encoding."); } // Handle the typical case where the fields.keySet contain the fieldDescriptors @@ -676,7 +676,7 @@ public class RubyMessage extends RubyObject { if (value instanceof RubyMap) { builder.clearField(fieldDescriptor); RubyDescriptor mapDescriptor = (RubyDescriptor) getDescriptorForField(context, fieldDescriptor); - for (DynamicMessage kv : ((RubyMap) value).build(context, mapDescriptor, depth, maxRecursionDepth)) { + for (DynamicMessage kv : ((RubyMap) value).build(context, mapDescriptor, depth, recursionLimit)) { builder.addRepeatedField(fieldDescriptor, kv); } @@ -685,7 +685,7 @@ public class RubyMessage extends RubyObject { builder.clearField(fieldDescriptor); for (int i = 0; i < repeatedField.size(); i++) { - Object item = convert(context, fieldDescriptor, repeatedField.get(i), depth, maxRecursionDepth, + Object item = convert(context, fieldDescriptor, repeatedField.get(i), depth, recursionLimit, /*isDefaultValueForBytes*/ false); builder.addRepeatedField(fieldDescriptor, item); } @@ -707,7 +707,7 @@ public class RubyMessage extends RubyObject { fieldDescriptor.getFullName().equals("google.protobuf.FieldDescriptorProto.default_value")) { isDefaultStringForBytes = true; } - builder.setField(fieldDescriptor, convert(context, fieldDescriptor, value, depth, maxRecursionDepth, isDefaultStringForBytes)); + builder.setField(fieldDescriptor, convert(context, fieldDescriptor, value, depth, recursionLimit, isDefaultStringForBytes)); } } @@ -727,7 +727,7 @@ public class RubyMessage extends RubyObject { builder.clearField(fieldDescriptor); RubyDescriptor mapDescriptor = (RubyDescriptor) getDescriptorForField(context, fieldDescriptor); - for (DynamicMessage kv : ((RubyMap) value).build(context, mapDescriptor, depth, maxRecursionDepth)) { + for (DynamicMessage kv : ((RubyMap) value).build(context, mapDescriptor, depth, recursionLimit)) { builder.addRepeatedField(fieldDescriptor, kv); } } @@ -839,7 +839,7 @@ public class RubyMessage extends RubyObject { // convert a ruby object to protobuf type, skip type check since it is checked on the way in private Object convert(ThreadContext context, FieldDescriptor fieldDescriptor, - IRubyObject value, int depth, int maxRecursionDepth, + IRubyObject value, int depth, int recursionLimit, boolean isDefaultStringForBytes) { Object val = null; switch (fieldDescriptor.getType()) { @@ -881,7 +881,7 @@ public class RubyMessage extends RubyObject { } break; case MESSAGE: - val = ((RubyMessage) value).build(context, depth + 1, maxRecursionDepth); + val = ((RubyMessage) value).build(context, depth + 1, recursionLimit); break; case ENUM: EnumDescriptor enumDescriptor = fieldDescriptor.getEnumType(); diff --git a/ruby/tests/common_tests.rb b/ruby/tests/common_tests.rb index 3ab9a0ca84..cd48b6916f 100644 --- a/ruby/tests/common_tests.rb +++ b/ruby/tests/common_tests.rb @@ -1245,7 +1245,7 @@ module CommonTests struct = struct_from_ruby(JSON.parse(json)) assert_equal json, struct.to_json - assert_raise(RuntimeError, "Maximum recursion depth exceeded during encoding") do + assert_raise(RuntimeError, "Recursion limit exceeded during encoding") do struct = Google::Protobuf::Struct.new struct.fields["foobar"] = Google::Protobuf::Value.new(struct_value: struct) Google::Protobuf::Struct.encode(struct) diff --git a/ruby/tests/encode_decode_test.rb b/ruby/tests/encode_decode_test.rb index 9513cc37d9..df2cd3632d 100755 --- a/ruby/tests/encode_decode_test.rb +++ b/ruby/tests/encode_decode_test.rb @@ -119,10 +119,10 @@ class EncodeDecodeTest < Test::Unit::TestCase assert_match msg.to_json, msg_out.to_json assert_raise Google::Protobuf::ParseError do - A::B::C::TestMessage.decode(msg_encoded, { max_recursion_depth: 4 }) + A::B::C::TestMessage.decode(msg_encoded, { recursion_limit: 4 }) end - msg_out = A::B::C::TestMessage.decode(msg_encoded, { max_recursion_depth: 5 }) + msg_out = A::B::C::TestMessage.decode(msg_encoded, { recursion_limit: 5 }) assert_match msg.to_json, msg_out.to_json end @@ -144,10 +144,10 @@ class EncodeDecodeTest < Test::Unit::TestCase assert_match msg.to_json, msg_out.to_json assert_raise RuntimeError do - A::B::C::TestMessage.encode(msg, { max_recursion_depth: 5 }) + A::B::C::TestMessage.encode(msg, { recursion_limit: 5 }) end - msg_encoded = A::B::C::TestMessage.encode(msg, { max_recursion_depth: 6 }) + msg_encoded = A::B::C::TestMessage.encode(msg, { recursion_limit: 6 }) msg_out = A::B::C::TestMessage.decode(msg_encoded) assert_match msg.to_json, msg_out.to_json end