google-protobuf 3.19.4 → 3.25.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/ext/google/protobuf_c/Rakefile +3 -0
  3. data/ext/google/protobuf_c/convert.c +121 -155
  4. data/ext/google/protobuf_c/convert.h +15 -37
  5. data/ext/google/protobuf_c/defs.c +223 -239
  6. data/ext/google/protobuf_c/defs.h +22 -47
  7. data/ext/google/protobuf_c/extconf.rb +13 -5
  8. data/ext/google/protobuf_c/glue.c +21 -0
  9. data/ext/google/protobuf_c/map.c +109 -137
  10. data/ext/google/protobuf_c/map.h +10 -36
  11. data/ext/google/protobuf_c/message.c +445 -386
  12. data/ext/google/protobuf_c/message.h +25 -47
  13. data/ext/google/protobuf_c/protobuf.c +101 -228
  14. data/ext/google/protobuf_c/protobuf.h +37 -42
  15. data/ext/google/protobuf_c/repeated_field.c +91 -113
  16. data/ext/google/protobuf_c/repeated_field.h +9 -34
  17. data/ext/google/protobuf_c/ruby-upb.c +12236 -6993
  18. data/ext/google/protobuf_c/ruby-upb.h +12127 -3787
  19. data/ext/google/protobuf_c/shared_convert.c +64 -0
  20. data/ext/google/protobuf_c/shared_convert.h +26 -0
  21. data/ext/google/protobuf_c/shared_message.c +65 -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/naive.c +92 -0
  25. data/ext/google/protobuf_c/third_party/utf8_range/range2-neon.c +157 -0
  26. data/ext/google/protobuf_c/third_party/utf8_range/range2-sse.c +170 -0
  27. data/ext/google/protobuf_c/third_party/utf8_range/utf8_range.h +21 -0
  28. data/ext/google/protobuf_c/wrap_memcpy.c +7 -29
  29. data/lib/google/protobuf/any_pb.rb +24 -5
  30. data/lib/google/protobuf/api_pb.rb +26 -23
  31. data/lib/google/protobuf/descriptor_dsl.rb +8 -1
  32. data/lib/google/protobuf/descriptor_pb.rb +43 -225
  33. data/lib/google/protobuf/duration_pb.rb +24 -5
  34. data/lib/google/protobuf/empty_pb.rb +24 -3
  35. data/lib/google/protobuf/ffi/descriptor.rb +154 -0
  36. data/lib/google/protobuf/ffi/descriptor_pool.rb +70 -0
  37. data/lib/google/protobuf/ffi/enum_descriptor.rb +161 -0
  38. data/lib/google/protobuf/ffi/ffi.rb +213 -0
  39. data/lib/google/protobuf/ffi/field_descriptor.rb +309 -0
  40. data/lib/google/protobuf/ffi/file_descriptor.rb +48 -0
  41. data/lib/google/protobuf/ffi/internal/arena.rb +66 -0
  42. data/lib/google/protobuf/ffi/internal/convert.rb +305 -0
  43. data/lib/google/protobuf/ffi/internal/pointer_helper.rb +35 -0
  44. data/lib/google/protobuf/ffi/internal/type_safety.rb +25 -0
  45. data/lib/google/protobuf/ffi/map.rb +396 -0
  46. data/lib/google/protobuf/ffi/message.rb +641 -0
  47. data/lib/google/protobuf/ffi/object_cache.rb +30 -0
  48. data/lib/google/protobuf/ffi/oneof_descriptor.rb +88 -0
  49. data/lib/google/protobuf/ffi/repeated_field.rb +503 -0
  50. data/lib/google/protobuf/field_mask_pb.rb +24 -4
  51. data/lib/google/protobuf/message_exts.rb +10 -28
  52. data/lib/google/protobuf/object_cache.rb +97 -0
  53. data/lib/google/protobuf/plugin_pb.rb +47 -0
  54. data/lib/google/protobuf/repeated_field.rb +18 -28
  55. data/lib/google/protobuf/source_context_pb.rb +24 -4
  56. data/lib/google/protobuf/struct_pb.rb +24 -20
  57. data/lib/google/protobuf/timestamp_pb.rb +24 -5
  58. data/lib/google/protobuf/type_pb.rb +26 -68
  59. data/lib/google/protobuf/well_known_types.rb +16 -40
  60. data/lib/google/protobuf/wrappers_pb.rb +24 -28
  61. data/lib/google/protobuf.rb +32 -50
  62. data/lib/google/protobuf_ffi.rb +50 -0
  63. data/lib/google/protobuf_native.rb +20 -0
  64. data/lib/google/tasks/ffi.rake +102 -0
  65. metadata +82 -14
  66. data/tests/basic.rb +0 -648
  67. data/tests/generated_code_test.rb +0 -23
  68. data/tests/stress.rb +0 -38
