/* * 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); } }
void native_slot_deep_copy(upb_fieldtype_t type, void* to, void* from) { switch (type) { case UPB_TYPE_STRING: case UPB_TYPE_BYTES: { VALUE from_val = DEREF(from, VALUE); DEREF(to, VALUE) = (from_val != Qnil) ? rb_funcall(from_val, rb_intern("dup"), 0) : Qnil; break; } case UPB_TYPE_MESSAGE: { VALUE from_val = DEREF(from, VALUE); DEREF(to, VALUE) = (from_val != Qnil) ? Message_deep_copy(from_val) : Qnil; break; } default: memcpy(to, from, native_slot_size(type)); } }