google-protobuf 3.21.2 → 4.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/ext/google/protobuf_c/Rakefile +3 -0
  3. data/ext/google/protobuf_c/convert.c +67 -86
  4. data/ext/google/protobuf_c/convert.h +3 -28
  5. data/ext/google/protobuf_c/defs.c +538 -77
  6. data/ext/google/protobuf_c/defs.h +3 -28
  7. data/ext/google/protobuf_c/extconf.rb +4 -4
  8. data/ext/google/protobuf_c/glue.c +72 -0
  9. data/ext/google/protobuf_c/map.c +114 -85
  10. data/ext/google/protobuf_c/map.h +12 -30
  11. data/ext/google/protobuf_c/message.c +264 -238
  12. data/ext/google/protobuf_c/message.h +11 -33
  13. data/ext/google/protobuf_c/protobuf.c +63 -187
  14. data/ext/google/protobuf_c/protobuf.h +27 -39
  15. data/ext/google/protobuf_c/repeated_field.c +72 -38
  16. data/ext/google/protobuf_c/repeated_field.h +11 -29
  17. data/ext/google/protobuf_c/ruby-upb.c +13783 -8236
  18. data/ext/google/protobuf_c/ruby-upb.h +14077 -4495
  19. data/ext/google/protobuf_c/shared_convert.c +69 -0
  20. data/ext/google/protobuf_c/shared_convert.h +26 -0
  21. data/ext/google/protobuf_c/shared_message.c +37 -0
  22. data/ext/google/protobuf_c/shared_message.h +21 -0
  23. data/ext/google/protobuf_c/third_party/utf8_range/LICENSE +1 -0
  24. data/ext/google/protobuf_c/third_party/utf8_range/utf8_range.c +467 -0
  25. data/ext/google/protobuf_c/third_party/utf8_range/utf8_range.h +20 -7
  26. data/ext/google/protobuf_c/wrap_memcpy.c +3 -26
  27. data/lib/google/protobuf/any_pb.rb +6 -8
  28. data/lib/google/protobuf/api_pb.rb +6 -26
  29. data/lib/google/protobuf/descriptor_pb.rb +23 -226
  30. data/lib/google/protobuf/duration_pb.rb +6 -8
  31. data/lib/google/protobuf/empty_pb.rb +6 -6
  32. data/lib/google/protobuf/ffi/descriptor.rb +165 -0
  33. data/lib/google/protobuf/ffi/descriptor_pool.rb +77 -0
  34. data/lib/google/protobuf/ffi/enum_descriptor.rb +173 -0
  35. data/lib/google/protobuf/ffi/ffi.rb +215 -0
  36. data/lib/google/protobuf/ffi/field_descriptor.rb +330 -0
  37. data/lib/google/protobuf/ffi/file_descriptor.rb +49 -0
  38. data/lib/google/protobuf/ffi/internal/arena.rb +60 -0
  39. data/lib/google/protobuf/ffi/internal/convert.rb +296 -0
  40. data/lib/google/protobuf/ffi/internal/pointer_helper.rb +35 -0
  41. data/lib/google/protobuf/ffi/internal/type_safety.rb +25 -0
  42. data/lib/google/protobuf/ffi/map.rb +433 -0
  43. data/lib/google/protobuf/ffi/message.rb +785 -0
  44. data/lib/google/protobuf/ffi/method_descriptor.rb +114 -0
  45. data/lib/google/protobuf/ffi/object_cache.rb +30 -0
  46. data/lib/google/protobuf/ffi/oneof_descriptor.rb +97 -0
  47. data/lib/google/protobuf/ffi/repeated_field.rb +411 -0
  48. data/lib/google/protobuf/ffi/service_descriptor.rb +107 -0
  49. data/lib/google/protobuf/field_mask_pb.rb +6 -7
  50. data/lib/google/protobuf/internal/object_cache.rb +99 -0
  51. data/lib/google/protobuf/message_exts.rb +8 -26
  52. data/lib/google/protobuf/plugin_pb.rb +25 -0
  53. data/lib/google/protobuf/repeated_field.rb +7 -31
  54. data/lib/google/protobuf/source_context_pb.rb +6 -7
  55. data/lib/google/protobuf/struct_pb.rb +6 -23
  56. data/lib/google/protobuf/timestamp_pb.rb +6 -8
  57. data/lib/google/protobuf/type_pb.rb +6 -71
  58. data/lib/google/protobuf/well_known_types.rb +5 -34
  59. data/lib/google/protobuf/wrappers_pb.rb +6 -31
  60. data/lib/google/protobuf.rb +27 -45
  61. data/lib/google/protobuf_ffi.rb +51 -0
  62. data/lib/google/protobuf_native.rb +19 -0
  63. data/lib/google/tasks/ffi.rake +100 -0
  64. metadata +92 -16
  65. data/ext/google/protobuf_c/third_party/utf8_range/naive.c +0 -92
  66. data/ext/google/protobuf_c/third_party/utf8_range/range2-neon.c +0 -157
  67. data/ext/google/protobuf_c/third_party/utf8_range/range2-sse.c +0 -170
  68. data/lib/google/protobuf/descriptor_dsl.rb +0 -465
  69. data/tests/basic.rb +0 -739
  70. data/tests/generated_code_test.rb +0 -23
  71. data/tests/stress.rb +0 -38