@@ -1,38 +1,13 @@
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
- // Redistribution and use in source and binary forms, with or without
6
- // modification, are permitted provided that the following conditions are
7
- // met:
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_
33
10
 
34
- #include <ruby/ruby.h>
35
-
36
11
  #include "protobuf.h"
37
12
  #include "ruby-upb.h"
38
13
 
@@ -40,9 +15,9 @@
40
15
  // TypeInfo
41
16
  // -----------------------------------------------------------------------------
42
17
 
43
- // This bundles a upb_fieldtype_t and msgdef/enumdef when appropriate. This is
18
+ // This bundles a upb_CType and msgdef/enumdef when appropriate. This is
44
19
  // convenient for functions that need type information but cannot necessarily
45
- // assume a upb_fielddef will be available.
20
+ // assume a upb_FieldDef will be available.
46
21
  //
47
22
  // For example, Google::Protobuf::Map and Google::Protobuf::RepeatedField can
48
23
  // be constructed with type information alone:
@@ -51,21 +26,21 @@
51
26
  // Google::Protobuf::RepeatedField.new(:message, FooMessage)
52
27
 
53
28
  typedef struct {
54
- upb_fieldtype_t type;
29
+ upb_CType type;
55
30
  union {
56
- const upb_msgdef* msgdef; // When type == UPB_TYPE_MESSAGE
57
- const upb_enumdef* enumdef; // When type == UPB_TYPE_ENUM
31
+ const upb_MessageDef* msgdef; // When type == kUpb_CType_Message
32
+ const upb_EnumDef* enumdef; // When type == kUpb_CType_Enum
58
33
  } def;
59
34
  } TypeInfo;
60
35
 
