diff options
author | Joshua Haberman <jhaberman@gmail.com> | 2015-01-13 13:50:11 -0800 |
---|---|---|
committer | Joshua Haberman <jhaberman@gmail.com> | 2015-01-13 13:50:11 -0800 |
commit | 5446deaea7ffc29f6e09368cb6238da083969123 (patch) | |
tree | 994ba61d6441558edbff629b3da99d31552600bb /ruby/ext/google/protobuf_c/message.c | |
parent | 052e0205a76717f39fc65e303fd2b92ab1df3028 (diff) | |
parent | ace4212e60bf1abd46181c9ddb9fe31b6d9fac45 (diff) | |
download | protobuf-5446deaea7ffc29f6e09368cb6238da083969123.tar.gz protobuf-5446deaea7ffc29f6e09368cb6238da083969123.tar.bz2 protobuf-5446deaea7ffc29f6e09368cb6238da083969123.zip |
Merge pull request #155 from cfallin/ruby-maps
Support for maps in the MRI C Ruby extension.
Diffstat (limited to 'ruby/ext/google/protobuf_c/message.c')
-rw-r--r-- | ruby/ext/google/protobuf_c/message.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/ruby/ext/google/protobuf_c/message.c b/ruby/ext/google/protobuf_c/message.c index 105b7807..ee8881d4 100644 --- a/ruby/ext/google/protobuf_c/message.c +++ b/ruby/ext/google/protobuf_c/message.c @@ -139,7 +139,14 @@ int Message_initialize_kwarg(VALUE key, VALUE val, VALUE _self) { "Unknown field name in initialization map entry."); } - if (upb_fielddef_label(f) == UPB_LABEL_REPEATED) { + if (is_map_field(f)) { + if (TYPE(val) != T_HASH) { + rb_raise(rb_eArgError, + "Expected Hash object as initializer value for map field."); + } + VALUE map = layout_get(self->descriptor->layout, Message_data(self), f); + Map_merge_into_self(map, val); + } else if (upb_fielddef_label(f) == UPB_LABEL_REPEATED) { if (TYPE(val) != T_ARRAY) { rb_raise(rb_eArgError, "Expected array as initializer value for repeated field."); @@ -450,13 +457,15 @@ VALUE build_module_from_enumdesc(EnumDescriptor* enumdesc) { * call-seq: * Google::Protobuf.deep_copy(obj) => copy_of_obj * - * Performs a deep copy of either a RepeatedField instance or a message object, - * recursively copying its members. + * 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); } |