google-protobuf 3.14.0 → 4.26.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/ext/google/protobuf_c/Rakefile +3 -0
  3. data/ext/google/protobuf_c/convert.c +317 -0
  4. data/ext/google/protobuf_c/convert.h +50 -0
  5. data/ext/google/protobuf_c/defs.c +759 -1709
  6. data/ext/google/protobuf_c/defs.h +82 -0
  7. data/ext/google/protobuf_c/extconf.rb +15 -8
  8. data/ext/google/protobuf_c/glue.c +56 -0
  9. data/ext/google/protobuf_c/map.c +328 -485
  10. data/ext/google/protobuf_c/map.h +44 -0
  11. data/ext/google/protobuf_c/message.c +1061 -530
  12. data/ext/google/protobuf_c/message.h +86 -0
  13. data/ext/google/protobuf_c/protobuf.c +314 -94
  14. data/ext/google/protobuf_c/protobuf.h +66 -621
  15. data/ext/google/protobuf_c/repeated_field.c +314 -353
  16. data/ext/google/protobuf_c/repeated_field.h +41 -0
  17. data/ext/google/protobuf_c/ruby-upb.c +15407 -0
  18. data/ext/google/protobuf_c/ruby-upb.h +13966 -0
  19. data/ext/google/protobuf_c/shared_convert.c +66 -0
  20. data/ext/google/protobuf_c/shared_convert.h +26 -0
  21. data/ext/google/protobuf_c/shared_message.c +67 -0
  22. data/ext/google/protobuf_c/shared_message.h +25 -0
  23. data/ext/google/protobuf_c/third_party/utf8_range/LICENSE +22 -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 +22 -0
  26. data/ext/google/protobuf_c/wrap_memcpy.c +7 -29
  27. data/lib/google/protobuf/any_pb.rb +6 -8
  28. data/lib/google/protobuf/api_pb.rb +7 -26
  29. data/lib/google/protobuf/descriptor_pb.rb +65 -0
  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 +164 -0
  33. data/lib/google/protobuf/ffi/descriptor_pool.rb +75 -0
  34. data/lib/google/protobuf/ffi/enum_descriptor.rb +171 -0
  35. data/lib/google/protobuf/ffi/ffi.rb +215 -0
  36. data/lib/google/protobuf/ffi/field_descriptor.rb +328 -0
  37. data/lib/google/protobuf/ffi/file_descriptor.rb +47 -0
  38. data/lib/google/protobuf/ffi/internal/arena.rb +66 -0
  39. data/lib/google/protobuf/ffi/internal/convert.rb +289 -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 +409 -0
  43. data/lib/google/protobuf/ffi/message.rb +659 -0
  44. data/lib/google/protobuf/ffi/object_cache.rb +30 -0
  45. data/lib/google/protobuf/ffi/oneof_descriptor.rb +95 -0
  46. data/lib/google/protobuf/ffi/repeated_field.rb +385 -0
  47. data/lib/google/protobuf/field_mask_pb.rb +6 -7
  48. data/lib/google/protobuf/internal/object_cache.rb +99 -0
  49. data/lib/google/protobuf/message_exts.rb +10 -28
  50. data/lib/google/protobuf/plugin_pb.rb +25 -0
  51. data/lib/google/protobuf/repeated_field.rb +19 -30
  52. data/lib/google/protobuf/source_context_pb.rb +6 -7
  53. data/lib/google/protobuf/struct_pb.rb +6 -23
  54. data/lib/google/protobuf/timestamp_pb.rb +6 -8
  55. data/lib/google/protobuf/type_pb.rb +7 -71
  56. data/lib/google/protobuf/well_known_types.rb +17 -36
  57. data/lib/google/protobuf/wrappers_pb.rb +6 -31
  58. data/lib/google/protobuf.rb +32 -118
  59. data/lib/google/protobuf_ffi.rb +49 -0
  60. data/lib/google/protobuf_native.rb +19 -0
  61. data/lib/google/tasks/ffi.rake +100 -0
  62. metadata +88 -37
  63. data/ext/google/protobuf_c/encode_decode.c +0 -1795
  64. data/ext/google/protobuf_c/storage.c +0 -1198
  65. data/ext/google/protobuf_c/upb.c +0 -13817
  66. data/ext/google/protobuf_c/upb.h +0 -6777
  67. data/tests/basic.rb +0 -543
  68. data/tests/generated_code_test.rb +0 -23
  69. data/tests/stress.rb +0 -38
