google-protobuf 3.15.5-universal-darwin → 3.16.0.rc.2-universal-darwin

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of google-protobuf might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 152a419245524837e516b8041a033d25694b04aba29c011b50e789413bb077d1
4
- data.tar.gz: b9dc4f70c168a6b094c7b2a968d720e5078d1a179579ea08a968ad03a1582bac
3
+ metadata.gz: 85be90abe037181b7032630e25a902f2ba987276557cba282da815c72672e5da
4
+ data.tar.gz: ab8bb80943ef0912266ce59e01aff39fce92edec9de770603dc9513a05653120
5
5
  SHA512:
6
- metadata.gz: d968106a49787d65a66dbe30f23b20fb356798d7b677330cde25d1739cb2431a4897a61419bf45d5eb3651f9798e10a1faaea2fa9e66e4d1c584974002a50a1b
7
- data.tar.gz: 4db1dd5a86642ef34f712151fb8009a54329c2d380abf0e98e72f4db314425711a9837d12f19dfd4bec2351fb8d2b8268431f7cebeacc40993134a3c256b6014
6
+ metadata.gz: 8c2bd25d2cc9d4105589afbc40048dbeb162c06ee7c78fa803a0df1f5df815e88d778a5095cfb47de86e3953fc9944df729a2b0db8d9850deed3af8f48c0850f
7
+ data.tar.gz: 110e355781bb49bc260c98d10033c4e477c660fbc325dde768cee18555f20f24ada98cf42c215e854d173f38507efedf25b85a7863c34687966cf1734e23e07e
@@ -315,7 +315,7 @@ bool Msgval_IsEqual(upb_msgval val1, upb_msgval val2, TypeInfo type_info) {
315
315
  return memcmp(&val1, &val2, 8) == 0;
316
316
  case UPB_TYPE_STRING:
317
317
  case UPB_TYPE_BYTES:
318
- return val1.str_val.size != val2.str_val.size ||
318
+ return val1.str_val.size == val2.str_val.size &&
319
319
  memcmp(val1.str_val.data, val2.str_val.data,
320
320
  val1.str_val.size) == 0;
321
321
  case UPB_TYPE_MESSAGE:
@@ -868,6 +868,20 @@ static VALUE FieldDescriptor_default(VALUE _self) {
868
868
  return Convert_UpbToRuby(default_val, TypeInfo_get(self->fielddef), Qnil);
869
869
  }
870
870
 
871
+
872
+ /*
873
+ * call-seq:
874
+ * FieldDescriptor.json_name => json_name
875
+ *
876
+ * Returns this field's json_name, as a Ruby string, or nil if not yet set.
877
+ */
878
+ static VALUE FieldDescriptor_json_name(VALUE _self) {
879
+ FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
880
+ const upb_fielddef *f = self->fielddef;
881
+ const char *json_name = upb_fielddef_jsonname(f);
882
+ return rb_str_new2(json_name);
883
+ }
884
+
871
885
  /*
872
886
  * call-seq:
873
887
  * FieldDescriptor.label => label
@@ -1043,6 +1057,7 @@ static void FieldDescriptor_register(VALUE module) {
1043
1057
  rb_define_method(klass, "name", FieldDescriptor_name, 0);
1044
1058
  rb_define_method(klass, "type", FieldDescriptor__type, 0);
1045
1059
  rb_define_method(klass, "default", FieldDescriptor_default, 0);
1060
+ rb_define_method(klass, "json_name", FieldDescriptor_json_name, 0);
1046
1061
  rb_define_method(klass, "label", FieldDescriptor_label, 0);
1047
1062
  rb_define_method(klass, "number", FieldDescriptor_number, 0);
1048
1063
  rb_define_method(klass, "submsg_name", FieldDescriptor_submsg_name, 0);
@@ -1750,6 +1765,16 @@ static void msgdef_add_field(VALUE msgbuilder_rb, upb_label_t label, VALUE name,
1750
1765
  field_proto,
1751
1766
  FileBuilderContext_strdup(self->file_builder, default_value));
1752
1767
  }
1768
+
1769
+ if (rb_funcall(options, rb_intern("key?"), 1,
1770
+ ID2SYM(rb_intern("json_name"))) == Qtrue) {
1771
+ VALUE json_name =
1772
+ rb_hash_lookup(options, ID2SYM(rb_intern("json_name")));
1773
+
1774
+ google_protobuf_FieldDescriptorProto_set_json_name(
1775
+ field_proto,
1776
+ FileBuilderContext_strdup(self->file_builder, json_name));
1777
+ }
1753
1778
  }
1754
1779
 
1755
1780
  if (oneof_index >= 0) {
@@ -1899,18 +1924,20 @@ static VALUE MessageBuilderContext_required(int argc, VALUE* argv,
1899
1924
  */
1900
1925
  static VALUE MessageBuilderContext_repeated(int argc, VALUE* argv,
1901
1926
  VALUE _self) {
1902
- VALUE name, type, number, type_class;
1927
+ VALUE name, type, number;
1928
+ VALUE type_class, options = Qnil;
1903
1929
 
1904
- if (argc < 3) {
1905
- rb_raise(rb_eArgError, "Expected at least 3 arguments.");
1930
+ rb_scan_args(argc, argv, "32", &name, &type, &number, &type_class, &options);
1931
+
1932
+ // Allow passing (name, type, number, options) or
1933
+ // (name, type, number, type_class, options)
1934
+ if (argc == 4 && RB_TYPE_P(type_class, T_HASH)) {
1935
+ options = type_class;
1936
+ type_class = Qnil;
1906
1937
  }
1907
- name = argv[0];
1908
- type = argv[1];
1909
- number = argv[2];
1910
- type_class = (argc > 3) ? argv[3] : Qnil;
1911
1938
 
1912
1939
  msgdef_add_field(_self, UPB_LABEL_REPEATED, name, type, number, type_class,
1913
- Qnil, -1, false);
1940
+ options, -1, false);
1914
1941
 
1915
1942
  return Qnil;
1916
1943
  }
@@ -697,16 +697,13 @@ bool Message_Equal(const upb_msg *m1, const upb_msg *m2, const upb_msgdef *m) {
697
697
  * field is of a primitive type).
698
698
  */
699
699
  static VALUE Message_eq(VALUE _self, VALUE _other) {
700
- if (TYPE(_self) != TYPE(_other)) {
701
- return Qfalse;
702
- }
700
+ if (CLASS_OF(_self) != CLASS_OF(_other)) return Qfalse;
703
701
 
704
702
  Message* self = ruby_to_Message(_self);
705
703
  Message* other = ruby_to_Message(_other);
704
+ assert(self->msgdef == other->msgdef);
706
705
 
707
- return Message_Equal(self->msg, other->msg, self->msgdef)
708
- ? Qtrue
709
- : Qfalse;
706
+ return Message_Equal(self->msg, other->msg, self->msgdef) ? Qtrue : Qfalse;
710
707
  }
711
708
 
712
709
  uint64_t Message_Hash(const upb_msg* msg, const upb_msgdef* m, uint64_t seed) {
@@ -37,7 +37,7 @@
37
37
  #include "message.h"
38
38
  #include "repeated_field.h"
39
39
 
40
- VALUE cError;
40
+ VALUE cParseError;
41
41
  VALUE cTypeError;
42
42
 
43
43
  const upb_fielddef* map_field_key(const upb_fielddef* field) {
@@ -180,6 +180,7 @@ static void Arena_mark(void *data) {
180
180
  static void Arena_free(void *data) {
181
181
  Arena *arena = data;
182
182
  upb_arena_free(arena->arena);
183
+ xfree(arena);
183
184
  }
184
185
 
185
186
  static VALUE cArena;
@@ -251,14 +252,80 @@ void Arena_register(VALUE module) {
251
252
  // The object is used only for its identity; it does not contain any data.
252
253
  VALUE secondary_map = Qnil;
253
254
 
255
+ // Mutations to the map are under a mutex, because SeconaryMap_MaybeGC()
256
+ // iterates over the map which cannot happen in parallel with insertions, or
257
+ // Ruby will throw:
258
+ // can't add a new key into hash during iteration (RuntimeError)
259
+ VALUE secondary_map_mutex = Qnil;
260
+
261
+ // Lambda that will GC entries from the secondary map that are no longer present
262
+ // in the primary map.
263
+ VALUE gc_secondary_map_lambda = Qnil;
264
+ ID length;
265
+
266
+ extern VALUE weak_obj_cache;
267
+
254
268
  static void SecondaryMap_Init() {
255
269
  rb_gc_register_address(&secondary_map);
270
+ rb_gc_register_address(&gc_secondary_map_lambda);
271
+ rb_gc_register_address(&secondary_map_mutex);
256
272
  secondary_map = rb_hash_new();
273
+ gc_secondary_map_lambda = rb_eval_string(
274
+ "->(secondary, weak) {\n"
275
+ " secondary.delete_if { |k, v| !weak.key?(v) }\n"
276
+ "}\n");
277
+ secondary_map_mutex = rb_mutex_new();
278
+ length = rb_intern("length");
257
279
  }
258
280
 
259
- static VALUE SecondaryMap_Get(VALUE key) {
281
+ // The secondary map is a regular Hash, and will never shrink on its own.
282
+ // The main object cache is a WeakMap that will automatically remove entries
283
+ // when the target object is no longer reachable, but unless we manually
284
+ // remove the corresponding entries from the secondary map, it will grow
285
+ // without bound.
286
+ //
287
+ // To avoid this unbounded growth we periodically remove entries from the
288
+ // secondary map that are no longer present in the WeakMap. The logic of
289
+ // how often to perform this GC is an artbirary tuning parameter that
290
+ // represents a straightforward CPU/memory tradeoff.
291
+ //
292
+ // Requires: secondary_map_mutex is held.
293
+ static void SecondaryMap_MaybeGC() {
294
+ PBRUBY_ASSERT(rb_mutex_locked_p(secondary_map_mutex) == Qtrue);
295
+ size_t weak_len = NUM2ULL(rb_funcall(weak_obj_cache, length, 0));
296
+ size_t secondary_len = RHASH_SIZE(secondary_map);
297
+ if (secondary_len < weak_len) {
298
+ // Logically this case should not be possible: a valid entry cannot exist in
299
+ // the weak table unless there is a corresponding entry in the secondary
300
+ // table. It should *always* be the case that secondary_len >= weak_len.
301
+ //
302
+ // However ObjectSpace::WeakMap#length (and therefore weak_len) is
303
+ // unreliable: it overreports its true length by including non-live objects.
304
+ // However these non-live objects are not yielded in iteration, so we may
305
+ // have previously deleted them from the secondary map in a previous
306
+ // invocation of SecondaryMap_MaybeGC().
307
+ //
308
+ // In this case, we can't measure any waste, so we just return.
309
+ return;
310
+ }
311
+ size_t waste = secondary_len - weak_len;
312
+ // GC if we could remove at least 2000 entries or 20% of the table size
313
+ // (whichever is greater). Since the cost of the GC pass is O(N), we
314
+ // want to make sure that we condition this on overall table size, to
315
+ // avoid O(N^2) CPU costs.
316
+ size_t threshold = PBRUBY_MAX(secondary_len * 0.2, 2000);
317
+ if (waste > threshold) {
318
+ rb_funcall(gc_secondary_map_lambda, rb_intern("call"), 2,
319
+ secondary_map, weak_obj_cache);
320
+ }
321
+ }
322
+
323
+ // Requires: secondary_map_mutex is held by this thread iff create == true.
324
+ static VALUE SecondaryMap_Get(VALUE key, bool create) {
325
+ PBRUBY_ASSERT(!create || rb_mutex_locked_p(secondary_map_mutex) == Qtrue);
260
326
  VALUE ret = rb_hash_lookup(secondary_map, key);
261
- if (ret == Qnil) {
327
+ if (ret == Qnil && create) {
328
+ SecondaryMap_MaybeGC();
262
329
  ret = rb_eval_string("Object.new");
263
330
  rb_hash_aset(secondary_map, key, ret);
264
331
  }
@@ -267,14 +334,15 @@ static VALUE SecondaryMap_Get(VALUE key) {
267
334
 
268
335
  #endif
269
336
 
270
- static VALUE ObjectCache_GetKey(const void* key) {
337
+ // Requires: secondary_map_mutex is held by this thread iff create == true.
338
+ static VALUE ObjectCache_GetKey(const void* key, bool create) {
271
339
  char buf[sizeof(key)];
272
340
  memcpy(&buf, &key, sizeof(key));
273
341
  intptr_t key_int = (intptr_t)key;
274
342
  PBRUBY_ASSERT((key_int & 3) == 0);
275
343
  VALUE ret = LL2NUM(key_int >> 2);
276
344
  #if USE_SECONDARY_MAP
277
- ret = SecondaryMap_Get(ret);
345
+ ret = SecondaryMap_Get(ret, create);
278
346
  #endif
279
347
  return ret;
280
348
  }
@@ -298,14 +366,20 @@ static void ObjectCache_Init() {
298
366
 
299
367
  void ObjectCache_Add(const void* key, VALUE val) {
300
368
  PBRUBY_ASSERT(ObjectCache_Get(key) == Qnil);
301
- VALUE key_rb = ObjectCache_GetKey(key);
369
+ #if USE_SECONDARY_MAP
370
+ rb_mutex_lock(secondary_map_mutex);
371
+ #endif
372
+ VALUE key_rb = ObjectCache_GetKey(key, true);
302
373
  rb_funcall(weak_obj_cache, item_set, 2, key_rb, val);
374
+ #if USE_SECONDARY_MAP
375
+ rb_mutex_unlock(secondary_map_mutex);
376
+ #endif
303
377
  PBRUBY_ASSERT(ObjectCache_Get(key) == val);
304
378
  }
305
379
 
306
380
  // Returns the cached object for this key, if any. Otherwise returns Qnil.
307
381
  VALUE ObjectCache_Get(const void* key) {
308
- VALUE key_rb = ObjectCache_GetKey(key);
382
+ VALUE key_rb = ObjectCache_GetKey(key, false);
309
383
  return rb_funcall(weak_obj_cache, item_get, 1, key_rb);
310
384
  }
311
385
 
@@ -368,8 +442,10 @@ void Init_protobuf_c() {
368
442
  Map_register(protobuf);
369
443
  Message_register(protobuf);
370
444
 
371
- cError = rb_const_get(protobuf, rb_intern("Error"));
445
+ cParseError = rb_const_get(protobuf, rb_intern("ParseError"));
446
+ rb_gc_register_mark_object(cParseError);
372
447
  cTypeError = rb_const_get(protobuf, rb_intern("TypeError"));
448
+ rb_gc_register_mark_object(cTypeError);
373
449
 
374
450
  rb_define_singleton_method(protobuf, "discard_unknown",
375
451
  Google_Protobuf_discard_unknown, 1);
@@ -106,6 +106,8 @@ extern VALUE cTypeError;
106
106
  #define PBRUBY_ASSERT(expr) assert(expr)
107
107
  #endif
108
108
 
109
+ #define PBRUBY_MAX(x, y) (((x) > (y)) ? (x) : (y))
110
+
109
111
  #define UPB_UNUSED(var) (void)var
110
112
 
111
113
  #endif // __GOOGLE_PROTOBUF_RUBY_PROTOBUF_H__
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google-protobuf
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.15.5
4
+ version: 3.16.0.rc.2
5
5
  platform: universal-darwin
6
6
  authors:
7
7
  - Protobuf Authors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-04 00:00:00.000000000 Z
11
+ date: 2021-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler-dock
@@ -128,7 +128,7 @@ homepage: https://developers.google.com/protocol-buffers
128
128
  licenses:
129
129
  - BSD-3-Clause
130
130
  metadata:
131
- source_code_uri: https://github.com/protocolbuffers/protobuf/tree/v3.15.5/ruby
131
+ source_code_uri: https://github.com/protocolbuffers/protobuf/tree/v3.16.0-rc2/ruby
132
132
  post_install_message:
133
133
  rdoc_options: []
134
134
  require_paths:
@@ -143,11 +143,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
143
143
  version: 3.1.dev
144
144
  required_rubygems_version: !ruby/object:Gem::Requirement
145
145
  requirements:
146
- - - ">="
146
+ - - ">"
147
147
  - !ruby/object:Gem::Version
148
- version: '0'
148
+ version: 1.3.1
149
149
  requirements: []
150
- rubygems_version: 3.2.13
150
+ rubygems_version: 3.2.17
151
151
  signing_key:
152
152
  specification_version: 4
153
153
  summary: Protocol Buffers