1# Protocol Buffers - Google's data interchange format 2# Copyright 2023 Google Inc. All rights reserved. 3# 4# Use of this source code is governed by a BSD-style 5# license that can be found in the LICENSE file or at 6# https://developers.google.com/open-source/licenses/bsd 7 8require 'ffi-compiler/loader' 9require 'google/protobuf/ffi/ffi' 10require 'google/protobuf/ffi/internal/type_safety' 11require 'google/protobuf/ffi/internal/pointer_helper' 12require 'google/protobuf/ffi/internal/arena' 13require 'google/protobuf/ffi/internal/convert' 14require 'google/protobuf/ffi/descriptor' 15require 'google/protobuf/ffi/enum_descriptor' 16require 'google/protobuf/ffi/field_descriptor' 17require 'google/protobuf/ffi/oneof_descriptor' 18require 'google/protobuf/ffi/method_descriptor' 19require 'google/protobuf/ffi/service_descriptor' 20require 'google/protobuf/ffi/descriptor_pool' 21require 'google/protobuf/ffi/file_descriptor' 22require 'google/protobuf/ffi/map' 23require 'google/protobuf/ffi/object_cache' 24require 'google/protobuf/ffi/repeated_field' 25require 'google/protobuf/ffi/message' 26 27module Google 28 module Protobuf 29 def self.deep_copy(object) 30 case object 31 when RepeatedField 32 RepeatedField.send(:deep_copy, object) 33 when Google::Protobuf::Map 34 Google::Protobuf::Map.deep_copy(object) 35 when Google::Protobuf::MessageExts 36 object.class.send(:deep_copy, object.instance_variable_get(:@msg)) 37 else 38 raise NotImplementedError 39 end 40 end 41 42 def self.discard_unknown(message) 43 raise FrozenError if message.frozen? 44 raise ArgumentError.new "Expected message, got #{message.class} instead." if message.instance_variable_get(:@msg).nil? 45 unless Google::Protobuf::FFI.message_discard_unknown(message.instance_variable_get(:@msg), message.class.descriptor, 128) 46 raise RuntimeError.new "Messages nested too deeply." 47 end 48 nil 49 end 50 end 51end 52