@@ -0,0 +1,171 @@
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
+ Google::Protobuf::EnumOptions.decode(buffer.read_string_length(size_ptr.read(:size_t)).force_encoding("ASCII-8BIT").freeze).freeze
88
+ end
89
+ end
90
+
91
+ private
92
+
93
+ def initialize(enum_def, descriptor_pool)
94
+ @descriptor_pool = descriptor_pool
95
+ @enum_def = enum_def
96
+ @module = nil
97
+ end
98
+
99
+ def self.private_constructor(enum_def, descriptor_pool)
100
+ instance = allocate
101
+ instance.send(:initialize, enum_def, descriptor_pool)
102
+ instance
103
+ end
104
+
105
+ def self.lookup_value(enum_def, number)
106
+ enum_value = Google::Protobuf::FFI.enum_value_by_number(enum_def, number)
107
+ if enum_value.null?
108
+ nil
109
+ else
110
+ Google::Protobuf::FFI.enum_name(enum_value).to_sym
111
+ end
112
+ end
113
+
114
+ def self.lookup_name(enum_def, name)
115
+ enum_value = Google::Protobuf::FFI.enum_value_by_name(enum_def, name.to_s, name.size)
116
+ if enum_value.null?
117
+ nil
118
+ else
119
+ Google::Protobuf::FFI.enum_number(enum_value)
120
+ end
121
+ end
122
+
123
+ def build_enum_module
124
+ descriptor = self
125
+ dynamic_module = Module.new do
126
+ @descriptor = descriptor
127
+
128
+ class << self
129
+ attr_accessor :descriptor
130
+ end
131
+
132
+ def self.lookup(number)
133
+ descriptor.lookup_value number
134
+ end
135
+
136
+ def self.resolve(name)
137
+ descriptor.lookup_name name
138
+ end
139
+ end
140
+
141
+ self.each do |name, value|
142
+ if name[0] < 'A' || name[0] > 'Z'
143
+ if name[0] >= 'a' and name[0] <= 'z'
144
+ name = name[0].upcase + name[1..-1] # auto capitalize
145
+ else
146
+ warn(
147
+ "Enum value '#{name}' does not start with an uppercase letter " +
148
+ "as is required for Ruby constants.")
149
+ next
150
+ end
151
+ end
152
+ dynamic_module.const_set(name.to_sym, value)
153
+ end
154
+ dynamic_module
155
+ end
156
+ end
157
+
158
+ class FFI
159
+ # EnumDescriptor
160
+ attach_function :get_enum_file_descriptor, :upb_EnumDef_File, [EnumDescriptor], :FileDef
161
+ attach_function :enum_value_by_name, :upb_EnumDef_FindValueByNameWithSize,[EnumDescriptor, :string, :size_t], :EnumValueDef
162
+ attach_function :enum_value_by_number, :upb_EnumDef_FindValueByNumber, [EnumDescriptor, :int], :EnumValueDef
163
+ attach_function :get_enum_fullname, :upb_EnumDef_FullName, [EnumDescriptor], :string
164
+ attach_function :enum_options, :EnumDescriptor_serialized_options, [EnumDescriptor, :pointer, Internal::Arena], :pointer
165
+ attach_function :enum_value_by_index, :upb_EnumDef_Value, [EnumDescriptor, :int], :EnumValueDef
166
+ attach_function :enum_value_count, :upb_EnumDef_ValueCount, [EnumDescriptor], :int
167
+ attach_function :enum_name, :upb_EnumValueDef_Name, [:EnumValueDef], :string
168
+ attach_function :enum_number, :upb_EnumValueDef_Number, [:EnumValueDef], :int
169
+ end
170
+ end
171
+ 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
+ typedef :pointer, :Array
40
+ typedef :pointer, :DefPool
41
+ typedef :pointer, :EnumValueDef
42
+ typedef :pointer, :ExtensionRegistry
43
+ typedef :pointer, :FieldDefPointer
44
+ typedef :pointer, :FileDef
45
+ typedef :pointer, :FileDescriptorProto
46
+ typedef :pointer, :Map
47
+ typedef :pointer, :Message # Instances of a message
48
+ typedef :pointer, :OneofDefPointer
49
+ typedef :pointer, :binary_string
50
+ if ::FFI::Platform::ARCH == "aarch64"
51
+ typedef :u_int8_t, :uint8_t
52
+ typedef :u_int16_t, :uint16_t
53
+ typedef :u_int32_t, :uint32_t
54
+ typedef :u_int64_t, :uint64_t
55
+ end
56
+
57
+ FieldType = enum(
58
+ :double, 1,
59
+ :float,
60
+ :int64,
61
+ :uint64,
62
+ :int32,
63
+ :fixed64,
64
+ :fixed32,
65
+ :bool,
66
+ :string,
67
+ :group,
68
+ :message,
69
+ :bytes,
70
+ :uint32,
71
+ :enum,
72
+ :sfixed32,
73
+ :sfixed64,
74
+ :sint32,
75
+ :sint64
76
+ )
77
+
78
+ CType = enum(
79
+ :bool, 1,
80
+ :float,
81
+ :int32,
82
+ :uint32,
83
+ :enum,
84
+ :message,
85
+ :double,
86
+ :int64,
87
+ :uint64,
88
+ :string,
89
+ :bytes
90
+ )
91
+
92
+ Label = enum(
93
+ :optional, 1,
94
+ :required,
95
+ :repeated
96
+ )
97
+
98
+ Syntax = enum(
99
+ :Proto2, 2,
100
+ :Proto3
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