google-protobuf 3.24.0 → 4.26.0
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.
- checksums.yaml +4 -4
- data/ext/google/protobuf_c/Rakefile +3 -0
- data/ext/google/protobuf_c/convert.c +28 -72
- data/ext/google/protobuf_c/convert.h +3 -26
- data/ext/google/protobuf_c/defs.c +175 -50
- data/ext/google/protobuf_c/defs.h +3 -26
- data/ext/google/protobuf_c/extconf.rb +2 -1
- data/ext/google/protobuf_c/glue.c +56 -0
- data/ext/google/protobuf_c/map.c +24 -34
- data/ext/google/protobuf_c/map.h +6 -26
- data/ext/google/protobuf_c/message.c +88 -134
- data/ext/google/protobuf_c/message.h +10 -26
- data/ext/google/protobuf_c/protobuf.c +35 -37
- data/ext/google/protobuf_c/protobuf.h +3 -26
- data/ext/google/protobuf_c/repeated_field.c +18 -31
- data/ext/google/protobuf_c/repeated_field.h +6 -26
- data/ext/google/protobuf_c/ruby-upb.c +12146 -10962
- data/ext/google/protobuf_c/ruby-upb.h +7299 -6084
- data/ext/google/protobuf_c/shared_convert.c +66 -0
- data/ext/google/protobuf_c/shared_convert.h +26 -0
- data/ext/google/protobuf_c/shared_message.c +67 -0
- data/ext/google/protobuf_c/shared_message.h +25 -0
- data/ext/google/protobuf_c/third_party/utf8_range/utf8_range.c +467 -0
- data/ext/google/protobuf_c/third_party/utf8_range/utf8_range.h +9 -8
- data/ext/google/protobuf_c/wrap_memcpy.c +3 -26
- data/lib/google/protobuf/any_pb.rb +1 -22
- data/lib/google/protobuf/api_pb.rb +1 -24
- data/lib/google/protobuf/descriptor_pb.rb +6 -24
- data/lib/google/protobuf/duration_pb.rb +1 -22
- data/lib/google/protobuf/empty_pb.rb +1 -22
- data/lib/google/protobuf/ffi/descriptor.rb +164 -0
- data/lib/google/protobuf/ffi/descriptor_pool.rb +75 -0
- data/lib/google/protobuf/ffi/enum_descriptor.rb +171 -0
- data/lib/google/protobuf/ffi/ffi.rb +215 -0
- data/lib/google/protobuf/ffi/field_descriptor.rb +328 -0
- data/lib/google/protobuf/ffi/file_descriptor.rb +47 -0
- data/lib/google/protobuf/ffi/internal/arena.rb +66 -0
- data/lib/google/protobuf/ffi/internal/convert.rb +289 -0
- data/lib/google/protobuf/ffi/internal/pointer_helper.rb +35 -0
- data/lib/google/protobuf/ffi/internal/type_safety.rb +25 -0
- data/lib/google/protobuf/ffi/map.rb +409 -0
- data/lib/google/protobuf/ffi/message.rb +659 -0
- data/lib/google/protobuf/ffi/object_cache.rb +30 -0
- data/lib/google/protobuf/ffi/oneof_descriptor.rb +95 -0
- data/lib/google/protobuf/ffi/repeated_field.rb +385 -0
- data/lib/google/protobuf/field_mask_pb.rb +1 -22
- data/lib/google/protobuf/internal/object_cache.rb +99 -0
- data/lib/google/protobuf/message_exts.rb +3 -26
- data/lib/google/protobuf/plugin_pb.rb +2 -24
- data/lib/google/protobuf/repeated_field.rb +4 -28
- data/lib/google/protobuf/source_context_pb.rb +1 -22
- data/lib/google/protobuf/struct_pb.rb +1 -22
- data/lib/google/protobuf/timestamp_pb.rb +1 -22
- data/lib/google/protobuf/type_pb.rb +1 -24
- data/lib/google/protobuf/well_known_types.rb +3 -26
- data/lib/google/protobuf/wrappers_pb.rb +1 -22
- data/lib/google/protobuf.rb +27 -46
- data/lib/google/protobuf_ffi.rb +49 -0
- data/lib/google/protobuf_native.rb +19 -0
- data/lib/google/tasks/ffi.rake +100 -0
- metadata +72 -8
- data/ext/google/protobuf_c/third_party/utf8_range/naive.c +0 -92
- data/ext/google/protobuf_c/third_party/utf8_range/range2-neon.c +0 -157
- data/ext/google/protobuf_c/third_party/utf8_range/range2-sse.c +0 -170
- data/lib/google/protobuf/descriptor_dsl.rb +0 -465
- data/lib/google/protobuf/object_cache.rb +0 -120
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b23f00860aa2e86d6e58ad274082a4c60de5a0315d489943d6ab35efb78770a7
|
|
4
|
+
data.tar.gz: 89df3b5d9f88cbed7a77a114737782b94f285823652fee6d5cda6170e7c8c1e7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2b21bee58bb16f0f284434997e95c8c5d279c03fdcb0f35c2a7e623c67b39c0356c9731840422b69330a5a5744dde3bbce9b7dc776ee3810f15dacf8a27b7811
|
|
7
|
+
data.tar.gz: d972c3191e8ad50741e5f4dc98fd3b6a833113a524988a602a698a425909eab7aaf0f0b107e22c9fbf5f1338e1c11673fad7db5b46bf6592926360a9dad72d17
|
|
@@ -1,32 +1,9 @@
|
|
|
1
1
|
// Protocol Buffers - Google's data interchange format
|
|
2
2
|
// Copyright 2008 Google Inc. All rights reserved.
|
|
3
|
-
// https://developers.google.com/protocol-buffers/
|
|
4
3
|
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// * Redistributions of source code must retain the above copyright
|
|
10
|
-
// notice, this list of conditions and the following disclaimer.
|
|
11
|
-
// * Redistributions in binary form must reproduce the above
|
|
12
|
-
// copyright notice, this list of conditions and the following disclaimer
|
|
13
|
-
// in the documentation and/or other materials provided with the
|
|
14
|
-
// distribution.
|
|
15
|
-
// * Neither the name of Google Inc. nor the names of its
|
|
16
|
-
// contributors may be used to endorse or promote products derived from
|
|
17
|
-
// this software without specific prior written permission.
|
|
18
|
-
//
|
|
19
|
-
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
20
|
-
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
21
|
-
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
22
|
-
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
23
|
-
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
24
|
-
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
25
|
-
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
26
|
-
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
27
|
-
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
28
|
-
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
29
|
-
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
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
|
|
30
7
|
|
|
31
8
|
// -----------------------------------------------------------------------------
|
|
32
9
|
// Ruby <-> upb data conversion functions.
|
|
@@ -41,6 +18,7 @@
|
|
|
41
18
|
|
|
42
19
|
#include "message.h"
|
|
43
20
|
#include "protobuf.h"
|
|
21
|
+
#include "shared_convert.h"
|
|
44
22
|
|
|
45
23
|
static upb_StringView Convert_StringData(VALUE str, upb_Arena* arena) {
|
|
46
24
|
upb_StringView ret;
|
|
@@ -111,8 +89,7 @@ static int32_t Convert_ToEnum(VALUE value, const char* name,
|
|
|
111
89
|
case T_SYMBOL: {
|
|
112
90
|
const upb_EnumValueDef* ev =
|
|
113
91
|
upb_EnumDef_FindValueByName(e, rb_id2name(SYM2ID(value)));
|
|
114
|
-
if (!ev)
|
|
115
|
-
goto unknownval;
|
|
92
|
+
if (!ev) goto unknownval;
|
|
116
93
|
val = upb_EnumValueDef_Number(ev);
|
|
117
94
|
break;
|
|
118
95
|
}
|
|
@@ -164,7 +141,7 @@ upb_MessageValue Convert_RubyToUpb(VALUE value, const char* name,
|
|
|
164
141
|
VALUE utf8 = rb_enc_from_encoding(rb_utf8_encoding());
|
|
165
142
|
if (rb_obj_class(value) == rb_cSymbol) {
|
|
166
143
|
value = rb_funcall(value, rb_intern("to_s"), 0);
|
|
167
|
-
} else if (
|
|
144
|
+
} else if (!rb_obj_is_kind_of(value, rb_cString)) {
|
|
168
145
|
rb_raise(cTypeError,
|
|
169
146
|
"Invalid argument for string field '%s' (given %s).", name,
|
|
170
147
|
rb_class2name(CLASS_OF(value)));
|
|
@@ -194,7 +171,7 @@ upb_MessageValue Convert_RubyToUpb(VALUE value, const char* name,
|
|
|
194
171
|
if (rb_obj_encoding(value) != bytes) {
|
|
195
172
|
// Note: this will not duplicate underlying string data unless
|
|
196
173
|
// necessary.
|
|
197
|
-
// TODO
|
|
174
|
+
// TODO: is this really necessary to get raw bytes?
|
|
198
175
|
value = rb_str_encode(value, bytes, 0, Qnil);
|
|
199
176
|
}
|
|
200
177
|
|
|
@@ -231,7 +208,8 @@ upb_MessageValue Convert_RubyToUpb(VALUE value, const char* name,
|
|
|
231
208
|
}
|
|
232
209
|
break;
|
|
233
210
|
default:
|
|
234
|
-
|
|
211
|
+
rb_raise(cTypeError,
|
|
212
|
+
"Convert_RubyToUpb(): Unexpected type %d", (int)type_info.type);
|
|
235
213
|
}
|
|
236
214
|
|
|
237
215
|
return ret;
|
|
@@ -255,7 +233,7 @@ VALUE Convert_UpbToRuby(upb_MessageValue upb_val, TypeInfo type_info,
|
|
|
255
233
|
case kUpb_CType_UInt64:
|
|
256
234
|
return ULL2NUM(upb_val.int64_val);
|
|
257
235
|
case kUpb_CType_Enum: {
|
|
258
|
-
const upb_EnumValueDef
|
|
236
|
+
const upb_EnumValueDef* ev = upb_EnumDef_FindValueByNumber(
|
|
259
237
|
type_info.def.enumdef, upb_val.int32_val);
|
|
260
238
|
if (ev) {
|
|
261
239
|
return ID2SYM(rb_intern(upb_EnumValueDef_Name(ev)));
|
|
@@ -312,50 +290,28 @@ upb_MessageValue Msgval_DeepCopy(upb_MessageValue msgval, TypeInfo type_info,
|
|
|
312
290
|
|
|
313
291
|
bool Msgval_IsEqual(upb_MessageValue val1, upb_MessageValue val2,
|
|
314
292
|
TypeInfo type_info) {
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
case kUpb_CType_Int64:
|
|
325
|
-
case kUpb_CType_UInt64:
|
|
326
|
-
return memcmp(&val1, &val2, 8) == 0;
|
|
327
|
-
case kUpb_CType_String:
|
|
328
|
-
case kUpb_CType_Bytes:
|
|
329
|
-
return val1.str_val.size == val2.str_val.size &&
|
|
330
|
-
memcmp(val1.str_val.data, val2.str_val.data, val1.str_val.size) ==
|
|
331
|
-
0;
|
|
332
|
-
case kUpb_CType_Message:
|
|
333
|
-
return Message_Equal(val1.msg_val, val2.msg_val, type_info.def.msgdef);
|
|
334
|
-
default:
|
|
335
|
-
rb_raise(rb_eRuntimeError, "Internal error, unexpected type");
|
|
293
|
+
upb_Status status;
|
|
294
|
+
upb_Status_Clear(&status);
|
|
295
|
+
bool return_value = shared_Msgval_IsEqual(val1, val2, type_info.type,
|
|
296
|
+
type_info.def.msgdef, &status);
|
|
297
|
+
if (upb_Status_IsOk(&status)) {
|
|
298
|
+
return return_value;
|
|
299
|
+
} else {
|
|
300
|
+
rb_raise(rb_eRuntimeError, "Msgval_IsEqual(): %s",
|
|
301
|
+
upb_Status_ErrorMessage(&status));
|
|
336
302
|
}
|
|
337
303
|
}
|
|
338
304
|
|
|
339
305
|
uint64_t Msgval_GetHash(upb_MessageValue val, TypeInfo type_info,
|
|
340
306
|
uint64_t seed) {
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
case kUpb_CType_Int64:
|
|
351
|
-
case kUpb_CType_UInt64:
|
|
352
|
-
return _upb_Hash(&val, 8, seed);
|
|
353
|
-
case kUpb_CType_String:
|
|
354
|
-
case kUpb_CType_Bytes:
|
|
355
|
-
return _upb_Hash(val.str_val.data, val.str_val.size, seed);
|
|
356
|
-
case kUpb_CType_Message:
|
|
357
|
-
return Message_Hash(val.msg_val, type_info.def.msgdef, seed);
|
|
358
|
-
default:
|
|
359
|
-
rb_raise(rb_eRuntimeError, "Internal error, unexpected type");
|
|
307
|
+
upb_Status status;
|
|
308
|
+
upb_Status_Clear(&status);
|
|
309
|
+
uint64_t return_value = shared_Msgval_GetHash(
|
|
310
|
+
val, type_info.type, type_info.def.msgdef, seed, &status);
|
|
311
|
+
if (upb_Status_IsOk(&status)) {
|
|
312
|
+
return return_value;
|
|
313
|
+
} else {
|
|
314
|
+
rb_raise(rb_eRuntimeError, "Msgval_GetHash(): %s",
|
|
315
|
+
upb_Status_ErrorMessage(&status));
|
|
360
316
|
}
|
|
361
317
|
}
|
|
@@ -1,32 +1,9 @@
|
|
|
1
1
|
// Protocol Buffers - Google's data interchange format
|
|
2
2
|
// Copyright 2008 Google Inc. All rights reserved.
|
|
3
|
-
// https://developers.google.com/protocol-buffers/
|
|
4
3
|
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// * Redistributions of source code must retain the above copyright
|
|
10
|
-
// notice, this list of conditions and the following disclaimer.
|
|
11
|
-
// * Redistributions in binary form must reproduce the above
|
|
12
|
-
// copyright notice, this list of conditions and the following disclaimer
|
|
13
|
-
// in the documentation and/or other materials provided with the
|
|
14
|
-
// distribution.
|
|
15
|
-
// * Neither the name of Google Inc. nor the names of its
|
|
16
|
-
// contributors may be used to endorse or promote products derived from
|
|
17
|
-
// this software without specific prior written permission.
|
|
18
|
-
//
|
|
19
|
-
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
20
|
-
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
21
|
-
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
22
|
-
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
23
|
-
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
24
|
-
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
25
|
-
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
26
|
-
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
27
|
-
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
28
|
-
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
29
|
-
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
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
|
|
30
7
|
|
|
31
8
|
#ifndef RUBY_PROTOBUF_CONVERT_H_
|
|
32
9
|
#define RUBY_PROTOBUF_CONVERT_H_
|
|
@@ -1,32 +1,9 @@
|
|
|
1
1
|
// Protocol Buffers - Google's data interchange format
|
|
2
2
|
// Copyright 2014 Google Inc. All rights reserved.
|
|
3
|
-
// https://developers.google.com/protocol-buffers/
|
|
4
3
|
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// * Redistributions of source code must retain the above copyright
|
|
10
|
-
// notice, this list of conditions and the following disclaimer.
|
|
11
|
-
// * Redistributions in binary form must reproduce the above
|
|
12
|
-
// copyright notice, this list of conditions and the following disclaimer
|
|
13
|
-
// in the documentation and/or other materials provided with the
|
|
14
|
-
// distribution.
|
|
15
|
-
// * Neither the name of Google Inc. nor the names of its
|
|
16
|
-
// contributors may be used to endorse or promote products derived from
|
|
17
|
-
// this software without specific prior written permission.
|
|
18
|
-
//
|
|
19
|
-
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
20
|
-
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
21
|
-
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
22
|
-
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
23
|
-
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
24
|
-
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
25
|
-
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
26
|
-
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
27
|
-
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
28
|
-
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
29
|
-
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
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
|
|
30
7
|
|
|
31
8
|
#include <ctype.h>
|
|
32
9
|
#include <errno.h>
|
|
@@ -67,7 +44,7 @@ static VALUE rb_str_maybe_null(const char* s) {
|
|
|
67
44
|
}
|
|
68
45
|
return rb_str_new2(s);
|
|
69
46
|
}
|
|
70
|
-
|
|
47
|
+
static ID options_instancevar_interned;
|
|
71
48
|
// -----------------------------------------------------------------------------
|
|
72
49
|
// DescriptorPool.
|
|
73
50
|
// -----------------------------------------------------------------------------
|
|
@@ -167,20 +144,26 @@ VALUE DescriptorPool_add_serialized_file(VALUE _self,
|
|
|
167
144
|
* call-seq:
|
|
168
145
|
* DescriptorPool.lookup(name) => descriptor
|
|
169
146
|
*
|
|
170
|
-
* Finds a Descriptor or
|
|
171
|
-
* exists with the given name.
|
|
147
|
+
* Finds a Descriptor, EnumDescriptor or FieldDescriptor by name and returns it,
|
|
148
|
+
* or nil if none exists with the given name.
|
|
172
149
|
*/
|
|
173
150
|
static VALUE DescriptorPool_lookup(VALUE _self, VALUE name) {
|
|
174
151
|
DescriptorPool* self = ruby_to_DescriptorPool(_self);
|
|
175
152
|
const char* name_str = get_str(name);
|
|
176
153
|
const upb_MessageDef* msgdef;
|
|
177
154
|
const upb_EnumDef* enumdef;
|
|
155
|
+
const upb_FieldDef* fielddef;
|
|
178
156
|
|
|
179
157
|
msgdef = upb_DefPool_FindMessageByName(self->symtab, name_str);
|
|
180
158
|
if (msgdef) {
|
|
181
159
|
return get_msgdef_obj(_self, msgdef);
|
|
182
160
|
}
|
|
183
161
|
|
|
162
|
+
fielddef = upb_DefPool_FindExtensionByName(self->symtab, name_str);
|
|
163
|
+
if (fielddef) {
|
|
164
|
+
return get_fielddef_obj(_self, fielddef);
|
|
165
|
+
}
|
|
166
|
+
|
|
184
167
|
enumdef = upb_DefPool_FindEnumByName(self->symtab, name_str);
|
|
185
168
|
if (enumdef) {
|
|
186
169
|
return get_enumdef_obj(_self, enumdef);
|
|
@@ -215,6 +198,7 @@ static void DescriptorPool_register(VALUE module) {
|
|
|
215
198
|
|
|
216
199
|
rb_gc_register_address(&generated_pool);
|
|
217
200
|
generated_pool = rb_class_new_instance(0, NULL, klass);
|
|
201
|
+
options_instancevar_interned = rb_intern("options");
|
|
218
202
|
}
|
|
219
203
|
|
|
220
204
|
// -----------------------------------------------------------------------------
|
|
@@ -249,6 +233,35 @@ static Descriptor* ruby_to_Descriptor(VALUE val) {
|
|
|
249
233
|
return ret;
|
|
250
234
|
}
|
|
251
235
|
|
|
236
|
+
// Decode and return a frozen instance of a Descriptor Option for the given pool
|
|
237
|
+
static VALUE decode_options(VALUE self, const char* option_type, int size,
|
|
238
|
+
const char* bytes, VALUE descriptor_pool) {
|
|
239
|
+
VALUE options_rb = rb_ivar_get(self, options_instancevar_interned);
|
|
240
|
+
if (options_rb != Qnil) {
|
|
241
|
+
return options_rb;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
static const char* prefix = "google.protobuf.";
|
|
245
|
+
char fullname
|
|
246
|
+
[/*strlen(prefix)*/ 16 +
|
|
247
|
+
/*strln(longest option type supported e.g. "MessageOptions")*/ 14 +
|
|
248
|
+
/*null terminator*/ 1];
|
|
249
|
+
|
|
250
|
+
snprintf(fullname, sizeof(fullname), "%s%s", prefix, option_type);
|
|
251
|
+
const upb_MessageDef* msgdef = upb_DefPool_FindMessageByName(
|
|
252
|
+
ruby_to_DescriptorPool(descriptor_pool)->symtab, fullname);
|
|
253
|
+
if (!msgdef) {
|
|
254
|
+
rb_raise(rb_eRuntimeError, "Cannot find %s in DescriptorPool", option_type);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
VALUE desc_rb = get_msgdef_obj(descriptor_pool, msgdef);
|
|
258
|
+
const Descriptor* desc = ruby_to_Descriptor(desc_rb);
|
|
259
|
+
|
|
260
|
+
options_rb = Message_decode_bytes(size, bytes, 0, desc->klass, true);
|
|
261
|
+
rb_ivar_set(self, options_instancevar_interned, options_rb);
|
|
262
|
+
return options_rb;
|
|
263
|
+
}
|
|
264
|
+
|
|
252
265
|
/*
|
|
253
266
|
* call-seq:
|
|
254
267
|
* Descriptor.new => descriptor
|
|
@@ -397,6 +410,26 @@ static VALUE Descriptor_msgclass(VALUE _self) {
|
|
|
397
410
|
return self->klass;
|
|
398
411
|
}
|
|
399
412
|
|
|
413
|
+
/*
|
|
414
|
+
* call-seq:
|
|
415
|
+
* Descriptor.options => options
|
|
416
|
+
*
|
|
417
|
+
* Returns the `MessageOptions` for this `Descriptor`.
|
|
418
|
+
*/
|
|
419
|
+
static VALUE Descriptor_options(VALUE _self) {
|
|
420
|
+
Descriptor* self = ruby_to_Descriptor(_self);
|
|
421
|
+
const google_protobuf_MessageOptions* opts =
|
|
422
|
+
upb_MessageDef_Options(self->msgdef);
|
|
423
|
+
upb_Arena* arena = upb_Arena_New();
|
|
424
|
+
size_t size;
|
|
425
|
+
char* serialized =
|
|
426
|
+
google_protobuf_MessageOptions_serialize(opts, arena, &size);
|
|
427
|
+
VALUE message_options = decode_options(_self, "MessageOptions", size,
|
|
428
|
+
serialized, self->descriptor_pool);
|
|
429
|
+
upb_Arena_Free(arena);
|
|
430
|
+
return message_options;
|
|
431
|
+
}
|
|
432
|
+
|
|
400
433
|
static void Descriptor_register(VALUE module) {
|
|
401
434
|
VALUE klass = rb_define_class_under(module, "Descriptor", rb_cObject);
|
|
402
435
|
rb_define_alloc_func(klass, Descriptor_alloc);
|
|
@@ -408,6 +441,7 @@ static void Descriptor_register(VALUE module) {
|
|
|
408
441
|
rb_define_method(klass, "msgclass", Descriptor_msgclass, 0);
|
|
409
442
|
rb_define_method(klass, "name", Descriptor_name, 0);
|
|
410
443
|
rb_define_method(klass, "file_descriptor", Descriptor_file_descriptor, 0);
|
|
444
|
+
rb_define_method(klass, "options", Descriptor_options, 0);
|
|
411
445
|
rb_include_module(klass, rb_mEnumerable);
|
|
412
446
|
rb_gc_register_address(&cDescriptor);
|
|
413
447
|
cDescriptor = klass;
|
|
@@ -455,7 +489,7 @@ static VALUE FileDescriptor_alloc(VALUE klass) {
|
|
|
455
489
|
* call-seq:
|
|
456
490
|
* FileDescriptor.new => file
|
|
457
491
|
*
|
|
458
|
-
* Returns a new file descriptor.
|
|
492
|
+
* Returns a new file descriptor. May
|
|
459
493
|
* to a builder.
|
|
460
494
|
*/
|
|
461
495
|
static VALUE FileDescriptor_initialize(VALUE _self, VALUE cookie,
|
|
@@ -487,24 +521,20 @@ static VALUE FileDescriptor_name(VALUE _self) {
|
|
|
487
521
|
|
|
488
522
|
/*
|
|
489
523
|
* call-seq:
|
|
490
|
-
* FileDescriptor.
|
|
491
|
-
*
|
|
492
|
-
* Returns this file descriptors syntax.
|
|
524
|
+
* FileDescriptor.options => options
|
|
493
525
|
*
|
|
494
|
-
*
|
|
495
|
-
* :proto2 or :proto3.
|
|
526
|
+
* Returns the `FileOptions` for this `FileDescriptor`.
|
|
496
527
|
*/
|
|
497
|
-
static VALUE
|
|
528
|
+
static VALUE FileDescriptor_options(VALUE _self) {
|
|
498
529
|
FileDescriptor* self = ruby_to_FileDescriptor(_self);
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
}
|
|
530
|
+
const google_protobuf_FileOptions* opts = upb_FileDef_Options(self->filedef);
|
|
531
|
+
upb_Arena* arena = upb_Arena_New();
|
|
532
|
+
size_t size;
|
|
533
|
+
char* serialized = google_protobuf_FileOptions_serialize(opts, arena, &size);
|
|
534
|
+
VALUE file_options = decode_options(_self, "FileOptions", size, serialized,
|
|
535
|
+
self->descriptor_pool);
|
|
536
|
+
upb_Arena_Free(arena);
|
|
537
|
+
return file_options;
|
|
508
538
|
}
|
|
509
539
|
|
|
510
540
|
static void FileDescriptor_register(VALUE module) {
|
|
@@ -512,7 +542,7 @@ static void FileDescriptor_register(VALUE module) {
|
|
|
512
542
|
rb_define_alloc_func(klass, FileDescriptor_alloc);
|
|
513
543
|
rb_define_method(klass, "initialize", FileDescriptor_initialize, 3);
|
|
514
544
|
rb_define_method(klass, "name", FileDescriptor_name, 0);
|
|
515
|
-
rb_define_method(klass, "
|
|
545
|
+
rb_define_method(klass, "options", FileDescriptor_options, 0);
|
|
516
546
|
rb_gc_register_address(&cFileDescriptor);
|
|
517
547
|
cFileDescriptor = klass;
|
|
518
548
|
}
|
|
@@ -563,7 +593,7 @@ static VALUE FieldDescriptor_alloc(VALUE klass) {
|
|
|
563
593
|
|
|
564
594
|
/*
|
|
565
595
|
* call-seq:
|
|
566
|
-
*
|
|
596
|
+
* FieldDescriptor.new(c_only_cookie, pool, ptr) => FieldDescriptor
|
|
567
597
|
*
|
|
568
598
|
* Creates a descriptor wrapper object. May only be called from C.
|
|
569
599
|
*/
|
|
@@ -683,6 +713,28 @@ static VALUE FieldDescriptor_default(VALUE _self) {
|
|
|
683
713
|
return Convert_UpbToRuby(default_val, TypeInfo_get(self->fielddef), Qnil);
|
|
684
714
|
}
|
|
685
715
|
|
|
716
|
+
/*
|
|
717
|
+
* call-seq:
|
|
718
|
+
* FieldDescriptor.has_presence? => bool
|
|
719
|
+
*
|
|
720
|
+
* Returns whether this field tracks presence.
|
|
721
|
+
*/
|
|
722
|
+
static VALUE FieldDescriptor_has_presence(VALUE _self) {
|
|
723
|
+
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
|
724
|
+
return upb_FieldDef_HasPresence(self->fielddef) ? Qtrue : Qfalse;
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
/*
|
|
728
|
+
* call-seq:
|
|
729
|
+
* FieldDescriptor.is_packed? => bool
|
|
730
|
+
*
|
|
731
|
+
* Returns whether this is a repeated field that uses packed encoding.
|
|
732
|
+
*/
|
|
733
|
+
static VALUE FieldDescriptor_is_packed(VALUE _self) {
|
|
734
|
+
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
|
735
|
+
return upb_FieldDef_IsPacked(self->fielddef) ? Qtrue : Qfalse;
|
|
736
|
+
}
|
|
737
|
+
|
|
686
738
|
/*
|
|
687
739
|
* call-seq:
|
|
688
740
|
* FieldDescriptor.json_name => json_name
|
|
@@ -809,7 +861,7 @@ static VALUE FieldDescriptor_get(VALUE _self, VALUE msg_rb) {
|
|
|
809
861
|
static VALUE FieldDescriptor_has(VALUE _self, VALUE msg_rb) {
|
|
810
862
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
|
811
863
|
const upb_MessageDef* m;
|
|
812
|
-
const
|
|
864
|
+
const upb_Message* msg = Message_Get(msg_rb, &m);
|
|
813
865
|
|
|
814
866
|
if (m != upb_FieldDef_ContainingType(self->fielddef)) {
|
|
815
867
|
rb_raise(cTypeError, "has method called on wrong message type");
|
|
@@ -829,7 +881,7 @@ static VALUE FieldDescriptor_has(VALUE _self, VALUE msg_rb) {
|
|
|
829
881
|
static VALUE FieldDescriptor_clear(VALUE _self, VALUE msg_rb) {
|
|
830
882
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
|
831
883
|
const upb_MessageDef* m;
|
|
832
|
-
|
|
884
|
+
upb_Message* msg = Message_GetMutable(msg_rb, &m);
|
|
833
885
|
|
|
834
886
|
if (m != upb_FieldDef_ContainingType(self->fielddef)) {
|
|
835
887
|
rb_raise(cTypeError, "has method called on wrong message type");
|
|
@@ -850,7 +902,7 @@ static VALUE FieldDescriptor_clear(VALUE _self, VALUE msg_rb) {
|
|
|
850
902
|
static VALUE FieldDescriptor_set(VALUE _self, VALUE msg_rb, VALUE value) {
|
|
851
903
|
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
|
852
904
|
const upb_MessageDef* m;
|
|
853
|
-
|
|
905
|
+
upb_Message* msg = Message_GetMutable(msg_rb, &m);
|
|
854
906
|
upb_Arena* arena = Arena_get(Message_GetArena(msg_rb));
|
|
855
907
|
upb_MessageValue msgval;
|
|
856
908
|
|
|
@@ -864,6 +916,25 @@ static VALUE FieldDescriptor_set(VALUE _self, VALUE msg_rb, VALUE value) {
|
|
|
864
916
|
return Qnil;
|
|
865
917
|
}
|
|
866
918
|
|
|
919
|
+
/*
|
|
920
|
+
* call-seq:
|
|
921
|
+
* FieldDescriptor.options => options
|
|
922
|
+
*
|
|
923
|
+
* Returns the `FieldOptions` for this `FieldDescriptor`.
|
|
924
|
+
*/
|
|
925
|
+
static VALUE FieldDescriptor_options(VALUE _self) {
|
|
926
|
+
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
|
|
927
|
+
const google_protobuf_FieldOptions* opts =
|
|
928
|
+
upb_FieldDef_Options(self->fielddef);
|
|
929
|
+
upb_Arena* arena = upb_Arena_New();
|
|
930
|
+
size_t size;
|
|
931
|
+
char* serialized = google_protobuf_FieldOptions_serialize(opts, arena, &size);
|
|
932
|
+
VALUE field_options = decode_options(_self, "FieldOptions", size, serialized,
|
|
933
|
+
self->descriptor_pool);
|
|
934
|
+
upb_Arena_Free(arena);
|
|
935
|
+
return field_options;
|
|
936
|
+
}
|
|
937
|
+
|
|
867
938
|
static void FieldDescriptor_register(VALUE module) {
|
|
868
939
|
VALUE klass = rb_define_class_under(module, "FieldDescriptor", rb_cObject);
|
|
869
940
|
rb_define_alloc_func(klass, FieldDescriptor_alloc);
|
|
@@ -871,6 +942,8 @@ static void FieldDescriptor_register(VALUE module) {
|
|
|
871
942
|
rb_define_method(klass, "name", FieldDescriptor_name, 0);
|
|
872
943
|
rb_define_method(klass, "type", FieldDescriptor__type, 0);
|
|
873
944
|
rb_define_method(klass, "default", FieldDescriptor_default, 0);
|
|
945
|
+
rb_define_method(klass, "has_presence?", FieldDescriptor_has_presence, 0);
|
|
946
|
+
rb_define_method(klass, "is_packed?", FieldDescriptor_is_packed, 0);
|
|
874
947
|
rb_define_method(klass, "json_name", FieldDescriptor_json_name, 0);
|
|
875
948
|
rb_define_method(klass, "label", FieldDescriptor_label, 0);
|
|
876
949
|
rb_define_method(klass, "number", FieldDescriptor_number, 0);
|
|
@@ -880,6 +953,7 @@ static void FieldDescriptor_register(VALUE module) {
|
|
|
880
953
|
rb_define_method(klass, "clear", FieldDescriptor_clear, 1);
|
|
881
954
|
rb_define_method(klass, "get", FieldDescriptor_get, 1);
|
|
882
955
|
rb_define_method(klass, "set", FieldDescriptor_set, 2);
|
|
956
|
+
rb_define_method(klass, "options", FieldDescriptor_options, 0);
|
|
883
957
|
rb_gc_register_address(&cFieldDescriptor);
|
|
884
958
|
cFieldDescriptor = klass;
|
|
885
959
|
}
|
|
@@ -979,12 +1053,32 @@ static VALUE OneofDescriptor_each(VALUE _self) {
|
|
|
979
1053
|
return Qnil;
|
|
980
1054
|
}
|
|
981
1055
|
|
|
1056
|
+
/*
|
|
1057
|
+
* call-seq:
|
|
1058
|
+
* OneofDescriptor.options => options
|
|
1059
|
+
*
|
|
1060
|
+
* Returns the `OneofOptions` for this `OneofDescriptor`.
|
|
1061
|
+
*/
|
|
1062
|
+
static VALUE OneOfDescriptor_options(VALUE _self) {
|
|
1063
|
+
OneofDescriptor* self = ruby_to_OneofDescriptor(_self);
|
|
1064
|
+
const google_protobuf_OneofOptions* opts =
|
|
1065
|
+
upb_OneofDef_Options(self->oneofdef);
|
|
1066
|
+
upb_Arena* arena = upb_Arena_New();
|
|
1067
|
+
size_t size;
|
|
1068
|
+
char* serialized = google_protobuf_OneofOptions_serialize(opts, arena, &size);
|
|
1069
|
+
VALUE oneof_options = decode_options(_self, "OneofOptions", size, serialized,
|
|
1070
|
+
self->descriptor_pool);
|
|
1071
|
+
upb_Arena_Free(arena);
|
|
1072
|
+
return oneof_options;
|
|
1073
|
+
}
|
|
1074
|
+
|
|
982
1075
|
static void OneofDescriptor_register(VALUE module) {
|
|
983
1076
|
VALUE klass = rb_define_class_under(module, "OneofDescriptor", rb_cObject);
|
|
984
1077
|
rb_define_alloc_func(klass, OneofDescriptor_alloc);
|
|
985
1078
|
rb_define_method(klass, "initialize", OneofDescriptor_initialize, 3);
|
|
986
1079
|
rb_define_method(klass, "name", OneofDescriptor_name, 0);
|
|
987
1080
|
rb_define_method(klass, "each", OneofDescriptor_each, 0);
|
|
1081
|
+
rb_define_method(klass, "options", OneOfDescriptor_options, 0);
|
|
988
1082
|
rb_include_module(klass, rb_mEnumerable);
|
|
989
1083
|
rb_gc_register_address(&cOneofDescriptor);
|
|
990
1084
|
cOneofDescriptor = klass;
|
|
@@ -1070,6 +1164,17 @@ static VALUE EnumDescriptor_file_descriptor(VALUE _self) {
|
|
|
1070
1164
|
upb_EnumDef_File(self->enumdef));
|
|
1071
1165
|
}
|
|
1072
1166
|
|
|
1167
|
+
/*
|
|
1168
|
+
* call-seq:
|
|
1169
|
+
* EnumDescriptor.is_closed? => bool
|
|
1170
|
+
*
|
|
1171
|
+
* Returns whether this enum is open or closed.
|
|
1172
|
+
*/
|
|
1173
|
+
static VALUE EnumDescriptor_is_closed(VALUE _self) {
|
|
1174
|
+
EnumDescriptor* self = ruby_to_EnumDescriptor(_self);
|
|
1175
|
+
return upb_EnumDef_IsClosed(self->enumdef) ? Qtrue : Qfalse;
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1073
1178
|
/*
|
|
1074
1179
|
* call-seq:
|
|
1075
1180
|
* EnumDescriptor.name => name
|
|
@@ -1154,6 +1259,24 @@ static VALUE EnumDescriptor_enummodule(VALUE _self) {
|
|
|
1154
1259
|
return self->module;
|
|
1155
1260
|
}
|
|
1156
1261
|
|
|
1262
|
+
/*
|
|
1263
|
+
* call-seq:
|
|
1264
|
+
* EnumDescriptor.options => options
|
|
1265
|
+
*
|
|
1266
|
+
* Returns the `EnumOptions` for this `EnumDescriptor`.
|
|
1267
|
+
*/
|
|
1268
|
+
static VALUE EnumDescriptor_options(VALUE _self) {
|
|
1269
|
+
EnumDescriptor* self = ruby_to_EnumDescriptor(_self);
|
|
1270
|
+
const google_protobuf_EnumOptions* opts = upb_EnumDef_Options(self->enumdef);
|
|
1271
|
+
upb_Arena* arena = upb_Arena_New();
|
|
1272
|
+
size_t size;
|
|
1273
|
+
char* serialized = google_protobuf_EnumOptions_serialize(opts, arena, &size);
|
|
1274
|
+
VALUE enum_options = decode_options(_self, "EnumOptions", size, serialized,
|
|
1275
|
+
self->descriptor_pool);
|
|
1276
|
+
upb_Arena_Free(arena);
|
|
1277
|
+
return enum_options;
|
|
1278
|
+
}
|
|
1279
|
+
|
|
1157
1280
|
static void EnumDescriptor_register(VALUE module) {
|
|
1158
1281
|
VALUE klass = rb_define_class_under(module, "EnumDescriptor", rb_cObject);
|
|
1159
1282
|
rb_define_alloc_func(klass, EnumDescriptor_alloc);
|
|
@@ -1164,6 +1287,8 @@ static void EnumDescriptor_register(VALUE module) {
|
|
|
1164
1287
|
rb_define_method(klass, "each", EnumDescriptor_each, 0);
|
|
1165
1288
|
rb_define_method(klass, "enummodule", EnumDescriptor_enummodule, 0);
|
|
1166
1289
|
rb_define_method(klass, "file_descriptor", EnumDescriptor_file_descriptor, 0);
|
|
1290
|
+
rb_define_method(klass, "is_closed?", EnumDescriptor_is_closed, 0);
|
|
1291
|
+
rb_define_method(klass, "options", EnumDescriptor_options, 0);
|
|
1167
1292
|
rb_include_module(klass, rb_mEnumerable);
|
|
1168
1293
|
rb_gc_register_address(&cEnumDescriptor);
|
|
1169
1294
|
cEnumDescriptor = klass;
|
|
@@ -1,32 +1,9 @@
|
|
|
1
1
|
// Protocol Buffers - Google's data interchange format
|
|
2
2
|
// Copyright 2008 Google Inc. All rights reserved.
|
|
3
|
-
// https://developers.google.com/protocol-buffers/
|
|
4
3
|
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// * Redistributions of source code must retain the above copyright
|
|
10
|
-
// notice, this list of conditions and the following disclaimer.
|
|
11
|
-
// * Redistributions in binary form must reproduce the above
|
|
12
|
-
// copyright notice, this list of conditions and the following disclaimer
|
|
13
|
-
// in the documentation and/or other materials provided with the
|
|
14
|
-
// distribution.
|
|
15
|
-
// * Neither the name of Google Inc. nor the names of its
|
|
16
|
-
// contributors may be used to endorse or promote products derived from
|
|
17
|
-
// this software without specific prior written permission.
|
|
18
|
-
//
|
|
19
|
-
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
20
|
-
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
21
|
-
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
22
|
-
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
23
|
-
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
24
|
-
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
25
|
-
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
26
|
-
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
27
|
-
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
28
|
-
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
29
|
-
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
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
|
|
30
7
|
|
|
31
8
|
#ifndef RUBY_PROTOBUF_DEFS_H_
|
|
32
9
|
#define RUBY_PROTOBUF_DEFS_H_
|
|
@@ -22,6 +22,7 @@ $INCFLAGS += " -I$(srcdir)/third_party/utf8_range"
|
|
|
22
22
|
|
|
23
23
|
$srcs = ["protobuf.c", "convert.c", "defs.c", "message.c",
|
|
24
24
|
"repeated_field.c", "map.c", "ruby-upb.c", "wrap_memcpy.c",
|
|
25
|
-
"
|
|
25
|
+
"utf8_range.c", "shared_convert.c",
|
|
26
|
+
"shared_message.c"]
|
|
26
27
|
|
|
27
28
|
create_makefile(ext_name)
|