diff --git a/ruby/ext/google/protobuf_c/map.c b/ruby/ext/google/protobuf_c/map.c index 88512fdcd4..55b7be4c66 100644 --- a/ruby/ext/google/protobuf_c/map.c +++ b/ruby/ext/google/protobuf_c/map.c @@ -538,8 +538,8 @@ VALUE Map_dup(VALUE _self) { return new_map; } -/* :nodoc: */ -static VALUE Map_deep_copy(VALUE _self) { +// Used by Google::Protobuf.deep_copy but not exposed directly. +VALUE Map_deep_copy(VALUE _self) { Map* self = ruby_to_Map(_self); VALUE new_map = Map_new_this_type(_self); Map* new_self = ruby_to_Map(new_map); @@ -851,6 +851,5 @@ void Map_register(VALUE module) { rb_define_method(klass, "to_h", Map_to_h, 0); rb_define_method(klass, "inspect", Map_inspect, 0); rb_define_method(klass, "merge", Map_merge, 1); - rb_define_method(klass, "deep_copy", Map_deep_copy, 0); rb_include_module(klass, rb_mEnumerable); } diff --git a/ruby/ext/google/protobuf_c/message.c b/ruby/ext/google/protobuf_c/message.c index 2714a321a6..850ab0eb5d 100644 --- a/ruby/ext/google/protobuf_c/message.c +++ b/ruby/ext/google/protobuf_c/message.c @@ -511,8 +511,8 @@ VALUE Message_dup(VALUE _self) { return new_msg; } -/* :nodoc: */ -static VALUE Message_deep_copy(VALUE _self) { +// Internal only; used by Google::Protobuf.deep_copy. +VALUE Message_deep_copy(VALUE _self) { MessageHeader* self; MessageHeader* new_msg_self; VALUE new_msg; @@ -742,7 +742,6 @@ VALUE build_class_from_descriptor(Descriptor* desc) { rb_define_method(klass, "to_s", Message_inspect, 0); rb_define_method(klass, "[]", Message_index, 1); rb_define_method(klass, "[]=", Message_index_set, 2); - rb_define_method(klass, "deep_copy", Message_deep_copy, 0); rb_define_singleton_method(klass, "decode", Message_decode, 1); rb_define_singleton_method(klass, "encode", Message_encode, 1); rb_define_singleton_method(klass, "decode_json", Message_decode_json, -1); @@ -830,3 +829,21 @@ VALUE build_module_from_enumdesc(EnumDescriptor* enumdesc) { return mod; } + +/* + * call-seq: + * Google::Protobuf.deep_copy(obj) => copy_of_obj + * + * Performs a deep copy of a RepeatedField instance, a Map instance, or a + * message object, recursively copying its members. + */ +VALUE Google_Protobuf_deep_copy(VALUE self, VALUE obj) { + VALUE klass = CLASS_OF(obj); + if (klass == cRepeatedField) { + return RepeatedField_deep_copy(obj); + } else if (klass == cMap) { + return Map_deep_copy(obj); + } else { + return Message_deep_copy(obj); + } +} diff --git a/ruby/ext/google/protobuf_c/protobuf.h b/ruby/ext/google/protobuf_c/protobuf.h index 0eb82a2421..8731eeb47b 100644 --- a/ruby/ext/google/protobuf_c/protobuf.h +++ b/ruby/ext/google/protobuf_c/protobuf.h @@ -425,6 +425,7 @@ VALUE RepeatedField_replace(VALUE _self, VALUE list); VALUE RepeatedField_clear(VALUE _self); VALUE RepeatedField_length(VALUE _self); VALUE RepeatedField_dup(VALUE _self); +VALUE RepeatedField_deep_copy(VALUE _self); VALUE RepeatedField_to_ary(VALUE _self); VALUE RepeatedField_eq(VALUE _self, VALUE _other); VALUE RepeatedField_hash(VALUE _self); @@ -468,6 +469,7 @@ VALUE Map_delete(VALUE _self, VALUE key); VALUE Map_clear(VALUE _self); VALUE Map_length(VALUE _self); VALUE Map_dup(VALUE _self); +VALUE Map_deep_copy(VALUE _self); VALUE Map_eq(VALUE _self, VALUE _other); VALUE Map_hash(VALUE _self); VALUE Map_to_h(VALUE _self); @@ -562,6 +564,7 @@ VALUE Message_alloc(VALUE klass); VALUE Message_method_missing(int argc, VALUE* argv, VALUE _self); VALUE Message_initialize(int argc, VALUE* argv, VALUE _self); VALUE Message_dup(VALUE _self); +VALUE Message_deep_copy(VALUE _self); VALUE Message_eq(VALUE _self, VALUE _other); VALUE Message_hash(VALUE _self); VALUE Message_inspect(VALUE _self); diff --git a/ruby/ext/google/protobuf_c/repeated_field.c b/ruby/ext/google/protobuf_c/repeated_field.c index e1d79249ad..29e829ef2c 100644 --- a/ruby/ext/google/protobuf_c/repeated_field.c +++ b/ruby/ext/google/protobuf_c/repeated_field.c @@ -355,8 +355,8 @@ VALUE RepeatedField_dup(VALUE _self) { return new_rptfield; } -/* :nodoc: */ -static VALUE RepeatedField_deep_copy(VALUE _self) { +// Internal only: used by Google::Protobuf.deep_copy. +VALUE RepeatedField_deep_copy(VALUE _self) { RepeatedField* self = ruby_to_RepeatedField(_self); VALUE new_rptfield = RepeatedField_new_this_type(_self); RepeatedField* new_rptfield_self = ruby_to_RepeatedField(new_rptfield); @@ -656,6 +656,5 @@ void RepeatedField_register(VALUE module) { rb_define_method(klass, "hash", RepeatedField_hash, 0); rb_define_method(klass, "+", RepeatedField_plus, 1); rb_define_method(klass, "concat", RepeatedField_concat, 1); - rb_define_method(klass, "deep_copy", RepeatedField_deep_copy, 0); rb_include_module(klass, rb_mEnumerable); } diff --git a/ruby/lib/google/protobuf.rb b/ruby/lib/google/protobuf.rb index 8c9d460cc0..464982e303 100644 --- a/ruby/lib/google/protobuf.rb +++ b/ruby/lib/google/protobuf.rb @@ -73,13 +73,5 @@ module Google klass.decode_json(json, options) end - # call-seq: - # Google::Protobuf.deep_copy(obj) => copy_of_obj - # - # Performs a deep copy of a RepeatedField instance, a Map instance, or a - # message object, recursively copying its members. - def self.deep_copy(obj) - obj.deep_copy - end end end