61
- static inline TypeInfo TypeInfo_get(const upb_fielddef *f) {
62
- TypeInfo ret = {upb_fielddef_type(f), {NULL}};
36
+ static inline TypeInfo TypeInfo_get(const upb_FieldDef* f) {
37
+ TypeInfo ret = {upb_FieldDef_CType(f), {NULL}};
63
38
  switch (ret.type) {
64
- case UPB_TYPE_MESSAGE:
65
- ret.def.msgdef = upb_fielddef_msgsubdef(f);
39
+ case kUpb_CType_Message:
40
+ ret.def.msgdef = upb_FieldDef_MessageSubDef(f);
66
41
  break;
67
- case UPB_TYPE_ENUM:
68
- ret.def.enumdef = upb_fielddef_enumsubdef(f);
42
+ case kUpb_CType_Enum:
43
+ ret.def.enumdef = upb_FieldDef_EnumSubDef(f);
69
44
  break;
70
45
  default:
71
46
  break;
@@ -76,9 +51,9 @@ static inline TypeInfo TypeInfo_get(const upb_fielddef *f) {
76
51
  TypeInfo TypeInfo_FromClass(int argc, VALUE* argv, int skip_arg,
77
52
  VALUE* type_class, VALUE* init_arg);
78
53
 
79
- static inline TypeInfo TypeInfo_from_type(upb_fieldtype_t type) {
54
+ static inline TypeInfo TypeInfo_from_type(upb_CType type) {
80
55
  TypeInfo ret = {type};
81
- assert(type != UPB_TYPE_MESSAGE && type != UPB_TYPE_ENUM);
56
+ assert(type != kUpb_CType_Message && type != kUpb_CType_Enum);
82
57
  return ret;
83
58
  }
84
59
 
@@ -86,17 +61,17 @@ static inline TypeInfo TypeInfo_from_type(upb_fieldtype_t type) {
86
61
  // Other utilities
87
62
  // -----------------------------------------------------------------------------
88
63
 
89
- VALUE Descriptor_DefToClass(const upb_msgdef *m);
64
+ VALUE Descriptor_DefToClass(const upb_MessageDef* m);
90
65
 
91
66
  // Returns the underlying msgdef, enumdef, or symtab (respectively) for the
92
67
  // given Descriptor, EnumDescriptor, or DescriptorPool Ruby object.
93
- const upb_enumdef *EnumDescriptor_GetEnumDef(VALUE enum_desc_rb);
94
- const upb_symtab *DescriptorPool_GetSymtab(VALUE desc_pool_rb);
95
- const upb_msgdef *Descriptor_GetMsgDef(VALUE desc_rb);
68
+ const upb_EnumDef* EnumDescriptor_GetEnumDef(VALUE enum_desc_rb);
69
+ const upb_DefPool* DescriptorPool_GetSymtab(VALUE desc_pool_rb);
70
+ const upb_MessageDef* Descriptor_GetMsgDef(VALUE desc_rb);
96
71
 
97
72
  // Returns a upb field type for the given Ruby symbol
98
- // (eg. :float => UPB_TYPE_FLOAT).
99
- upb_fieldtype_t ruby_to_fieldtype(VALUE type);
73
+ // (eg. :float => kUpb_CType_Float).
74
+ upb_CType ruby_to_fieldtype(VALUE type);
100
75
 
101
76
  // The singleton generated pool (a DescriptorPool object).
102
77
  extern VALUE generated_pool;
@@ -2,19 +2,27 @@
2
2
 
3
3
  require 'mkmf'
4
4
 
5
- if RUBY_PLATFORM =~ /darwin/ || RUBY_PLATFORM =~ /linux/
5
+ ext_name = "google/protobuf_c"
6
+
7
+ dir_config(ext_name)
8
+
9
+ if RUBY_PLATFORM =~ /darwin/ || RUBY_PLATFORM =~ /linux/ || RUBY_PLATFORM =~ /freebsd/
6
10
  $CFLAGS += " -std=gnu99 -O3 -DNDEBUG -fvisibility=hidden -Wall -Wsign-compare -Wno-declaration-after-statement"
7
11
  else
8
12
  $CFLAGS += " -std=gnu99 -O3 -DNDEBUG"
9
13
  end
10
14
 
11
-
12
15
  if RUBY_PLATFORM =~ /linux/
13
16
  # Instruct the linker to point memcpy calls at our __wrap_memcpy wrapper.
14
17
  $LDFLAGS += " -Wl,-wrap,memcpy"
15
18
  end
16
19
 
17
- $objs = ["protobuf.o", "convert.o", "defs.o", "message.o",
18
- "repeated_field.o", "map.o", "ruby-upb.o", "wrap_memcpy.o"]
20
+ $VPATH << "$(srcdir)/third_party/utf8_range"
21
+ $INCFLAGS += " -I$(srcdir)/third_party/utf8_range"
22
+
23
+ $srcs = ["protobuf.c", "convert.c", "defs.c", "message.c",
24
+ "repeated_field.c", "map.c", "ruby-upb.c", "wrap_memcpy.c",
25
+ "naive.c", "range2-neon.c", "range2-sse.c", "shared_convert.c",
26
+ "shared_message.c"]
19
27
 
20
- create_makefile("google/protobuf_c")
28
+ create_makefile(ext_name)
@@ -0,0 +1,21 @@
1
+ // Protocol Buffers - Google's data interchange format
2
+ // Copyright 2023 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
+ // -----------------------------------------------------------------------------
9
+ // Exposing inlined UPB functions. Strictly free of dependencies on
10
+ // Ruby interpreter internals.
11
+
12
+ #include "ruby-upb.h"
13
+
14
+ upb_Arena* Arena_create() { return upb_Arena_Init(NULL, 0, &upb_alloc_global); }
15
+
16
+ google_protobuf_FileDescriptorProto* FileDescriptorProto_parse(
17
+ const char* serialized_file_proto, size_t length) {
18
+ upb_Arena* arena = Arena_create();
19
+ return google_protobuf_FileDescriptorProto_parse(serialized_file_proto,
20
+ length, arena);
21
+ }
@@ -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
- // Redistribution and use in source and binary forms, with or without
6
- // modification, are permitted provided that the following conditions are
7
- // met:
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 "convert.h"
32
9
  #include "defs.h"
@@ -34,7 +11,7 @@
34
11
  #include "protobuf.h"
35
12
 
36
13
  // -----------------------------------------------------------------------------
37
- // Basic map operations on top of upb_map.
14
+ // Basic map operations on top of upb_Map.
38
15
  //
39
16
  // Note that we roll our own `Map` container here because, as for
40
17
  // `RepeatedField`, we want a strongly-typed container. This is so that any user
@@ -48,8 +25,8 @@
48
25
  // -----------------------------------------------------------------------------
49
26
 
50
27
  typedef struct {
51
- const upb_map *map; // Can convert to mutable when non-frozen.
52
- upb_fieldtype_t key_type;
28
+ const upb_Map* map; // Can convert to mutable when non-frozen.
29
+ upb_CType key_type;
53
30
  TypeInfo value_type_info;
54
31
  VALUE value_type_class;
55
32
  VALUE arena;
@@ -62,9 +39,9 @@ static void Map_mark(void* _self) {
62
39
  }
63
40
 
64
41
  const rb_data_type_t Map_type = {
65
- "Google::Protobuf::Map",
66
- { Map_mark, RUBY_DEFAULT_FREE, NULL },
67
- .flags = RUBY_TYPED_FREE_IMMEDIATELY,
42
+ "Google::Protobuf::Map",
43
+ {Map_mark, RUBY_DEFAULT_FREE, NULL},
44
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY,
68
45
  };
69
46
 
70
47
  VALUE cMap;
@@ -84,8 +61,8 @@ static VALUE Map_alloc(VALUE klass) {
84
61
  return TypedData_Wrap_Struct(klass, &Map_type, self);
85
62
  }
86
63
 
87
- VALUE Map_GetRubyWrapper(upb_map* map, upb_fieldtype_t key_type,
88
- TypeInfo value_type, VALUE arena) {
64
+ VALUE Map_GetRubyWrapper(upb_Map* map, upb_CType key_type, TypeInfo value_type,
65
+ VALUE arena) {
89
66
  PBRUBY_ASSERT(map);
90
67
 
91
68
  VALUE val = ObjectCache_Get(map);
@@ -93,24 +70,24 @@ VALUE Map_GetRubyWrapper(upb_map* map, upb_fieldtype_t key_type,
93
70
  if (val == Qnil) {
94
71
  val = Map_alloc(cMap);
95
72
  Map* self;
96
- ObjectCache_Add(map, val);
97
73
  TypedData_Get_Struct(val, Map, &Map_type, self);
98
74
  self->map = map;
99
75
  self->arena = arena;
100
76
  self->key_type = key_type;
101
77
  self->value_type_info = value_type;
102
- if (self->value_type_info.type == UPB_TYPE_MESSAGE) {
103
- const upb_msgdef *val_m = self->value_type_info.def.msgdef;
78
+ if (self->value_type_info.type == kUpb_CType_Message) {
79
+ const upb_MessageDef* val_m = self->value_type_info.def.msgdef;
104
80
  self->value_type_class = Descriptor_DefToClass(val_m);
105
81
  }
82
+ return ObjectCache_TryAdd(map, val);
106
83
  }
107
84
 
108
85
  return val;
109
86
  }
110
87
 
111
- static VALUE Map_new_this_type(Map *from) {
88
+ static VALUE Map_new_this_type(Map* from) {
112
89
  VALUE arena_rb = Arena_new();
113
- upb_map* map = upb_map_new(Arena_get(arena_rb), from->key_type,
90
+ upb_Map* map = upb_Map_New(Arena_get(arena_rb), from->key_type,
114
91
  from->value_type_info.type);
115
92
  VALUE ret =
116
93
  Map_GetRubyWrapper(map, from->key_type, from->value_type_info, arena_rb);
@@ -125,22 +102,21 @@ static TypeInfo Map_keyinfo(Map* self) {
125
102
  return ret;
126
103
  }
127
104
 
128
- static upb_map *Map_GetMutable(VALUE _self) {
105
+ static upb_Map* Map_GetMutable(VALUE _self) {
129
106
  rb_check_frozen(_self);
130
- return (upb_map*)ruby_to_Map(_self)->map;
107
+ return (upb_Map*)ruby_to_Map(_self)->map;
131
108
  }
132
109
 
133
- VALUE Map_CreateHash(const upb_map* map, upb_fieldtype_t key_type,
110
+ VALUE Map_CreateHash(const upb_Map* map, upb_CType key_type,
134
111
  TypeInfo val_info) {
135
112
  VALUE hash = rb_hash_new();
136
- size_t iter = UPB_MAP_BEGIN;
137
113
  TypeInfo key_info = TypeInfo_from_type(key_type);
138
114
 
139
115
  if (!map) return hash;
140
116
 
141
- while (upb_mapiter_next(map, &iter)) {
142
- upb_msgval key = upb_mapiter_key(map, iter);
143
- upb_msgval val = upb_mapiter_value(map, iter);
117
+ size_t iter = kUpb_Map_Begin;
118
+ upb_MessageValue key, val;
119
+ while (upb_Map_Next(map, &key, &val, &iter)) {
144
120
  VALUE key_val = Convert_UpbToRuby(key, key_info, Qnil);
145
121
  VALUE val_val = Scalar_CreateHash(val, val_info);
146
122
  rb_hash_aset(hash, key_val, val_val);
@@ -152,25 +128,25 @@ VALUE Map_CreateHash(const upb_map* map, upb_fieldtype_t key_type,
152
128
  VALUE Map_deep_copy(VALUE obj) {
153
129
  Map* self = ruby_to_Map(obj);
154
130
  VALUE new_arena_rb = Arena_new();
155
- upb_arena *arena = Arena_get(new_arena_rb);
156
- upb_map* new_map =
157
- upb_map_new(arena, self->key_type, self->value_type_info.type);
158
- size_t iter = UPB_MAP_BEGIN;
159
- while (upb_mapiter_next(self->map, &iter)) {
160
- upb_msgval key = upb_mapiter_key(self->map, iter);
161
- upb_msgval val = upb_mapiter_value(self->map, iter);
162
- upb_msgval val_copy = Msgval_DeepCopy(val, self->value_type_info, arena);
163
- upb_map_set(new_map, key, val_copy, arena);
131
+ upb_Arena* arena = Arena_get(new_arena_rb);
132
+ upb_Map* new_map =
133
+ upb_Map_New(arena, self->key_type, self->value_type_info.type);
134
+ size_t iter = kUpb_Map_Begin;
135
+ upb_MessageValue key, val;
136
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
137
+ upb_MessageValue val_copy =
138
+ Msgval_DeepCopy(val, self->value_type_info, arena);
139
+ upb_Map_Set(new_map, key, val_copy, arena);
164
140
  }
165
141
 
166
142
  return Map_GetRubyWrapper(new_map, self->key_type, self->value_type_info,
167
143
  new_arena_rb);
168
144
  }
169
145
 
170
- const upb_map* Map_GetUpbMap(VALUE val, const upb_fielddef* field,
171
- upb_arena* arena) {
172
- const upb_fielddef* key_field = map_field_key(field);
173
- const upb_fielddef* value_field = map_field_value(field);
146
+ const upb_Map* Map_GetUpbMap(VALUE val, const upb_FieldDef* field,
147
+ upb_Arena* arena) {
148
+ const upb_FieldDef* key_field = map_field_key(field);
149
+ const upb_FieldDef* value_field = map_field_value(field);
174
150
  TypeInfo value_type_info = TypeInfo_get(value_field);
175
151
  Map* self;
176
152
 
@@ -180,7 +156,7 @@ const upb_map* Map_GetUpbMap(VALUE val, const upb_fielddef* field,
180
156
  }
181
157
 
182
158
  self = ruby_to_Map(val);
183
- if (self->key_type != upb_fielddef_type(key_field)) {
159
+ if (self->key_type != upb_FieldDef_CType(key_field)) {
184
160
  rb_raise(cTypeError, "Map key type does not match field's key type");
185
161
  }
186
162
  if (self->value_type_info.type != value_type_info.type) {
@@ -194,16 +170,15 @@ const upb_map* Map_GetUpbMap(VALUE val, const upb_fielddef* field,
194
170
  return self->map;
195
171
  }
196
172
 
197
- void Map_Inspect(StringBuilder* b, const upb_map* map, upb_fieldtype_t key_type,
173
+ void Map_Inspect(StringBuilder* b, const upb_Map* map, upb_CType key_type,
198
174
  TypeInfo val_type) {
199
175
  bool first = true;
200
176
  TypeInfo key_type_info = {key_type};
201
177
  StringBuilder_Printf(b, "{");
202
178
  if (map) {
203
- size_t iter = UPB_MAP_BEGIN;
204
- while (upb_mapiter_next(map, &iter)) {
205
- upb_msgval key = upb_mapiter_key(map, iter);
206
- upb_msgval val = upb_mapiter_value(map, iter);
179
+ size_t iter = kUpb_Map_Begin;
180
+ upb_MessageValue key, val;
181
+ while (upb_Map_Next(map, &key, &val, &iter)) {
207
182
  if (first) {
208
183
  first = false;
209
184
  } else {
@@ -219,10 +194,12 @@ void Map_Inspect(StringBuilder* b, const upb_map* map, upb_fieldtype_t key_type,
219
194
 
220
195
  static int merge_into_self_callback(VALUE key, VALUE val, VALUE _self) {
221
196
  Map* self = ruby_to_Map(_self);
222
- upb_arena *arena = Arena_get(self->arena);
223
- upb_msgval key_val = Convert_RubyToUpb(key, "", Map_keyinfo(self), arena);
224
- upb_msgval val_val = Convert_RubyToUpb(val, "", self->value_type_info, arena);
225
- upb_map_set(Map_GetMutable(_self), key_val, val_val, arena);
197
+ upb_Arena* arena = Arena_get(self->arena);
198
+ upb_MessageValue key_val =
199
+ Convert_RubyToUpb(key, "", Map_keyinfo(self), arena);
200
+ upb_MessageValue val_val =
201
+ Convert_RubyToUpb(val, "", self->value_type_info, arena);
202
+ upb_Map_Set(Map_GetMutable(_self), key_val, val_val, arena);
226
203
  return ST_CONTINUE;
227
204
  }
228
205
 
@@ -234,9 +211,8 @@ static VALUE Map_merge_into_self(VALUE _self, VALUE hashmap) {
234
211
  RTYPEDDATA_TYPE(hashmap) == &Map_type) {
235
212
  Map* self = ruby_to_Map(_self);
236
213
  Map* other = ruby_to_Map(hashmap);
237
- upb_arena *arena = Arena_get(self->arena);
238
- upb_msg *self_msg = Map_GetMutable(_self);
239
- size_t iter = UPB_MAP_BEGIN;
214
+ upb_Arena* arena = Arena_get(self->arena);
215
+ upb_Message* self_msg = Map_GetMutable(_self);
240
216
 
241
217
  Arena_fuse(other->arena, arena);
242
218
 
@@ -246,10 +222,10 @@ static VALUE Map_merge_into_self(VALUE _self, VALUE hashmap) {
246
222
  rb_raise(rb_eArgError, "Attempt to merge Map with mismatching types");
247
223
  }
248
224
 
249
- while (upb_mapiter_next(other->map, &iter)) {
250
- upb_msgval key = upb_mapiter_key(other->map, iter);
251
- upb_msgval val = upb_mapiter_value(other->map, iter);
252
- upb_map_set(self_msg, key, val, arena);
225
+ size_t iter = kUpb_Map_Begin;
226
+ upb_MessageValue key, val;
227
+ while (upb_Map_Next(other->map, &key, &val, &iter)) {
228
+ upb_Map_Set(self_msg, key, val, arena);
253
229
  }
254
230
  } else {
255
231
  rb_raise(rb_eArgError, "Unknown type merging into Map");
@@ -305,22 +281,24 @@ static VALUE Map_init(int argc, VALUE* argv, VALUE _self) {
305
281
 
306
282
  // Check that the key type is an allowed type.
307
283
  switch (self->key_type) {
308
- case UPB_TYPE_INT32:
309
- case UPB_TYPE_INT64:
310
- case UPB_TYPE_UINT32:
311
- case UPB_TYPE_UINT64:
312
- case UPB_TYPE_BOOL:
313
- case UPB_TYPE_STRING:
314
- case UPB_TYPE_BYTES:
284
+ case kUpb_CType_Int32:
285
+ case kUpb_CType_Int64:
286
+ case kUpb_CType_UInt32:
287
+ case kUpb_CType_UInt64:
288
+ case kUpb_CType_Bool:
289
+ case kUpb_CType_String:
290
+ case kUpb_CType_Bytes:
315
291
  // These are OK.
316
292
  break;
317
293
  default:
318
294
  rb_raise(rb_eArgError, "Invalid key type for map.");
319
295
  }
320
296
 
321
- self->map = upb_map_new(Arena_get(self->arena), self->key_type,
297
+ self->map = upb_Map_New(Arena_get(self->arena), self->key_type,
322
298
  self->value_type_info.type);
323
- ObjectCache_Add(self->map, _self);
299
+ VALUE stored = ObjectCache_TryAdd(self->map, _self);
300
+ (void)stored;
301
+ PBRUBY_ASSERT(stored == _self);
324
302
 
325
303
  if (init_arg != Qnil) {
326
304
  Map_merge_into_self(_self, init_arg);
@@ -339,11 +317,10 @@ static VALUE Map_init(int argc, VALUE* argv, VALUE _self) {
339
317
  */
340
318
  static VALUE Map_each(VALUE _self) {
341
319
  Map* self = ruby_to_Map(_self);
342
- size_t iter = UPB_MAP_BEGIN;
320
+ size_t iter = kUpb_Map_Begin;
321
+ upb_MessageValue key, val;
343
322
 
344
- while (upb_mapiter_next(self->map, &iter)) {
345
- upb_msgval key = upb_mapiter_key(self->map, iter);
346
- upb_msgval val = upb_mapiter_value(self->map, iter);
323
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
347
324
  VALUE key_val = Convert_UpbToRuby(key, Map_keyinfo(self), self->arena);
348
325
  VALUE val_val = Convert_UpbToRuby(val, self->value_type_info, self->arena);
349
326
  rb_yield_values(2, key_val, val_val);
@@ -360,11 +337,11 @@ static VALUE Map_each(VALUE _self) {
360
337
  */
361
338
  static VALUE Map_keys(VALUE _self) {
362
339
  Map* self = ruby_to_Map(_self);
363
- size_t iter = UPB_MAP_BEGIN;
340
+ size_t iter = kUpb_Map_Begin;
364
341
  VALUE ret = rb_ary_new();
342
+ upb_MessageValue key, val;
365
343
 
366
- while (upb_mapiter_next(self->map, &iter)) {
367
- upb_msgval key = upb_mapiter_key(self->map, iter);
344
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
368
345
  VALUE key_val = Convert_UpbToRuby(key, Map_keyinfo(self), self->arena);
369
346
  rb_ary_push(ret, key_val);
370
347
  }
@@ -380,11 +357,11 @@ static VALUE Map_keys(VALUE _self) {
380
357
  */
381
358
  static VALUE Map_values(VALUE _self) {
382
359
  Map* self = ruby_to_Map(_self);
383
- size_t iter = UPB_MAP_BEGIN;
360
+ size_t iter = kUpb_Map_Begin;
384
361
  VALUE ret = rb_ary_new();
362
+ upb_MessageValue key, val;
385
363
 
386
- while (upb_mapiter_next(self->map, &iter)) {
387
- upb_msgval val = upb_mapiter_value(self->map, iter);
364
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
388
365
  VALUE val_val = Convert_UpbToRuby(val, self->value_type_info, self->arena);
389
366
  rb_ary_push(ret, val_val);
390
367
  }
@@ -401,10 +378,11 @@ static VALUE Map_values(VALUE _self) {
401
378
  */
402
379
  static VALUE Map_index(VALUE _self, VALUE key) {
403
380
  Map* self = ruby_to_Map(_self);
404
- upb_msgval key_upb = Convert_RubyToUpb(key, "", Map_keyinfo(self), NULL);
405
- upb_msgval val;
381
+ upb_MessageValue key_upb =
382
+ Convert_RubyToUpb(key, "", Map_keyinfo(self), NULL);
383
+ upb_MessageValue val;
406
384
 
407
- if (upb_map_get(self->map, key_upb, &val)) {
385
+ if (upb_Map_Get(self->map, key_upb, &val)) {
408
386
  return Convert_UpbToRuby(val, self->value_type_info, self->arena);
409
387
  } else {
410
388
  return Qnil;
@@ -421,11 +399,13 @@ static VALUE Map_index(VALUE _self, VALUE key) {
421
399
  */
422
400
  static VALUE Map_index_set(VALUE _self, VALUE key, VALUE val) {
423
401
  Map* self = ruby_to_Map(_self);
424
- upb_arena *arena = Arena_get(self->arena);
425
- upb_msgval key_upb = Convert_RubyToUpb(key, "", Map_keyinfo(self), NULL);
426
- upb_msgval val_upb = Convert_RubyToUpb(val, "", self->value_type_info, arena);
402
+ upb_Arena* arena = Arena_get(self->arena);
403
+ upb_MessageValue key_upb =
404
+ Convert_RubyToUpb(key, "", Map_keyinfo(self), NULL);
405
+ upb_MessageValue val_upb =
406
+ Convert_RubyToUpb(val, "", self->value_type_info, arena);
427
407
 
428
- upb_map_set(Map_GetMutable(_self), key_upb, val_upb, arena);
408
+ upb_Map_Set(Map_GetMutable(_self), key_upb, val_upb, arena);
429
409
 
430
410
  return val;
431
411
  }
@@ -439,9 +419,10 @@ static VALUE Map_index_set(VALUE _self, VALUE key, VALUE val) {
439
419
  */
440
420
  static VALUE Map_has_key(VALUE _self, VALUE key) {
441
421
  Map* self = ruby_to_Map(_self);
442
- upb_msgval key_upb = Convert_RubyToUpb(key, "", Map_keyinfo(self), NULL);
422
+ upb_MessageValue key_upb =
423
+ Convert_RubyToUpb(key, "", Map_keyinfo(self), NULL);
443
424
 
444
- if (upb_map_get(self->map, key_upb, NULL)) {
425
+ if (upb_Map_Get(self->map, key_upb, NULL)) {
445
426
  return Qtrue;
446
427
  } else {
447
428
  return Qfalse;
@@ -457,23 +438,17 @@ static VALUE Map_has_key(VALUE _self, VALUE key) {
457
438
  */
458
439
  static VALUE Map_delete(VALUE _self, VALUE key) {
459
440
  Map* self = ruby_to_Map(_self);
460
- upb_msgval key_upb = Convert_RubyToUpb(key, "", Map_keyinfo(self), NULL);
461
- upb_msgval val_upb;
462
- VALUE ret;
463
-
464
441
  rb_check_frozen(_self);
465
442
 
466
- // TODO(haberman): make upb_map_delete() also capable of returning the deleted
467
- // value.
468
- if (upb_map_get(self->map, key_upb, &val_upb)) {
469
- ret = Convert_UpbToRuby(val_upb, self->value_type_info, self->arena);
443
+ upb_MessageValue key_upb =
444
+ Convert_RubyToUpb(key, "", Map_keyinfo(self), NULL);
445
+ upb_MessageValue val_upb;
446
+
447
+ if (upb_Map_Delete(self->map, key_upb, &val_upb)) {
448
+ return Convert_UpbToRuby(val_upb, self->value_type_info, self->arena);
470
449
  } else {
471
- ret = Qnil;
450
+ return Qnil;
472
451
  }
473
-
474
- upb_map_delete(Map_GetMutable(_self), key_upb);
475
-
476
- return ret;
477
452
  }
478
453
 
479
454
  /*
@@ -483,7 +458,7 @@ static VALUE Map_delete(VALUE _self, VALUE key) {
483
458
  * Removes all entries from the map.
484
459
  */
485
460
  static VALUE Map_clear(VALUE _self) {
486
- upb_map_clear(Map_GetMutable(_self));
461
+ upb_Map_Clear(Map_GetMutable(_self));
487
462
  return Qnil;
488
463
  }
489
464
 
@@ -495,7 +470,7 @@ static VALUE Map_clear(VALUE _self) {
495
470
  */
496
471
  static VALUE Map_length(VALUE _self) {
497
472
  Map* self = ruby_to_Map(_self);
498
- return ULL2NUM(upb_map_size(self->map));
473
+ return ULL2NUM(upb_Map_Size(self->map));
499
474
  }
500
475
 
501
476
  /*
@@ -509,16 +484,15 @@ static VALUE Map_dup(VALUE _self) {
509
484
  Map* self = ruby_to_Map(_self);
510
485
  VALUE new_map_rb = Map_new_this_type(self);
511
486
  Map* new_self = ruby_to_Map(new_map_rb);
512
- size_t iter = UPB_MAP_BEGIN;
513
- upb_arena *arena = Arena_get(new_self->arena);
514
- upb_map *new_map = Map_GetMutable(new_map_rb);
487
+ size_t iter = kUpb_Map_Begin;
488
+ upb_Arena* arena = Arena_get(new_self->arena);
489
+ upb_Map* new_map = Map_GetMutable(new_map_rb);
515
490
 
516
491
  Arena_fuse(self->arena, arena);
517
492
 
518
- while (upb_mapiter_next(self->map, &iter)) {
519
- upb_msgval key = upb_mapiter_key(self->map, iter);
520
- upb_msgval val = upb_mapiter_value(self->map, iter);
521
- upb_map_set(new_map, key, val, arena);
493
+ upb_MessageValue key, val;
494
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
495
+ upb_Map_Set(new_map, key, val, arena);
522
496
  }
523
497
 
524
498
  return new_map_rb;
@@ -559,18 +533,17 @@ VALUE Map_eq(VALUE _self, VALUE _other) {
559
533
  self->value_type_class != other->value_type_class) {
560
534
  return Qfalse;
561
535
  }
562
- if (upb_map_size(self->map) != upb_map_size(other->map)) {
536
+ if (upb_Map_Size(self->map) != upb_Map_Size(other->map)) {
563
537
  return Qfalse;
564
538
  }
565
539
 
566
540
  // For each member of self, check that an equal member exists at the same key
567
541
  // in other.
568
- size_t iter = UPB_MAP_BEGIN;
569
- while (upb_mapiter_next(self->map, &iter)) {
570
- upb_msgval key = upb_mapiter_key(self->map, iter);
571
- upb_msgval val = upb_mapiter_value(self->map, iter);
572
- upb_msgval other_val;
573
- if (!upb_map_get(other->map, key, &other_val)) {
542
+ size_t iter = kUpb_Map_Begin;
543
+ upb_MessageValue key, val;
544
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
545
+ upb_MessageValue other_val;
546
+ if (!upb_Map_Get(other->map, key, &other_val)) {
574
547
  // Not present in other map.
575
548
  return Qfalse;
576
549
  }
@@ -609,11 +582,10 @@ VALUE Map_hash(VALUE _self) {
609
582
  Map* self = ruby_to_Map(_self);
610
583
  uint64_t hash = 0;
611
584
 
612
- size_t iter = UPB_MAP_BEGIN;
585
+ size_t iter = kUpb_Map_Begin;
613
586
  TypeInfo key_info = {self->key_type};
614
- while (upb_mapiter_next(self->map, &iter)) {
615
- upb_msgval key = upb_mapiter_key(self->map, iter);
616
- upb_msgval val = upb_mapiter_value(self->map, iter);
587
+ upb_MessageValue key, val;
588
+ while (upb_Map_Next(self->map, &key, &val, &iter)) {
617
589
  hash = Msgval_GetHash(key, key_info, hash);
618
590
  hash = Msgval_GetHash(val, self->value_type_info, hash);
619
591
  }