google-protobuf 3.21.12-x86_64-linux → 3.22.0.rc.2-x86_64-linux
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.
Potentially problematic release.
This version of google-protobuf might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/ext/google/protobuf_c/convert.c +0 -0
- data/ext/google/protobuf_c/convert.h +0 -0
- data/ext/google/protobuf_c/defs.c +3 -3
- data/ext/google/protobuf_c/defs.h +0 -0
- data/ext/google/protobuf_c/extconf.rb +2 -2
- data/ext/google/protobuf_c/map.c +27 -42
- data/ext/google/protobuf_c/map.h +0 -0
- data/ext/google/protobuf_c/message.c +112 -86
- data/ext/google/protobuf_c/message.h +0 -0
- data/ext/google/protobuf_c/protobuf.c +0 -0
- data/ext/google/protobuf_c/protobuf.h +0 -0
- data/ext/google/protobuf_c/repeated_field.c +0 -0
- data/ext/google/protobuf_c/repeated_field.h +0 -0
- data/ext/google/protobuf_c/ruby-upb.c +11144 -9889
- data/ext/google/protobuf_c/ruby-upb.h +9285 -4982
- data/ext/google/protobuf_c/third_party/utf8_range/LICENSE +1 -0
- data/ext/google/protobuf_c/third_party/utf8_range/naive.c +0 -0
- data/ext/google/protobuf_c/third_party/utf8_range/range2-neon.c +1 -1
- data/ext/google/protobuf_c/third_party/utf8_range/range2-sse.c +0 -0
- data/ext/google/protobuf_c/third_party/utf8_range/utf8_range.h +13 -1
- data/ext/google/protobuf_c/wrap_memcpy.c +0 -0
- data/lib/google/2.6/protobuf_c.so +0 -0
- data/lib/google/2.7/protobuf_c.so +0 -0
- data/lib/google/3.0/protobuf_c.so +0 -0
- data/lib/google/3.1/protobuf_c.so +0 -0
- data/lib/google/3.2/protobuf_c.so +0 -0
- data/lib/google/protobuf/any_pb.rb +0 -0
- data/lib/google/protobuf/api_pb.rb +0 -0
- data/lib/google/protobuf/descriptor_dsl.rb +0 -0
- data/lib/google/protobuf/descriptor_pb.rb +41 -12
- data/lib/google/protobuf/duration_pb.rb +0 -0
- data/lib/google/protobuf/empty_pb.rb +0 -0
- data/lib/google/protobuf/field_mask_pb.rb +0 -0
- data/lib/google/protobuf/message_exts.rb +5 -0
- data/lib/google/protobuf/plugin_pb.rb +50 -0
- data/lib/google/protobuf/repeated_field.rb +0 -0
- data/lib/google/protobuf/source_context_pb.rb +0 -0
- data/lib/google/protobuf/struct_pb.rb +0 -0
- data/lib/google/protobuf/timestamp_pb.rb +0 -0
- data/lib/google/protobuf/type_pb.rb +0 -0
- data/lib/google/protobuf/wrappers_pb.rb +0 -0
- data/lib/google/protobuf.rb +0 -0
- metadata +14 -19
- data/lib/google/2.5/protobuf_c.so +0 -0
- data/tests/basic.rb +0 -739
- data/tests/generated_code_test.rb +0 -23
- data/tests/stress.rb +0 -38
@@ -37,6 +37,7 @@
|
|
37
37
|
#include "repeated_field.h"
|
38
38
|
|
39
39
|
static VALUE cParseError = Qnil;
|
40
|
+
static VALUE cAbstractMessage = Qnil;
|
40
41
|
static ID descriptor_instancevar_interned;
|
41
42
|
|
42
43
|
static VALUE initialize_rb_class_with_no_args(VALUE klass) {
|
@@ -145,7 +146,8 @@ void Message_PrintMessage(StringBuilder* b, const upb_Message* msg,
|
|
145
146
|
for (int i = 0; i < n; i++) {
|
146
147
|
const upb_FieldDef* field = upb_MessageDef_Field(m, i);
|
147
148
|
|
148
|
-
if (upb_FieldDef_HasPresence(field) &&
|
149
|
+
if (upb_FieldDef_HasPresence(field) &&
|
150
|
+
!upb_Message_HasFieldByDef(msg, field)) {
|
149
151
|
continue;
|
150
152
|
}
|
151
153
|
|
@@ -155,7 +157,7 @@ void Message_PrintMessage(StringBuilder* b, const upb_Message* msg,
|
|
155
157
|
first = false;
|
156
158
|
}
|
157
159
|
|
158
|
-
upb_MessageValue msgval =
|
160
|
+
upb_MessageValue msgval = upb_Message_GetFieldByDef(msg, field);
|
159
161
|
|
160
162
|
StringBuilder_Printf(b, "%s: ", upb_FieldDef_Name(field));
|
161
163
|
|
@@ -278,7 +280,8 @@ static VALUE Message_oneof_accessor(VALUE _self, const upb_OneofDef* o,
|
|
278
280
|
return oneof_field == NULL ? Qfalse : Qtrue;
|
279
281
|
case METHOD_CLEAR:
|
280
282
|
if (oneof_field != NULL) {
|
281
|
-
|
283
|
+
upb_Message_ClearFieldByDef(Message_GetMutable(_self, NULL),
|
284
|
+
oneof_field);
|
282
285
|
}
|
283
286
|
return Qnil;
|
284
287
|
case METHOD_GETTER:
|
@@ -301,13 +304,13 @@ static void Message_setfield(upb_Message* msg, const upb_FieldDef* f, VALUE val,
|
|
301
304
|
} else {
|
302
305
|
if (val == Qnil &&
|
303
306
|
(upb_FieldDef_IsSubMessage(f) || upb_FieldDef_RealContainingOneof(f))) {
|
304
|
-
|
307
|
+
upb_Message_ClearFieldByDef(msg, f);
|
305
308
|
return;
|
306
309
|
}
|
307
310
|
msgval =
|
308
311
|
Convert_RubyToUpb(val, upb_FieldDef_Name(f), TypeInfo_get(f), arena);
|
309
312
|
}
|
310
|
-
|
313
|
+
upb_Message_SetFieldByDef(msg, f, msgval, arena);
|
311
314
|
}
|
312
315
|
|
313
316
|
VALUE Message_getfield(VALUE _self, const upb_FieldDef* f) {
|
@@ -329,12 +332,12 @@ VALUE Message_getfield(VALUE _self, const upb_FieldDef* f) {
|
|
329
332
|
upb_Array* arr = upb_Message_Mutable(msg, f, arena).array;
|
330
333
|
return RepeatedField_GetRubyWrapper(arr, TypeInfo_get(f), self->arena);
|
331
334
|
} else if (upb_FieldDef_IsSubMessage(f)) {
|
332
|
-
if (!
|
335
|
+
if (!upb_Message_HasFieldByDef(self->msg, f)) return Qnil;
|
333
336
|
upb_Message* submsg = upb_Message_Mutable(msg, f, arena).msg;
|
334
337
|
const upb_MessageDef* m = upb_FieldDef_MessageSubDef(f);
|
335
338
|
return Message_GetRubyWrapper(submsg, m, self->arena);
|
336
339
|
} else {
|
337
|
-
upb_MessageValue msgval =
|
340
|
+
upb_MessageValue msgval = upb_Message_GetFieldByDef(self->msg, f);
|
338
341
|
return Convert_UpbToRuby(msgval, TypeInfo_get(f), self->arena);
|
339
342
|
}
|
340
343
|
}
|
@@ -348,23 +351,24 @@ static VALUE Message_field_accessor(VALUE _self, const upb_FieldDef* f,
|
|
348
351
|
Message_setfield(Message_GetMutable(_self, NULL), f, argv[1], arena);
|
349
352
|
return Qnil;
|
350
353
|
case METHOD_CLEAR:
|
351
|
-
|
354
|
+
upb_Message_ClearFieldByDef(Message_GetMutable(_self, NULL), f);
|
352
355
|
return Qnil;
|
353
356
|
case METHOD_PRESENCE:
|
354
357
|
if (!upb_FieldDef_HasPresence(f)) {
|
355
358
|
rb_raise(rb_eRuntimeError, "Field does not have presence.");
|
356
359
|
}
|
357
|
-
return
|
360
|
+
return upb_Message_HasFieldByDef(Message_Get(_self, NULL), f);
|
358
361
|
case METHOD_WRAPPER_GETTER: {
|
359
362
|
Message* self = ruby_to_Message(_self);
|
360
|
-
if (
|
363
|
+
if (upb_Message_HasFieldByDef(self->msg, f)) {
|
361
364
|
PBRUBY_ASSERT(upb_FieldDef_IsSubMessage(f) &&
|
362
365
|
!upb_FieldDef_IsRepeated(f));
|
363
|
-
upb_MessageValue wrapper =
|
366
|
+
upb_MessageValue wrapper = upb_Message_GetFieldByDef(self->msg, f);
|
364
367
|
const upb_MessageDef* wrapper_m = upb_FieldDef_MessageSubDef(f);
|
365
368
|
const upb_FieldDef* value_f =
|
366
369
|
upb_MessageDef_FindFieldByNumber(wrapper_m, 1);
|
367
|
-
upb_MessageValue value =
|
370
|
+
upb_MessageValue value =
|
371
|
+
upb_Message_GetFieldByDef(wrapper.msg_val, value_f);
|
368
372
|
return Convert_UpbToRuby(value, TypeInfo_get(value_f), self->arena);
|
369
373
|
} else {
|
370
374
|
return Qnil;
|
@@ -373,19 +377,20 @@ static VALUE Message_field_accessor(VALUE _self, const upb_FieldDef* f,
|
|
373
377
|
case METHOD_WRAPPER_SETTER: {
|
374
378
|
upb_Message* msg = Message_GetMutable(_self, NULL);
|
375
379
|
if (argv[1] == Qnil) {
|
376
|
-
|
380
|
+
upb_Message_ClearFieldByDef(msg, f);
|
377
381
|
} else {
|
378
382
|
const upb_FieldDef* val_f =
|
379
383
|
upb_MessageDef_FindFieldByNumber(upb_FieldDef_MessageSubDef(f), 1);
|
380
384
|
upb_MessageValue msgval = Convert_RubyToUpb(
|
381
385
|
argv[1], upb_FieldDef_Name(f), TypeInfo_get(val_f), arena);
|
382
386
|
upb_Message* wrapper = upb_Message_Mutable(msg, f, arena).msg;
|
383
|
-
|
387
|
+
upb_Message_SetFieldByDef(wrapper, val_f, msgval, arena);
|
384
388
|
}
|
385
389
|
return Qnil;
|
386
390
|
}
|
387
391
|
case METHOD_ENUM_GETTER: {
|
388
|
-
upb_MessageValue msgval =
|
392
|
+
upb_MessageValue msgval =
|
393
|
+
upb_Message_GetFieldByDef(Message_Get(_self, NULL), f);
|
389
394
|
|
390
395
|
if (upb_FieldDef_Label(f) == kUpb_Label_Repeated) {
|
391
396
|
// Map repeated fields to a new type with ints
|
@@ -510,8 +515,8 @@ static int Map_initialize_kwarg(VALUE key, VALUE val, VALUE _self) {
|
|
510
515
|
k = Convert_RubyToUpb(key, "", map_init->key_type, NULL);
|
511
516
|
|
512
517
|
if (map_init->val_type.type == kUpb_CType_Message && TYPE(val) == T_HASH) {
|
513
|
-
|
514
|
-
|
518
|
+
upb_MiniTable* t = upb_MessageDef_MiniTable(map_init->val_type.def.msgdef);
|
519
|
+
upb_Message* msg = upb_Message_New(t, map_init->arena);
|
515
520
|
Message_InitFromValue(msg, map_init->val_type.def.msgdef, val,
|
516
521
|
map_init->arena);
|
517
522
|
v.msg_val = msg;
|
@@ -541,7 +546,8 @@ static upb_MessageValue MessageValue_FromValue(VALUE val, TypeInfo info,
|
|
541
546
|
upb_Arena* arena) {
|
542
547
|
if (info.type == kUpb_CType_Message) {
|
543
548
|
upb_MessageValue msgval;
|
544
|
-
|
549
|
+
upb_MiniTable* t = upb_MessageDef_MiniTable(info.def.msgdef);
|
550
|
+
upb_Message* msg = upb_Message_New(t, arena);
|
545
551
|
Message_InitFromValue(msg, info.def.msgdef, val, arena);
|
546
552
|
msgval.msg_val = msg;
|
547
553
|
return msgval;
|
@@ -593,7 +599,7 @@ static void Message_InitFieldFromValue(upb_Message* msg, const upb_FieldDef* f,
|
|
593
599
|
} else {
|
594
600
|
upb_MessageValue msgval =
|
595
601
|
Convert_RubyToUpb(val, upb_FieldDef_Name(f), TypeInfo_get(f), arena);
|
596
|
-
|
602
|
+
upb_Message_SetFieldByDef(msg, f, msgval, arena);
|
597
603
|
}
|
598
604
|
}
|
599
605
|
|
@@ -656,7 +662,8 @@ static VALUE Message_initialize(int argc, VALUE* argv, VALUE _self) {
|
|
656
662
|
Message* self = ruby_to_Message(_self);
|
657
663
|
VALUE arena_rb = Arena_new();
|
658
664
|
upb_Arena* arena = Arena_get(arena_rb);
|
659
|
-
|
665
|
+
upb_MiniTable* t = upb_MessageDef_MiniTable(self->msgdef);
|
666
|
+
upb_Message* msg = upb_Message_New(t, arena);
|
660
667
|
|
661
668
|
Message_InitPtr(_self, msg, arena_rb);
|
662
669
|
|
@@ -695,15 +702,20 @@ bool Message_Equal(const upb_Message* m1, const upb_Message* m2,
|
|
695
702
|
if (m1 == m2) return true;
|
696
703
|
|
697
704
|
size_t size1, size2;
|
698
|
-
int encode_opts =
|
705
|
+
int encode_opts =
|
706
|
+
kUpb_EncodeOption_SkipUnknown | kUpb_EncodeOption_Deterministic;
|
699
707
|
upb_Arena* arena_tmp = upb_Arena_New();
|
700
708
|
const upb_MiniTable* layout = upb_MessageDef_MiniTable(m);
|
701
709
|
|
702
710
|
// Compare deterministically serialized payloads with no unknown fields.
|
703
|
-
char* data1
|
704
|
-
char* data2
|
705
|
-
|
706
|
-
|
711
|
+
char* data1;
|
712
|
+
char* data2;
|
713
|
+
upb_EncodeStatus status1 =
|
714
|
+
upb_Encode(m1, layout, encode_opts, arena_tmp, &data1, &size1);
|
715
|
+
upb_EncodeStatus status2 =
|
716
|
+
upb_Encode(m2, layout, encode_opts, arena_tmp, &data2, &size2);
|
717
|
+
|
718
|
+
if (status1 == kUpb_EncodeStatus_Ok && status2 == kUpb_EncodeStatus_Ok) {
|
707
719
|
bool ret = (size1 == size2) && (memcmp(data1, data2, size1) == 0);
|
708
720
|
upb_Arena_Free(arena_tmp);
|
709
721
|
return ret;
|
@@ -735,15 +747,16 @@ static VALUE Message_eq(VALUE _self, VALUE _other) {
|
|
735
747
|
uint64_t Message_Hash(const upb_Message* msg, const upb_MessageDef* m,
|
736
748
|
uint64_t seed) {
|
737
749
|
upb_Arena* arena = upb_Arena_New();
|
738
|
-
|
750
|
+
char* data;
|
739
751
|
size_t size;
|
740
752
|
|
741
753
|
// Hash a deterministically serialized payloads with no unknown fields.
|
742
|
-
|
743
|
-
|
744
|
-
|
754
|
+
upb_EncodeStatus status = upb_Encode(
|
755
|
+
msg, upb_MessageDef_MiniTable(m),
|
756
|
+
kUpb_EncodeOption_SkipUnknown | kUpb_EncodeOption_Deterministic, arena,
|
757
|
+
&data, &size);
|
745
758
|
|
746
|
-
if (
|
759
|
+
if (status == kUpb_EncodeStatus_Ok) {
|
747
760
|
uint64_t ret = _upb_Hash(data, size, seed);
|
748
761
|
upb_Arena_Free(arena);
|
749
762
|
return ret;
|
@@ -823,7 +836,8 @@ static VALUE Message_CreateHash(const upb_Message* msg,
|
|
823
836
|
VALUE msg_key;
|
824
837
|
|
825
838
|
if (!is_proto2 && upb_FieldDef_IsSubMessage(field) &&
|
826
|
-
!upb_FieldDef_IsRepeated(field) &&
|
839
|
+
!upb_FieldDef_IsRepeated(field) &&
|
840
|
+
!upb_Message_HasFieldByDef(msg, field)) {
|
827
841
|
// TODO: Legacy behavior, remove when we fix the is_proto2 differences.
|
828
842
|
msg_key = ID2SYM(rb_intern(upb_FieldDef_Name(field)));
|
829
843
|
rb_hash_aset(hash, msg_key, Qnil);
|
@@ -832,12 +846,12 @@ static VALUE Message_CreateHash(const upb_Message* msg,
|
|
832
846
|
|
833
847
|
// Do not include fields that are not present (oneof or optional fields).
|
834
848
|
if (is_proto2 && upb_FieldDef_HasPresence(field) &&
|
835
|
-
!
|
849
|
+
!upb_Message_HasFieldByDef(msg, field)) {
|
836
850
|
continue;
|
837
851
|
}
|
838
852
|
|
839
853
|
msg_key = ID2SYM(rb_intern(upb_FieldDef_Name(field)));
|
840
|
-
msgval =
|
854
|
+
msgval = upb_Message_GetFieldByDef(msg, field);
|
841
855
|
|
842
856
|
// Proto2 omits empty map/repeated filds also.
|
843
857
|
|
@@ -940,7 +954,7 @@ static VALUE Message_index_set(VALUE _self, VALUE field_name, VALUE value) {
|
|
940
954
|
}
|
941
955
|
|
942
956
|
val = Convert_RubyToUpb(value, upb_FieldDef_Name(f), TypeInfo_get(f), arena);
|
943
|
-
|
957
|
+
upb_Message_SetFieldByDef(Message_GetMutable(_self, NULL), f, val, arena);
|
944
958
|
|
945
959
|
return Qnil;
|
946
960
|
}
|
@@ -969,7 +983,8 @@ static VALUE Message_decode(int argc, VALUE* argv, VALUE klass) {
|
|
969
983
|
rb_raise(rb_eArgError, "Expected hash arguments.");
|
970
984
|
}
|
971
985
|
|
972
|
-
VALUE depth =
|
986
|
+
VALUE depth =
|
987
|
+
rb_hash_lookup(hash_args, ID2SYM(rb_intern("recursion_limit")));
|
973
988
|
|
974
989
|
if (depth != Qnil && TYPE(depth) == T_FIXNUM) {
|
975
990
|
options |= UPB_DECODE_MAXDEPTH(FIX2INT(depth));
|
@@ -983,9 +998,10 @@ static VALUE Message_decode(int argc, VALUE* argv, VALUE klass) {
|
|
983
998
|
VALUE msg_rb = initialize_rb_class_with_no_args(klass);
|
984
999
|
Message* msg = ruby_to_Message(msg_rb);
|
985
1000
|
|
986
|
-
upb_DecodeStatus status =
|
987
|
-
RSTRING_PTR(data), RSTRING_LEN(data), (upb_Message*)msg->msg,
|
988
|
-
|
1001
|
+
upb_DecodeStatus status =
|
1002
|
+
upb_Decode(RSTRING_PTR(data), RSTRING_LEN(data), (upb_Message*)msg->msg,
|
1003
|
+
upb_MessageDef_MiniTable(msg->msgdef), NULL, options,
|
1004
|
+
Arena_get(msg->arena));
|
989
1005
|
|
990
1006
|
if (status != kUpb_DecodeStatus_Ok) {
|
991
1007
|
rb_raise(cParseError, "Error occurred during parsing");
|
@@ -1069,7 +1085,7 @@ static VALUE Message_decode_json(int argc, VALUE* argv, VALUE klass) {
|
|
1069
1085
|
static VALUE Message_encode(int argc, VALUE* argv, VALUE klass) {
|
1070
1086
|
Message* msg = ruby_to_Message(argv[0]);
|
1071
1087
|
int options = 0;
|
1072
|
-
|
1088
|
+
char* data;
|
1073
1089
|
size_t size;
|
1074
1090
|
|
1075
1091
|
if (CLASS_OF(argv[0]) != klass) {
|
@@ -1085,19 +1101,21 @@ static VALUE Message_encode(int argc, VALUE* argv, VALUE klass) {
|
|
1085
1101
|
if (TYPE(hash_args) != T_HASH) {
|
1086
1102
|
rb_raise(rb_eArgError, "Expected hash arguments.");
|
1087
1103
|
}
|
1088
|
-
VALUE depth =
|
1104
|
+
VALUE depth =
|
1105
|
+
rb_hash_lookup(hash_args, ID2SYM(rb_intern("recursion_limit")));
|
1089
1106
|
|
1090
1107
|
if (depth != Qnil && TYPE(depth) == T_FIXNUM) {
|
1091
1108
|
options |= UPB_DECODE_MAXDEPTH(FIX2INT(depth));
|
1092
1109
|
}
|
1093
1110
|
}
|
1094
1111
|
|
1095
|
-
upb_Arena
|
1112
|
+
upb_Arena* arena = upb_Arena_New();
|
1096
1113
|
|
1097
|
-
|
1098
|
-
|
1114
|
+
upb_EncodeStatus status =
|
1115
|
+
upb_Encode(msg->msg, upb_MessageDef_MiniTable(msg->msgdef), options,
|
1116
|
+
arena, &data, &size);
|
1099
1117
|
|
1100
|
-
if (
|
1118
|
+
if (status == kUpb_EncodeStatus_Ok) {
|
1101
1119
|
VALUE ret = rb_str_new(data, size);
|
1102
1120
|
rb_enc_associate(ret, rb_ascii8bit_encoding());
|
1103
1121
|
upb_Arena_Free(arena);
|
@@ -1135,7 +1153,8 @@ static VALUE Message_encode_json(int argc, VALUE* argv, VALUE klass) {
|
|
1135
1153
|
if (argc == 2) {
|
1136
1154
|
VALUE hash_args = argv[1];
|
1137
1155
|
if (TYPE(hash_args) != T_HASH) {
|
1138
|
-
if (RTEST(rb_funcall(hash_args, rb_intern("respond_to?"), 1,
|
1156
|
+
if (RTEST(rb_funcall(hash_args, rb_intern("respond_to?"), 1,
|
1157
|
+
rb_str_new2("to_h")))) {
|
1139
1158
|
hash_args = rb_funcall(hash_args, rb_intern("to_h"), 0);
|
1140
1159
|
} else {
|
1141
1160
|
rb_raise(rb_eArgError, "Expected hash arguments.");
|
@@ -1201,36 +1220,8 @@ VALUE build_class_from_descriptor(VALUE descriptor) {
|
|
1201
1220
|
klass = rb_define_class_id(
|
1202
1221
|
// Docs say this parameter is ignored. User will assign return value to
|
1203
1222
|
// their own toplevel constant class name.
|
1204
|
-
rb_intern("Message"),
|
1223
|
+
rb_intern("Message"), cAbstractMessage);
|
1205
1224
|
rb_ivar_set(klass, descriptor_instancevar_interned, descriptor);
|
1206
|
-
rb_define_alloc_func(klass, Message_alloc);
|
1207
|
-
rb_require("google/protobuf/message_exts");
|
1208
|
-
rb_include_module(klass, rb_eval_string("::Google::Protobuf::MessageExts"));
|
1209
|
-
rb_extend_object(
|
1210
|
-
klass, rb_eval_string("::Google::Protobuf::MessageExts::ClassMethods"));
|
1211
|
-
|
1212
|
-
rb_define_method(klass, "method_missing", Message_method_missing, -1);
|
1213
|
-
rb_define_method(klass, "respond_to_missing?", Message_respond_to_missing,
|
1214
|
-
-1);
|
1215
|
-
rb_define_method(klass, "initialize", Message_initialize, -1);
|
1216
|
-
rb_define_method(klass, "dup", Message_dup, 0);
|
1217
|
-
// Also define #clone so that we don't inherit Object#clone.
|
1218
|
-
rb_define_method(klass, "clone", Message_dup, 0);
|
1219
|
-
rb_define_method(klass, "==", Message_eq, 1);
|
1220
|
-
rb_define_method(klass, "eql?", Message_eq, 1);
|
1221
|
-
rb_define_method(klass, "freeze", Message_freeze, 0);
|
1222
|
-
rb_define_method(klass, "hash", Message_hash, 0);
|
1223
|
-
rb_define_method(klass, "to_h", Message_to_h, 0);
|
1224
|
-
rb_define_method(klass, "inspect", Message_inspect, 0);
|
1225
|
-
rb_define_method(klass, "to_s", Message_inspect, 0);
|
1226
|
-
rb_define_method(klass, "[]", Message_index, 1);
|
1227
|
-
rb_define_method(klass, "[]=", Message_index_set, 2);
|
1228
|
-
rb_define_singleton_method(klass, "decode", Message_decode, -1);
|
1229
|
-
rb_define_singleton_method(klass, "encode", Message_encode, -1);
|
1230
|
-
rb_define_singleton_method(klass, "decode_json", Message_decode_json, -1);
|
1231
|
-
rb_define_singleton_method(klass, "encode_json", Message_encode_json, -1);
|
1232
|
-
rb_define_singleton_method(klass, "descriptor", Message_descriptor, 0);
|
1233
|
-
|
1234
1225
|
return klass;
|
1235
1226
|
}
|
1236
1227
|
|
@@ -1316,7 +1307,7 @@ VALUE build_module_from_enumdesc(VALUE _enumdesc) {
|
|
1316
1307
|
return mod;
|
1317
1308
|
}
|
1318
1309
|
|
1319
|
-
// Internal
|
1310
|
+
// Internal to the library; used by Google::Protobuf.deep_copy.
|
1320
1311
|
upb_Message* Message_deep_copy(const upb_Message* msg, const upb_MessageDef* m,
|
1321
1312
|
upb_Arena* arena) {
|
1322
1313
|
// Serialize and parse.
|
@@ -1324,11 +1315,13 @@ upb_Message* Message_deep_copy(const upb_Message* msg, const upb_MessageDef* m,
|
|
1324
1315
|
const upb_MiniTable* layout = upb_MessageDef_MiniTable(m);
|
1325
1316
|
size_t size;
|
1326
1317
|
|
1327
|
-
|
1328
|
-
|
1318
|
+
upb_Message* new_msg = upb_Message_New(layout, arena);
|
1319
|
+
char* data;
|
1329
1320
|
|
1330
|
-
if (
|
1331
|
-
|
1321
|
+
if (upb_Encode(msg, layout, 0, tmp_arena, &data, &size) !=
|
1322
|
+
kUpb_EncodeStatus_Ok ||
|
1323
|
+
upb_Decode(data, size, new_msg, layout, NULL, 0, arena) !=
|
1324
|
+
kUpb_DecodeStatus_Ok) {
|
1332
1325
|
upb_Arena_Free(tmp_arena);
|
1333
1326
|
rb_raise(cParseError, "Error occurred copying proto");
|
1334
1327
|
}
|
@@ -1355,7 +1348,8 @@ const upb_Message* Message_GetUpbMessage(VALUE value, const upb_MessageDef* m,
|
|
1355
1348
|
switch (upb_MessageDef_WellKnownType(m)) {
|
1356
1349
|
case kUpb_WellKnown_Timestamp: {
|
1357
1350
|
// Time -> Google::Protobuf::Timestamp
|
1358
|
-
|
1351
|
+
const upb_MiniTable* t = upb_MessageDef_MiniTable(m);
|
1352
|
+
upb_Message* msg = upb_Message_New(t, arena);
|
1359
1353
|
upb_MessageValue sec, nsec;
|
1360
1354
|
struct timespec time;
|
1361
1355
|
const upb_FieldDef* sec_f = upb_MessageDef_FindFieldByNumber(m, 1);
|
@@ -1366,13 +1360,14 @@ const upb_Message* Message_GetUpbMessage(VALUE value, const upb_MessageDef* m,
|
|
1366
1360
|
time = rb_time_timespec(value);
|
1367
1361
|
sec.int64_val = time.tv_sec;
|
1368
1362
|
nsec.int32_val = time.tv_nsec;
|
1369
|
-
|
1370
|
-
|
1363
|
+
upb_Message_SetFieldByDef(msg, sec_f, sec, arena);
|
1364
|
+
upb_Message_SetFieldByDef(msg, nsec_f, nsec, arena);
|
1371
1365
|
return msg;
|
1372
1366
|
}
|
1373
1367
|
case kUpb_WellKnown_Duration: {
|
1374
1368
|
// Numeric -> Google::Protobuf::Duration
|
1375
|
-
|
1369
|
+
const upb_MiniTable* t = upb_MessageDef_MiniTable(m);
|
1370
|
+
upb_Message* msg = upb_Message_New(t, arena);
|
1376
1371
|
upb_MessageValue sec, nsec;
|
1377
1372
|
const upb_FieldDef* sec_f = upb_MessageDef_FindFieldByNumber(m, 1);
|
1378
1373
|
const upb_FieldDef* nsec_f = upb_MessageDef_FindFieldByNumber(m, 2);
|
@@ -1381,8 +1376,8 @@ const upb_Message* Message_GetUpbMessage(VALUE value, const upb_MessageDef* m,
|
|
1381
1376
|
|
1382
1377
|
sec.int64_val = NUM2LL(value);
|
1383
1378
|
nsec.int32_val = round((NUM2DBL(value) - NUM2LL(value)) * 1000000000);
|
1384
|
-
|
1385
|
-
|
1379
|
+
upb_Message_SetFieldByDef(msg, sec_f, sec, arena);
|
1380
|
+
upb_Message_SetFieldByDef(msg, nsec_f, nsec, arena);
|
1386
1381
|
return msg;
|
1387
1382
|
}
|
1388
1383
|
default:
|
@@ -1399,11 +1394,42 @@ const upb_Message* Message_GetUpbMessage(VALUE value, const upb_MessageDef* m,
|
|
1399
1394
|
return self->msg;
|
1400
1395
|
}
|
1401
1396
|
|
1397
|
+
static void Message_define_class(VALUE klass) {
|
1398
|
+
rb_define_alloc_func(klass, Message_alloc);
|
1399
|
+
|
1400
|
+
rb_require("google/protobuf/message_exts");
|
1401
|
+
rb_define_method(klass, "method_missing", Message_method_missing, -1);
|
1402
|
+
rb_define_method(klass, "respond_to_missing?", Message_respond_to_missing,
|
1403
|
+
-1);
|
1404
|
+
rb_define_method(klass, "initialize", Message_initialize, -1);
|
1405
|
+
rb_define_method(klass, "dup", Message_dup, 0);
|
1406
|
+
// Also define #clone so that we don't inherit Object#clone.
|
1407
|
+
rb_define_method(klass, "clone", Message_dup, 0);
|
1408
|
+
rb_define_method(klass, "==", Message_eq, 1);
|
1409
|
+
rb_define_method(klass, "eql?", Message_eq, 1);
|
1410
|
+
rb_define_method(klass, "freeze", Message_freeze, 0);
|
1411
|
+
rb_define_method(klass, "hash", Message_hash, 0);
|
1412
|
+
rb_define_method(klass, "to_h", Message_to_h, 0);
|
1413
|
+
rb_define_method(klass, "inspect", Message_inspect, 0);
|
1414
|
+
rb_define_method(klass, "to_s", Message_inspect, 0);
|
1415
|
+
rb_define_method(klass, "[]", Message_index, 1);
|
1416
|
+
rb_define_method(klass, "[]=", Message_index_set, 2);
|
1417
|
+
rb_define_singleton_method(klass, "decode", Message_decode, -1);
|
1418
|
+
rb_define_singleton_method(klass, "encode", Message_encode, -1);
|
1419
|
+
rb_define_singleton_method(klass, "decode_json", Message_decode_json, -1);
|
1420
|
+
rb_define_singleton_method(klass, "encode_json", Message_encode_json, -1);
|
1421
|
+
rb_define_singleton_method(klass, "descriptor", Message_descriptor, 0);
|
1422
|
+
}
|
1423
|
+
|
1402
1424
|
void Message_register(VALUE protobuf) {
|
1403
1425
|
cParseError = rb_const_get(protobuf, rb_intern("ParseError"));
|
1426
|
+
cAbstractMessage =
|
1427
|
+
rb_define_class_under(protobuf, "AbstractMessage", rb_cObject);
|
1428
|
+
Message_define_class(cAbstractMessage);
|
1429
|
+
rb_gc_register_address(&cAbstractMessage);
|
1404
1430
|
|
1405
1431
|
// Ruby-interned string: "descriptor". We use this identifier to store an
|
1406
1432
|
// instance variable on message classes we create in order to link them back
|
1407
1433
|
// to their descriptors.
|
1408
|
-
descriptor_instancevar_interned = rb_intern("descriptor");
|
1434
|
+
descriptor_instancevar_interned = rb_intern("@descriptor");
|
1409
1435
|
}
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|