@@ -0,0 +1,77 @@
1
+ # Protocol Buffers - Google's data interchange format
2
+ # Copyright 2022 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
+
8
+ module Google
9
+ module Protobuf
10
+ class FFI
11
+ # DefPool
12
+ attach_function :add_serialized_file, :upb_DefPool_AddFile, [:DefPool, :FileDescriptorProto, Status.by_ref], :FileDef
13
+ attach_function :free_descriptor_pool, :upb_DefPool_Free, [:DefPool], :void
14
+ attach_function :create_descriptor_pool,:upb_DefPool_New, [], :DefPool
15
+ attach_function :get_extension_registry,:upb_DefPool_ExtensionRegistry, [:DefPool], :ExtensionRegistry
16
+ attach_function :lookup_enum, :upb_DefPool_FindEnumByName, [:DefPool, :string], EnumDescriptor
17
+ attach_function :lookup_extension, :upb_DefPool_FindExtensionByName,[:DefPool, :string], FieldDescriptor
18
+ attach_function :lookup_msg, :upb_DefPool_FindMessageByName, [:DefPool, :string], Descriptor
19
+ attach_function :lookup_service, :upb_DefPool_FindServiceByName, [:DefPool, :string], ServiceDescriptor
20
+
21
+ # FileDescriptorProto
22
+ attach_function :parse, :FileDescriptorProto_parse, [:binary_string, :size_t, Internal::Arena], :FileDescriptorProto
23
+ end
24
+ class DescriptorPool
25
+ attr :descriptor_pool
26
+ attr_accessor :descriptor_class_by_def
27
+
28
+ def initialize
29
+ @descriptor_pool = ::FFI::AutoPointer.new(Google::Protobuf::FFI.create_descriptor_pool, Google::Protobuf::FFI.method(:free_descriptor_pool))
30
+ @descriptor_class_by_def = {}
31
+
32
+ # Should always be the last expression of the initializer to avoid
33
+ # leaking references to this object before construction is complete.
34
+ Google::Protobuf::OBJECT_CACHE.try_add @descriptor_pool.address, self
35
+ end
36
+
37
+ def add_serialized_file(file_contents)
38
+ # Allocate memory sized to file_contents
39
+ memBuf = ::FFI::MemoryPointer.new(:char, file_contents.bytesize)
40
+ # Insert the data
41
+ memBuf.put_bytes(0, file_contents)
42
+ temporary_arena = Google::Protobuf::FFI.create_arena
43
+ file_descriptor_proto = Google::Protobuf::FFI.parse memBuf, file_contents.bytesize, temporary_arena
44
+ raise ArgumentError.new("Unable to parse FileDescriptorProto") if file_descriptor_proto.null?
45
+
46
+ status = Google::Protobuf::FFI::Status.new
47
+ file_descriptor = Google::Protobuf::FFI.add_serialized_file @descriptor_pool, file_descriptor_proto, status
48
+ if file_descriptor.null?
49
+ raise TypeError.new("Unable to build file to DescriptorPool: #{Google::Protobuf::FFI.error_message(status)}")
50
+ else
51
+ @descriptor_class_by_def[file_descriptor.address] = FileDescriptor.new file_descriptor, self
52
+ end
53
+ end
54
+
55
+ def lookup name
56
+ Google::Protobuf::FFI.lookup_msg(@descriptor_pool, name) ||
57
+ Google::Protobuf::FFI.lookup_enum(@descriptor_pool, name) ||
58
+ Google::Protobuf::FFI.lookup_extension(@descriptor_pool, name) ||
59
+ Google::Protobuf::FFI.lookup_service(@descriptor_pool, name)
60
+ end
61
+
62
+ def self.generated_pool
63
+ @@generated_pool ||= DescriptorPool.new
64
+ end
65
+
66
+ private
67
+
68
+ # Implementation details below are subject to breaking changes without
69
+ # warning and are intended for use only within the gem.
70
+
71
+ def get_file_descriptor file_def
72
+ return nil if file_def.null?
73
+ @descriptor_class_by_def[file_def.address] ||= FileDescriptor.new(file_def, self)
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,173 @@
1
+ # Protocol Buffers - Google's data interchange format
2
+ # Copyright 2022 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
+
8
+ module Google
9
+ module Protobuf
10
+ class EnumDescriptor
11
+ attr :descriptor_pool, :enum_def
12
+ include Enumerable
13
+
14
+ # FFI Interface methods and setup
15
+ extend ::FFI::DataConverter
16
+ native_type ::FFI::Type::POINTER
17
+
18
+ class << self
19
+ prepend Google::Protobuf::Internal::TypeSafety
20
+ include Google::Protobuf::Internal::PointerHelper
21
+
22
+ # @param value [EnumDescriptor] EnumDescriptor to convert to an FFI native type
23
+ # @param _ [Object] Unused
24
+ def to_native(value, _)
25
+ value.instance_variable_get(:@enum_def) || ::FFI::Pointer::NULL
26
+ end
27
+
28
+ ##
29
+ # @param enum_def [::FFI::Pointer] EnumDef pointer to be wrapped
30
+ # @param _ [Object] Unused
31
+ def from_native(enum_def, _)
32
+ return nil if enum_def.nil? or enum_def.null?
33
+ file_def = Google::Protobuf::FFI.get_message_file_def enum_def
34
+ descriptor_from_file_def(file_def, enum_def)
35
+ end
36
+ end
37
+
38
+ def self.new(*arguments, &block)
39
+ raise "Descriptor objects may not be created from Ruby."
40
+ end
41
+
42
+ def file_descriptor
43
+ @descriptor_pool.send(:get_file_descriptor, Google::Protobuf::FFI.get_enum_file_descriptor(self))
44
+ end
45
+
46
+ def name
47
+ Google::Protobuf::FFI.get_enum_fullname(self)
48
+ end
49
+
50
+ def to_s
51
+ inspect
52
+ end
53
+
54
+ def inspect
55
+ "#{self.class.name}: #{name}"
56
+ end
57
+
58
+ def lookup_name(name)
59
+ self.class.send(:lookup_name, self, name)
60
+ end
61
+
62
+ def lookup_value(number)
63
+ self.class.send(:lookup_value, self, number)
64
+ end
65
+
66
+ def each &block
67
+ n = Google::Protobuf::FFI.enum_value_count(self)
68
+ 0.upto(n - 1) do |i|
69
+ enum_value = Google::Protobuf::FFI.enum_value_by_index(self, i)
70
+ yield(Google::Protobuf::FFI.enum_name(enum_value).to_sym, Google::Protobuf::FFI.enum_number(enum_value))
71
+ end
72
+ nil
73
+ end
74
+
75
+ def enummodule
76
+ if @module.nil?
77
+ @module = build_enum_module
78
+ end
79
+ @module
80
+ end
81
+
82
+ def options
83
+ @options ||= begin
84
+ size_ptr = ::FFI::MemoryPointer.new(:size_t, 1)
85
+ temporary_arena = Google::Protobuf::FFI.create_arena
86
+ buffer = Google::Protobuf::FFI.enum_options(self, size_ptr, temporary_arena)
87
+ opts = Google::Protobuf::EnumOptions.decode(buffer.read_string_length(size_ptr.read(:size_t)).force_encoding("ASCII-8BIT").freeze)
88
+ opts.clear_features()
89
+ opts.freeze
90
+ end
91
+ end
92
+
93
+ private
94
+
95
+ def initialize(enum_def, descriptor_pool)
96
+ @descriptor_pool = descriptor_pool
97
+ @enum_def = enum_def
98
+ @module = nil
99
+ end
100
+
101
+ def self.private_constructor(enum_def, descriptor_pool)
102
+ instance = allocate
103
+ instance.send(:initialize, enum_def, descriptor_pool)
104
+ instance
105
+ end
106
+
107
+ def self.lookup_value(enum_def, number)
108
+ enum_value = Google::Protobuf::FFI.enum_value_by_number(enum_def, number)
109
+ if enum_value.null?
110
+ nil
111
+ else
112
+ Google::Protobuf::FFI.enum_name(enum_value).to_sym
113
+ end
114
+ end
115
+
116
+ def self.lookup_name(enum_def, name)
117
+ enum_value = Google::Protobuf::FFI.enum_value_by_name(enum_def, name.to_s, name.size)
118
+ if enum_value.null?
119
+ nil
120
+ else
121
+ Google::Protobuf::FFI.enum_number(enum_value)
122
+ end
123
+ end
124
+
125
+ def build_enum_module
126
+ descriptor = self
127
+ dynamic_module = Module.new do
128
+ @descriptor = descriptor
129
+
130
+ class << self
131
+ attr_accessor :descriptor
132
+ end
133
+
134
+ def self.lookup(number)
135
+ descriptor.lookup_value number
136
+ end
137
+
138
+ def self.resolve(name)
139
+ descriptor.lookup_name name
140
+ end
141
+ end
142
+
143
+ self.each do |name, value|
144
+ if name[0] < 'A' || name[0] > 'Z'
145
+ if name[0] >= 'a' and name[0] <= 'z'
146
+ name = name[0].upcase + name[1..-1] # auto capitalize
147
+ else
148
+ warn(
149
+ "Enum value '#{name}' does not start with an uppercase letter " +
150
+ "as is required for Ruby constants.")
151
+ next
152
+ end
153
+ end
154
+ dynamic_module.const_set(name.to_sym, value)
155
+ end
156
+ dynamic_module
157
+ end
158
+ end
159
+
160
+ class FFI
161
+ # EnumDescriptor
162
+ attach_function :get_enum_file_descriptor, :upb_EnumDef_File, [EnumDescriptor], :FileDef
163
+ attach_function :enum_value_by_name, :upb_EnumDef_FindValueByNameWithSize,[EnumDescriptor, :string, :size_t], :EnumValueDef
164
+ attach_function :enum_value_by_number, :upb_EnumDef_FindValueByNumber, [EnumDescriptor, :int], :EnumValueDef
165
+ attach_function :get_enum_fullname, :upb_EnumDef_FullName, [EnumDescriptor], :string
166
+ attach_function :enum_options, :EnumDescriptor_serialized_options, [EnumDescriptor, :pointer, Internal::Arena], :pointer
167
+ attach_function :enum_value_by_index, :upb_EnumDef_Value, [EnumDescriptor, :int], :EnumValueDef
168
+ attach_function :enum_value_count, :upb_EnumDef_ValueCount, [EnumDescriptor], :int
169
+ attach_function :enum_name, :upb_EnumValueDef_Name, [:EnumValueDef], :string
170
+ attach_function :enum_number, :upb_EnumValueDef_Number, [:EnumValueDef], :int
171
+ end
172
+ end
173
+ end
@@ -0,0 +1,215 @@
1
+ # Protocol Buffers - Google's data interchange format
2
+ # Copyright 2022 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
+
8
+ module Google
9
+ module Protobuf
10
+ class FFI
11
+ extend ::FFI::Library
12
+ # Workaround for Bazel's use of symlinks + JRuby's __FILE__ and `caller`
13
+ # that resolves them.
14
+ if ENV['BAZEL'] == 'true'
15
+ ffi_lib ::FFI::Compiler::Loader.find 'protobuf_c_ffi', ENV['PWD']
16
+ else
17
+ ffi_lib ::FFI::Compiler::Loader.find 'protobuf_c_ffi'
18
+ end
19
+
20
+ ## Map
21
+ Upb_Map_Begin = -1
22
+
23
+ ## Encoding Status
24
+ Upb_Status_MaxMessage = 511
25
+ Upb_Encode_Deterministic = 1
26
+ Upb_Encode_SkipUnknown = 2
27
+
28
+ ## JSON Encoding options
29
+ # When set, emits 0/default values. TODO: proto3 only?
30
+ Upb_JsonEncode_EmitDefaults = 1
31
+ # When set, use normal (snake_case) field names instead of JSON (camelCase) names.
32
+ Upb_JsonEncode_UseProtoNames = 2
33
+ # When set, emits enums as their integer values instead of as their names.
34
+ Upb_JsonEncode_FormatEnumsAsIntegers = 4
35
+
36
+ ## JSON Decoding options
37
+ Upb_JsonDecode_IgnoreUnknown = 1
38
+
39
+ ## JSON Decoding results
40
+ Upb_JsonDecodeResult_Ok = 0
41
+ Upb_JsonDecodeResult_OkWithEmptyStringNumerics = 1
42
+ Upb_JsonDecodeResult_Error = 2
43
+
44
+ typedef :pointer, :Array
45
+ typedef :pointer, :DefPool
46
+ typedef :pointer, :EnumValueDef
47
+ typedef :pointer, :ExtensionRegistry
48
+ typedef :pointer, :FieldDefPointer
49
+ typedef :pointer, :FileDef
50
+ typedef :pointer, :FileDescriptorProto
51
+ typedef :pointer, :Map
52
+ typedef :pointer, :Message # Instances of a message
53
+ typedef :pointer, :OneofDefPointer
54
+ typedef :pointer, :binary_string
55
+ if ::FFI::Platform::ARCH == "aarch64"
56
+ typedef :u_int8_t, :uint8_t
57
+ typedef :u_int16_t, :uint16_t
58
+ typedef :u_int32_t, :uint32_t
59
+ typedef :u_int64_t, :uint64_t
60
+ end
61
+
62
+ FieldType = enum(
63
+ :double, 1,
64
+ :float,
65
+ :int64,
66
+ :uint64,
67
+ :int32,
68
+ :fixed64,
69
+ :fixed32,
70
+ :bool,
71
+ :string,
72
+ :group,
73
+ :message,
74
+ :bytes,
75
+ :uint32,
76
+ :enum,
77
+ :sfixed32,
78
+ :sfixed64,
79
+ :sint32,
80
+ :sint64
81
+ )
82
+
83
+ CType = enum(
84
+ :bool, 1,
85
+ :float,
86
+ :int32,
87
+ :uint32,
88
+ :enum,
89
+ :message,
90
+ :double,
91
+ :int64,
92
+ :uint64,
93
+ :string,
94
+ :bytes
95
+ )
96
+
97
+ Label = enum(
98
+ :optional, 1,
99
+ :required,
100
+ :repeated
101
+ )
102
+
103
+ # All the different kind of well known type messages. For simplicity of check,
104
+ # number wrappers and string wrappers are grouped together. Make sure the
105
+ # order and merber of these groups are not changed.
106
+
107
+ WellKnown = enum(
108
+ :Unspecified,
109
+ :Any,
110
+ :FieldMask,
111
+ :Duration,
112
+ :Timestamp,
113
+ # number wrappers
114
+ :DoubleValue,
115
+ :FloatValue,
116
+ :Int64Value,
117
+ :UInt64Value,
118
+ :Int32Value,
119
+ :UInt32Value,
120
+ # string wrappers
121
+ :StringValue,
122
+ :BytesValue,
123
+ :BoolValue,
124
+ :Value,
125
+ :ListValue,
126
+ :Struct
127
+ )
128
+
129
+ DecodeStatus = enum(
130
+ :Ok,
131
+ :Malformed, # Wire format was corrupt
132
+ :OutOfMemory, # Arena alloc failed
133
+ :BadUtf8, # String field had bad UTF-8
134
+ :MaxDepthExceeded, # Exceeded UPB_DECODE_MAXDEPTH
135
+
136
+ # CheckRequired failed, but the parse otherwise succeeded.
137
+ :MissingRequired,
138
+ )
139
+
140
+ EncodeStatus = enum(
141
+ :Ok,
142
+ :OutOfMemory, # Arena alloc failed
143
+ :MaxDepthExceeded, # Exceeded UPB_DECODE_MAXDEPTH
144
+
145
+ # CheckRequired failed, but the parse otherwise succeeded.
146
+ :MissingRequired,
147
+ )
148
+
149
+ class StringView < ::FFI::Struct
150
+ layout :data, :pointer,
151
+ :size, :size_t
152
+ end
153
+
154
+ class MiniTable < ::FFI::Struct
155
+ layout :subs, :pointer,
156
+ :fields, :pointer,
157
+ :size, :uint16_t,
158
+ :field_count, :uint16_t,
159
+ :ext, :uint8_t, # upb_ExtMode, declared as uint8_t so sizeof(ext) == 1
160
+ :dense_below, :uint8_t,
161
+ :table_mask, :uint8_t,
162
+ :required_count, :uint8_t # Required fields have the lowest hasbits.
163
+ # To statically initialize the tables of variable length, we need a flexible
164
+ # array member, and we need to compile in gnu99 mode (constant initialization
165
+ # of flexible array members is a GNU extension, not in C99 unfortunately. */
166
+ # _upb_FastTable_Entry fasttable[];
167
+ end
168
+
169
+ class Status < ::FFI::Struct
170
+ layout :ok, :bool,
171
+ :msg, [:char, Upb_Status_MaxMessage]
172
+
173
+ def initialize
174
+ super
175
+ FFI.clear self
176
+ end
177
+ end
178
+
179
+ class MessageValue < ::FFI::Union
180
+ layout :bool_val, :bool,
181
+ :float_val, :float,
182
+ :double_val, :double,
183
+ :int32_val, :int32_t,
184
+ :int64_val, :int64_t,
185
+ :uint32_val, :uint32_t,
186
+ :uint64_val,:uint64_t,
187
+ :map_val, :pointer,
188
+ :msg_val, :pointer,
189
+ :array_val,:pointer,
190
+ :str_val, StringView
191
+ end
192
+
193
+ Upb_Message_Begin = -1
194
+
195
+ class MutableMessageValue < ::FFI::Union
196
+ layout :map, :Map,
197
+ :msg, :Message,
198
+ :array, :Array
199
+ end
200
+
201
+ # Status
202
+ attach_function :clear, :upb_Status_Clear, [Status.by_ref], :void
203
+ attach_function :error_message, :upb_Status_ErrorMessage, [Status.by_ref], :string
204
+
205
+ # Generic
206
+ attach_function :memcmp, [:pointer, :pointer, :size_t], :int
207
+ attach_function :memcpy, [:pointer, :pointer, :size_t], :int
208
+
209
+ # Alternatives to pre-processor macros
210
+ def self.decode_max_depth(i)
211
+ i << 16
212
+ end
213
+ end
214
+ end
215
+ end