• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2023 Google LLC.  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 #ifndef UPB_MESSAGE_INTERNAL_ACCESSORS_H_
9 #define UPB_MESSAGE_INTERNAL_ACCESSORS_H_
10 
11 #include <stddef.h>
12 #include <stdint.h>
13 #include <string.h>
14 
15 #include "upb/base/descriptor_constants.h"
16 #include "upb/base/internal/endian.h"
17 #include "upb/base/string_view.h"
18 #include "upb/mem/arena.h"
19 #include "upb/message/internal/array.h"
20 #include "upb/message/internal/extension.h"
21 #include "upb/message/internal/map.h"
22 #include "upb/message/internal/message.h"
23 #include "upb/message/internal/tagged_ptr.h"
24 #include "upb/message/internal/types.h"
25 #include "upb/message/value.h"
26 #include "upb/mini_table/enum.h"
27 #include "upb/mini_table/extension.h"
28 #include "upb/mini_table/field.h"
29 #include "upb/mini_table/internal/field.h"
30 #include "upb/mini_table/message.h"
31 
32 // Must be last.
33 #include "upb/port/def.inc"
34 
35 #if defined(__GNUC__) && !defined(__clang__)
36 // GCC raises incorrect warnings in these functions.  It thinks that we are
37 // overrunning buffers, but we carefully write the functions in this file to
38 // guarantee that this is impossible.  GCC gets this wrong due it its failure
39 // to perform constant propagation as we expect:
40 //   - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108217
41 //   - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108226
42 //
43 // Unfortunately this also indicates that GCC is not optimizing away the
44 // switch() in cases where it should be, compromising the performance.
45 #pragma GCC diagnostic push
46 #pragma GCC diagnostic ignored "-Warray-bounds"
47 #pragma GCC diagnostic ignored "-Wstringop-overflow"
48 #if __GNUC__ >= 11
49 #pragma GCC diagnostic ignored "-Wstringop-overread"
50 #endif
51 #endif
52 
53 #ifdef __cplusplus
54 extern "C" {
55 #endif
56 
57 // LINT.IfChange(presence_logic)
58 
59 // Hasbit access ///////////////////////////////////////////////////////////////
60 
UPB_PRIVATE(_upb_Message_GetHasbit)61 UPB_INLINE bool UPB_PRIVATE(_upb_Message_GetHasbit)(
62     const struct upb_Message* msg, const upb_MiniTableField* f) {
63   const size_t offset = UPB_PRIVATE(_upb_MiniTableField_HasbitOffset)(f);
64   const char mask = UPB_PRIVATE(_upb_MiniTableField_HasbitMask)(f);
65 
66   return (*UPB_PTR_AT(msg, offset, const char) & mask) != 0;
67 }
68 
UPB_PRIVATE(_upb_Message_SetHasbit)69 UPB_INLINE void UPB_PRIVATE(_upb_Message_SetHasbit)(
70     const struct upb_Message* msg, const upb_MiniTableField* f) {
71   const size_t offset = UPB_PRIVATE(_upb_MiniTableField_HasbitOffset)(f);
72   const char mask = UPB_PRIVATE(_upb_MiniTableField_HasbitMask)(f);
73 
74   (*UPB_PTR_AT(msg, offset, char)) |= mask;
75 }
76 
UPB_PRIVATE(_upb_Message_ClearHasbit)77 UPB_INLINE void UPB_PRIVATE(_upb_Message_ClearHasbit)(
78     const struct upb_Message* msg, const upb_MiniTableField* f) {
79   const size_t offset = UPB_PRIVATE(_upb_MiniTableField_HasbitOffset)(f);
80   const char mask = UPB_PRIVATE(_upb_MiniTableField_HasbitMask)(f);
81 
82   (*UPB_PTR_AT(msg, offset, char)) &= ~mask;
83 }
84 
85 // Oneof case access ///////////////////////////////////////////////////////////
86 
UPB_PRIVATE(_upb_Message_OneofCasePtr)87 UPB_INLINE uint32_t* UPB_PRIVATE(_upb_Message_OneofCasePtr)(
88     struct upb_Message* msg, const upb_MiniTableField* f) {
89   return UPB_PTR_AT(msg, UPB_PRIVATE(_upb_MiniTableField_OneofOffset)(f),
90                     uint32_t);
91 }
92 
UPB_PRIVATE(_upb_Message_GetOneofCase)93 UPB_INLINE uint32_t UPB_PRIVATE(_upb_Message_GetOneofCase)(
94     const struct upb_Message* msg, const upb_MiniTableField* f) {
95   const uint32_t* ptr =
96       UPB_PRIVATE(_upb_Message_OneofCasePtr)((struct upb_Message*)msg, f);
97 
98   return *ptr;
99 }
100 
UPB_PRIVATE(_upb_Message_SetOneofCase)101 UPB_INLINE void UPB_PRIVATE(_upb_Message_SetOneofCase)(
102     struct upb_Message* msg, const upb_MiniTableField* f) {
103   uint32_t* ptr = UPB_PRIVATE(_upb_Message_OneofCasePtr)(msg, f);
104 
105   *ptr = upb_MiniTableField_Number(f);
106 }
107 
108 // Returns true if the given field is the current oneof case.
109 // Does nothing if it is not the current oneof case.
UPB_PRIVATE(_upb_Message_ClearOneofCase)110 UPB_INLINE bool UPB_PRIVATE(_upb_Message_ClearOneofCase)(
111     struct upb_Message* msg, const upb_MiniTableField* f) {
112   uint32_t* ptr = UPB_PRIVATE(_upb_Message_OneofCasePtr)(msg, f);
113 
114   if (*ptr != upb_MiniTableField_Number(f)) return false;
115   *ptr = 0;
116   return true;
117 }
118 
upb_Message_WhichOneofFieldNumber(const struct upb_Message * message,const upb_MiniTableField * oneof_field)119 UPB_API_INLINE uint32_t upb_Message_WhichOneofFieldNumber(
120     const struct upb_Message* message, const upb_MiniTableField* oneof_field) {
121   UPB_ASSUME(upb_MiniTableField_IsInOneof(oneof_field));
122   return UPB_PRIVATE(_upb_Message_GetOneofCase)(message, oneof_field);
123 }
124 
upb_Message_WhichOneof(const struct upb_Message * msg,const upb_MiniTable * m,const upb_MiniTableField * f)125 UPB_API_INLINE const upb_MiniTableField* upb_Message_WhichOneof(
126     const struct upb_Message* msg, const upb_MiniTable* m,
127     const upb_MiniTableField* f) {
128   uint32_t field_number = upb_Message_WhichOneofFieldNumber(msg, f);
129   if (field_number == 0) {
130     // No field in the oneof is set.
131     return NULL;
132   }
133   return upb_MiniTable_FindFieldByNumber(m, field_number);
134 }
135 
136 // LINT.ThenChange(GoogleInternalName2)
137 
138 // Returns false if the message is missing any of its required fields.
UPB_PRIVATE(_upb_Message_IsInitializedShallow)139 UPB_INLINE bool UPB_PRIVATE(_upb_Message_IsInitializedShallow)(
140     const struct upb_Message* msg, const upb_MiniTable* m) {
141   uint64_t bits;
142   memcpy(&bits, msg + 1, sizeof(bits));
143   bits = upb_BigEndian64(bits);
144   return (UPB_PRIVATE(_upb_MiniTable_RequiredMask)(m) & ~bits) == 0;
145 }
146 
UPB_PRIVATE(_upb_Message_MutableDataPtr)147 UPB_INLINE void* UPB_PRIVATE(_upb_Message_MutableDataPtr)(
148     struct upb_Message* msg, const upb_MiniTableField* f) {
149   return (char*)msg + f->UPB_ONLYBITS(offset);
150 }
151 
UPB_PRIVATE(_upb_Message_DataPtr)152 UPB_INLINE const void* UPB_PRIVATE(_upb_Message_DataPtr)(
153     const struct upb_Message* msg, const upb_MiniTableField* f) {
154   return (const char*)msg + f->UPB_ONLYBITS(offset);
155 }
156 
UPB_PRIVATE(_upb_Message_SetPresence)157 UPB_INLINE void UPB_PRIVATE(_upb_Message_SetPresence)(
158     struct upb_Message* msg, const upb_MiniTableField* f) {
159   if (UPB_PRIVATE(_upb_MiniTableField_HasHasbit)(f)) {
160     UPB_PRIVATE(_upb_Message_SetHasbit)(msg, f);
161   } else if (upb_MiniTableField_IsInOneof(f)) {
162     UPB_PRIVATE(_upb_Message_SetOneofCase)(msg, f);
163   }
164 }
165 
UPB_PRIVATE(_upb_MiniTableField_DataCopy)166 UPB_INLINE void UPB_PRIVATE(_upb_MiniTableField_DataCopy)(
167     const upb_MiniTableField* f, void* to, const void* from) {
168   switch (UPB_PRIVATE(_upb_MiniTableField_GetRep)(f)) {
169     case kUpb_FieldRep_1Byte:
170       memcpy(to, from, 1);
171       return;
172     case kUpb_FieldRep_4Byte:
173       memcpy(to, from, 4);
174       return;
175     case kUpb_FieldRep_8Byte:
176       memcpy(to, from, 8);
177       return;
178     case kUpb_FieldRep_StringView: {
179       memcpy(to, from, sizeof(upb_StringView));
180       return;
181     }
182   }
183   UPB_UNREACHABLE();
184 }
185 
UPB_PRIVATE(_upb_MiniTableField_DataEquals)186 UPB_INLINE bool UPB_PRIVATE(_upb_MiniTableField_DataEquals)(
187     const upb_MiniTableField* f, const void* a, const void* b) {
188   switch (UPB_PRIVATE(_upb_MiniTableField_GetRep)(f)) {
189     case kUpb_FieldRep_1Byte:
190       return memcmp(a, b, 1) == 0;
191     case kUpb_FieldRep_4Byte:
192       return memcmp(a, b, 4) == 0;
193     case kUpb_FieldRep_8Byte:
194       return memcmp(a, b, 8) == 0;
195     case kUpb_FieldRep_StringView: {
196       const upb_StringView sa = *(const upb_StringView*)a;
197       const upb_StringView sb = *(const upb_StringView*)b;
198       return upb_StringView_IsEqual(sa, sb);
199     }
200   }
201   UPB_UNREACHABLE();
202 }
203 
UPB_PRIVATE(_upb_MiniTableField_DataClear)204 UPB_INLINE void UPB_PRIVATE(_upb_MiniTableField_DataClear)(
205     const upb_MiniTableField* f, void* val) {
206   const char zero[16] = {0};
207   UPB_PRIVATE(_upb_MiniTableField_DataCopy)(f, val, zero);
208 }
209 
UPB_PRIVATE(_upb_MiniTableField_DataIsZero)210 UPB_INLINE bool UPB_PRIVATE(_upb_MiniTableField_DataIsZero)(
211     const upb_MiniTableField* f, const void* val) {
212   const char zero[16] = {0};
213   return UPB_PRIVATE(_upb_MiniTableField_DataEquals)(f, val, zero);
214 }
215 
216 // Here we define universal getter/setter functions for message fields.
217 // These look very branchy and inefficient, but as long as the MiniTableField
218 // values are known at compile time, all the branches are optimized away and
219 // we are left with ideal code.  This can happen either through through
220 // literals or UPB_ASSUME():
221 //
222 //   // Via struct literals.
223 //   bool FooMessage_set_bool_field(const upb_Message* msg, bool val) {
224 //     const upb_MiniTableField field = {1, 0, 0, /* etc... */};
225 //     // All value in "field" are compile-time known.
226 //     upb_Message_SetBaseField(msg, &field, &value);
227 //   }
228 //
229 //   // Via UPB_ASSUME().
230 //   UPB_INLINE bool upb_Message_SetBool(upb_Message* msg,
231 //                                       const upb_MiniTableField* field,
232 //                                       bool value, upb_Arena* a) {
233 //     UPB_ASSUME(field->UPB_PRIVATE(descriptortype) == kUpb_FieldType_Bool);
234 //     UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableField_GetRep)(field) ==
235 //                kUpb_FieldRep_1Byte);
236 //     upb_Message_SetField(msg, field, &value, a);
237 //   }
238 //
239 // As a result, we can use these universal getters/setters for *all* message
240 // accessors: generated code, MiniTable accessors, and reflection.  The only
241 // exception is the binary encoder/decoder, which need to be a bit more clever
242 // about how they read/write the message data, for efficiency.
243 //
244 // These functions work on both extensions and non-extensions. If the field
245 // of a setter is known to be a non-extension, the arena may be NULL and the
246 // returned bool value may be ignored since it will always succeed.
247 
upb_Message_HasBaseField(const struct upb_Message * msg,const upb_MiniTableField * field)248 UPB_API_INLINE bool upb_Message_HasBaseField(const struct upb_Message* msg,
249                                              const upb_MiniTableField* field) {
250   UPB_ASSERT(upb_MiniTableField_HasPresence(field));
251   UPB_ASSUME(!upb_MiniTableField_IsExtension(field));
252   if (upb_MiniTableField_IsInOneof(field)) {
253     return UPB_PRIVATE(_upb_Message_GetOneofCase)(msg, field) ==
254            upb_MiniTableField_Number(field);
255   } else {
256     return UPB_PRIVATE(_upb_Message_GetHasbit)(msg, field);
257   }
258 }
259 
upb_Message_HasExtension(const struct upb_Message * msg,const upb_MiniTableExtension * e)260 UPB_API_INLINE bool upb_Message_HasExtension(const struct upb_Message* msg,
261                                              const upb_MiniTableExtension* e) {
262   UPB_ASSERT(upb_MiniTableField_HasPresence(&e->UPB_PRIVATE(field)));
263   return UPB_PRIVATE(_upb_Message_Getext)(msg, e) != NULL;
264 }
265 
_upb_Message_GetNonExtensionField(const struct upb_Message * msg,const upb_MiniTableField * field,const void * default_val,void * val)266 UPB_FORCEINLINE void _upb_Message_GetNonExtensionField(
267     const struct upb_Message* msg, const upb_MiniTableField* field,
268     const void* default_val, void* val) {
269   UPB_ASSUME(!upb_MiniTableField_IsExtension(field));
270   if ((upb_MiniTableField_IsInOneof(field) ||
271        !UPB_PRIVATE(_upb_MiniTableField_DataIsZero)(field, default_val)) &&
272       !upb_Message_HasBaseField(msg, field)) {
273     UPB_PRIVATE(_upb_MiniTableField_DataCopy)(field, val, default_val);
274     return;
275   }
276   UPB_PRIVATE(_upb_MiniTableField_DataCopy)
277   (field, val, UPB_PRIVATE(_upb_Message_DataPtr)(msg, field));
278 }
279 
_upb_Message_GetExtensionField(const struct upb_Message * msg,const upb_MiniTableExtension * mt_ext,const void * default_val,void * val)280 UPB_INLINE void _upb_Message_GetExtensionField(
281     const struct upb_Message* msg, const upb_MiniTableExtension* mt_ext,
282     const void* default_val, void* val) {
283   const upb_Extension* ext = UPB_PRIVATE(_upb_Message_Getext)(msg, mt_ext);
284   const upb_MiniTableField* f = &mt_ext->UPB_PRIVATE(field);
285   UPB_ASSUME(upb_MiniTableField_IsExtension(f));
286 
287   if (ext) {
288     UPB_PRIVATE(_upb_MiniTableField_DataCopy)(f, val, &ext->data);
289   } else {
290     UPB_PRIVATE(_upb_MiniTableField_DataCopy)(f, val, default_val);
291   }
292 }
293 
294 // NOTE: The default_val is only used for fields that support presence.
295 // For repeated/map fields, the resulting upb_Array*/upb_Map* can be NULL if a
296 // upb_Array/upb_Map has not been allocated yet. Array/map fields do not have
297 // presence, so this is semantically identical to a pointer to an empty
298 // array/map, and must be treated the same for all semantic purposes.
upb_Message_GetField(const struct upb_Message * msg,const upb_MiniTableField * field,upb_MessageValue default_val)299 UPB_API_INLINE upb_MessageValue upb_Message_GetField(
300     const struct upb_Message* msg, const upb_MiniTableField* field,
301     upb_MessageValue default_val) {
302   upb_MessageValue ret;
303   if (upb_MiniTableField_IsExtension(field)) {
304     _upb_Message_GetExtensionField(msg, (upb_MiniTableExtension*)field,
305                                    &default_val, &ret);
306   } else {
307     _upb_Message_GetNonExtensionField(msg, field, &default_val, &ret);
308   }
309   return ret;
310 }
311 
upb_Message_SetBaseField(struct upb_Message * msg,const upb_MiniTableField * f,const void * val)312 UPB_API_INLINE void upb_Message_SetBaseField(struct upb_Message* msg,
313                                              const upb_MiniTableField* f,
314                                              const void* val) {
315   UPB_ASSERT(!upb_Message_IsFrozen(msg));
316   UPB_ASSUME(!upb_MiniTableField_IsExtension(f));
317   UPB_PRIVATE(_upb_Message_SetPresence)(msg, f);
318   UPB_PRIVATE(_upb_MiniTableField_DataCopy)
319   (f, UPB_PRIVATE(_upb_Message_MutableDataPtr)(msg, f), val);
320 }
321 
upb_Message_SetExtension(struct upb_Message * msg,const upb_MiniTableExtension * e,const void * val,upb_Arena * a)322 UPB_API_INLINE bool upb_Message_SetExtension(struct upb_Message* msg,
323                                              const upb_MiniTableExtension* e,
324                                              const void* val, upb_Arena* a) {
325   UPB_ASSERT(!upb_Message_IsFrozen(msg));
326   UPB_ASSERT(a);
327   upb_Extension* ext =
328       UPB_PRIVATE(_upb_Message_GetOrCreateExtension)(msg, e, a);
329   if (!ext) return false;
330   UPB_PRIVATE(_upb_MiniTableField_DataCopy)
331   (&e->UPB_PRIVATE(field), &ext->data, val);
332   return true;
333 }
334 
335 // Sets the value of the given field in the given msg. The return value is true
336 // if the operation completed successfully, or false if memory allocation
337 // failed.
UPB_PRIVATE(_upb_Message_SetField)338 UPB_INLINE bool UPB_PRIVATE(_upb_Message_SetField)(struct upb_Message* msg,
339                                                    const upb_MiniTableField* f,
340                                                    upb_MessageValue val,
341                                                    upb_Arena* a) {
342   if (upb_MiniTableField_IsExtension(f)) {
343     const upb_MiniTableExtension* ext = (const upb_MiniTableExtension*)f;
344     return upb_Message_SetExtension(msg, ext, &val, a);
345   } else {
346     upb_Message_SetBaseField(msg, f, &val);
347     return true;
348   }
349 }
350 
upb_Message_GetArray(const struct upb_Message * msg,const upb_MiniTableField * f)351 UPB_API_INLINE const upb_Array* upb_Message_GetArray(
352     const struct upb_Message* msg, const upb_MiniTableField* f) {
353   UPB_PRIVATE(_upb_MiniTableField_CheckIsArray)(f);
354   upb_Array* ret;
355   const upb_Array* default_val = NULL;
356   _upb_Message_GetNonExtensionField(msg, f, &default_val, &ret);
357   return ret;
358 }
359 
upb_Message_GetBool(const struct upb_Message * msg,const upb_MiniTableField * f,bool default_val)360 UPB_API_INLINE bool upb_Message_GetBool(const struct upb_Message* msg,
361                                         const upb_MiniTableField* f,
362                                         bool default_val) {
363   UPB_ASSUME(upb_MiniTableField_CType(f) == kUpb_CType_Bool);
364   UPB_ASSUME(upb_MiniTableField_IsScalar(f));
365   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableField_GetRep)(f) == kUpb_FieldRep_1Byte);
366   upb_MessageValue def;
367   def.bool_val = default_val;
368   return upb_Message_GetField(msg, f, def).bool_val;
369 }
370 
upb_Message_GetDouble(const struct upb_Message * msg,const upb_MiniTableField * f,double default_val)371 UPB_API_INLINE double upb_Message_GetDouble(const struct upb_Message* msg,
372                                             const upb_MiniTableField* f,
373                                             double default_val) {
374   UPB_ASSUME(upb_MiniTableField_CType(f) == kUpb_CType_Double);
375   UPB_ASSUME(upb_MiniTableField_IsScalar(f));
376   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableField_GetRep)(f) == kUpb_FieldRep_8Byte);
377 
378   upb_MessageValue def;
379   def.double_val = default_val;
380   return upb_Message_GetField(msg, f, def).double_val;
381 }
382 
upb_Message_GetFloat(const struct upb_Message * msg,const upb_MiniTableField * f,float default_val)383 UPB_API_INLINE float upb_Message_GetFloat(const struct upb_Message* msg,
384                                           const upb_MiniTableField* f,
385                                           float default_val) {
386   UPB_ASSUME(upb_MiniTableField_CType(f) == kUpb_CType_Float);
387   UPB_ASSUME(upb_MiniTableField_IsScalar(f));
388   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableField_GetRep)(f) == kUpb_FieldRep_4Byte);
389 
390   upb_MessageValue def;
391   def.float_val = default_val;
392   return upb_Message_GetField(msg, f, def).float_val;
393 }
394 
upb_Message_GetInt32(const struct upb_Message * msg,const upb_MiniTableField * f,int32_t default_val)395 UPB_API_INLINE int32_t upb_Message_GetInt32(const struct upb_Message* msg,
396                                             const upb_MiniTableField* f,
397                                             int32_t default_val) {
398   UPB_ASSUME(upb_MiniTableField_CType(f) == kUpb_CType_Int32 ||
399              upb_MiniTableField_CType(f) == kUpb_CType_Enum);
400   UPB_ASSUME(upb_MiniTableField_IsScalar(f));
401   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableField_GetRep)(f) == kUpb_FieldRep_4Byte);
402 
403   upb_MessageValue def;
404   def.int32_val = default_val;
405   return upb_Message_GetField(msg, f, def).int32_val;
406 }
407 
upb_Message_GetInt64(const struct upb_Message * msg,const upb_MiniTableField * f,int64_t default_val)408 UPB_API_INLINE int64_t upb_Message_GetInt64(const struct upb_Message* msg,
409                                             const upb_MiniTableField* f,
410                                             int64_t default_val) {
411   UPB_ASSUME(upb_MiniTableField_CType(f) == kUpb_CType_Int64);
412   UPB_ASSUME(upb_MiniTableField_IsScalar(f));
413   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableField_GetRep)(f) == kUpb_FieldRep_8Byte);
414 
415   upb_MessageValue def;
416   def.int64_val = default_val;
417   return upb_Message_GetField(msg, f, def).int64_val;
418 }
419 
UPB_PRIVATE(_upb_Message_AssertMapIsUntagged)420 UPB_INLINE void UPB_PRIVATE(_upb_Message_AssertMapIsUntagged)(
421     const struct upb_Message* msg, const upb_MiniTableField* field) {
422   UPB_UNUSED(msg);
423   UPB_PRIVATE(_upb_MiniTableField_CheckIsMap)(field);
424 #ifndef NDEBUG
425   uintptr_t default_val = 0;
426   uintptr_t tagged;
427   _upb_Message_GetNonExtensionField(msg, field, &default_val, &tagged);
428   UPB_ASSERT(!upb_TaggedMessagePtr_IsEmpty(tagged));
429 #endif
430 }
431 
upb_Message_GetMap(const struct upb_Message * msg,const upb_MiniTableField * f)432 UPB_API_INLINE const struct upb_Map* upb_Message_GetMap(
433     const struct upb_Message* msg, const upb_MiniTableField* f) {
434   UPB_PRIVATE(_upb_MiniTableField_CheckIsMap)(f);
435   UPB_PRIVATE(_upb_Message_AssertMapIsUntagged)(msg, f);
436   struct upb_Map* ret;
437   const struct upb_Map* default_val = NULL;
438   _upb_Message_GetNonExtensionField(msg, f, &default_val, &ret);
439   return ret;
440 }
441 
upb_Message_GetTaggedMessagePtr(const struct upb_Message * msg,const upb_MiniTableField * f,struct upb_Message * default_val)442 UPB_API_INLINE uintptr_t upb_Message_GetTaggedMessagePtr(
443     const struct upb_Message* msg, const upb_MiniTableField* f,
444     struct upb_Message* default_val) {
445   UPB_ASSUME(upb_MiniTableField_CType(f) == kUpb_CType_Message);
446   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableField_GetRep)(f) ==
447              UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte));
448   UPB_ASSUME(upb_MiniTableField_IsScalar(f));
449   uintptr_t tagged;
450   _upb_Message_GetNonExtensionField(msg, f, &default_val, &tagged);
451   return tagged;
452 }
453 
454 // For internal use only; users cannot set tagged messages because only the
455 // parser and the message copier are allowed to directly create an empty
456 // message.
UPB_PRIVATE(_upb_Message_SetTaggedMessagePtr)457 UPB_INLINE void UPB_PRIVATE(_upb_Message_SetTaggedMessagePtr)(
458     struct upb_Message* msg, const upb_MiniTableField* f,
459     uintptr_t sub_message) {
460   UPB_ASSUME(upb_MiniTableField_CType(f) == kUpb_CType_Message);
461   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableField_GetRep)(f) ==
462              UPB_SIZE(kUpb_FieldRep_4Byte, kUpb_FieldRep_8Byte));
463   UPB_ASSUME(upb_MiniTableField_IsScalar(f));
464   upb_Message_SetBaseField(msg, f, &sub_message);
465 }
466 
upb_Message_GetMessage(const struct upb_Message * msg,const upb_MiniTableField * f)467 UPB_API_INLINE const struct upb_Message* upb_Message_GetMessage(
468     const struct upb_Message* msg, const upb_MiniTableField* f) {
469   uintptr_t tagged = upb_Message_GetTaggedMessagePtr(msg, f, NULL);
470   return upb_TaggedMessagePtr_GetNonEmptyMessage(tagged);
471 }
472 
upb_Message_GetMutableArray(struct upb_Message * msg,const upb_MiniTableField * f)473 UPB_API_INLINE upb_Array* upb_Message_GetMutableArray(
474     struct upb_Message* msg, const upb_MiniTableField* f) {
475   UPB_PRIVATE(_upb_MiniTableField_CheckIsArray)(f);
476   return (upb_Array*)upb_Message_GetArray(msg, f);
477 }
478 
upb_Message_GetMutableMap(struct upb_Message * msg,const upb_MiniTableField * f)479 UPB_API_INLINE struct upb_Map* upb_Message_GetMutableMap(
480     struct upb_Message* msg, const upb_MiniTableField* f) {
481   return (struct upb_Map*)upb_Message_GetMap(msg, f);
482 }
483 
upb_Message_GetMutableMessage(struct upb_Message * msg,const upb_MiniTableField * f)484 UPB_API_INLINE struct upb_Message* upb_Message_GetMutableMessage(
485     struct upb_Message* msg, const upb_MiniTableField* f) {
486   return (struct upb_Message*)upb_Message_GetMessage(msg, f);
487 }
488 
upb_Message_GetOrCreateMutableArray(struct upb_Message * msg,const upb_MiniTableField * f,upb_Arena * arena)489 UPB_API_INLINE upb_Array* upb_Message_GetOrCreateMutableArray(
490     struct upb_Message* msg, const upb_MiniTableField* f, upb_Arena* arena) {
491   UPB_ASSERT(arena);
492   UPB_PRIVATE(_upb_MiniTableField_CheckIsArray)(f);
493   upb_Array* array = upb_Message_GetMutableArray(msg, f);
494   if (!array) {
495     array = UPB_PRIVATE(_upb_Array_New)(
496         arena, 4, UPB_PRIVATE(_upb_MiniTableField_ElemSizeLg2)(f));
497     // Check again due to: https://godbolt.org/z/7WfaoKG1r
498     UPB_PRIVATE(_upb_MiniTableField_CheckIsArray)(f);
499     upb_MessageValue val;
500     val.array_val = array;
501     UPB_PRIVATE(_upb_Message_SetField)(msg, f, val, arena);
502   }
503   return array;
504 }
505 
_upb_Message_GetOrCreateMutableMap(struct upb_Message * msg,const upb_MiniTableField * field,size_t key_size,size_t val_size,upb_Arena * arena)506 UPB_INLINE struct upb_Map* _upb_Message_GetOrCreateMutableMap(
507     struct upb_Message* msg, const upb_MiniTableField* field, size_t key_size,
508     size_t val_size, upb_Arena* arena) {
509   UPB_PRIVATE(_upb_MiniTableField_CheckIsMap)(field);
510   UPB_PRIVATE(_upb_Message_AssertMapIsUntagged)(msg, field);
511   struct upb_Map* map = NULL;
512   struct upb_Map* default_map_value = NULL;
513   _upb_Message_GetNonExtensionField(msg, field, &default_map_value, &map);
514   if (!map) {
515     map = _upb_Map_New(arena, key_size, val_size);
516     // Check again due to: https://godbolt.org/z/7WfaoKG1r
517     UPB_PRIVATE(_upb_MiniTableField_CheckIsMap)(field);
518     upb_Message_SetBaseField(msg, field, &map);
519   }
520   return map;
521 }
522 
upb_Message_GetOrCreateMutableMap(struct upb_Message * msg,const upb_MiniTable * map_entry_mini_table,const upb_MiniTableField * f,upb_Arena * arena)523 UPB_API_INLINE struct upb_Map* upb_Message_GetOrCreateMutableMap(
524     struct upb_Message* msg, const upb_MiniTable* map_entry_mini_table,
525     const upb_MiniTableField* f, upb_Arena* arena) {
526   UPB_ASSUME(upb_MiniTableField_CType(f) == kUpb_CType_Message);
527   const upb_MiniTableField* map_entry_key_field =
528       &map_entry_mini_table->UPB_ONLYBITS(fields)[0];
529   const upb_MiniTableField* map_entry_value_field =
530       &map_entry_mini_table->UPB_ONLYBITS(fields)[1];
531   return _upb_Message_GetOrCreateMutableMap(
532       msg, f, _upb_Map_CTypeSize(upb_MiniTableField_CType(map_entry_key_field)),
533       _upb_Map_CTypeSize(upb_MiniTableField_CType(map_entry_value_field)),
534       arena);
535 }
536 
upb_Message_GetOrCreateMutableMessage(struct upb_Message * msg,const upb_MiniTable * mini_table,const upb_MiniTableField * f,upb_Arena * arena)537 UPB_API_INLINE struct upb_Message* upb_Message_GetOrCreateMutableMessage(
538     struct upb_Message* msg, const upb_MiniTable* mini_table,
539     const upb_MiniTableField* f, upb_Arena* arena) {
540   UPB_ASSERT(arena);
541   UPB_ASSUME(upb_MiniTableField_CType(f) == kUpb_CType_Message);
542   UPB_ASSUME(!upb_MiniTableField_IsExtension(f));
543   struct upb_Message* sub_message =
544       *UPB_PTR_AT(msg, f->UPB_ONLYBITS(offset), struct upb_Message*);
545   if (!sub_message) {
546     const upb_MiniTable* sub_mini_table =
547         upb_MiniTable_SubMessage(mini_table, f);
548     UPB_ASSERT(sub_mini_table);
549     sub_message = _upb_Message_New(sub_mini_table, arena);
550     *UPB_PTR_AT(msg, f->UPB_ONLYBITS(offset), struct upb_Message*) =
551         sub_message;
552     UPB_PRIVATE(_upb_Message_SetPresence)(msg, f);
553   }
554   return sub_message;
555 }
556 
557 UPB_API_INLINE upb_StringView
upb_Message_GetString(const struct upb_Message * msg,const upb_MiniTableField * f,upb_StringView default_val)558 upb_Message_GetString(const struct upb_Message* msg,
559                       const upb_MiniTableField* f, upb_StringView default_val) {
560   UPB_ASSUME(upb_MiniTableField_CType(f) == kUpb_CType_String ||
561              upb_MiniTableField_CType(f) == kUpb_CType_Bytes);
562   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableField_GetRep)(f) ==
563              kUpb_FieldRep_StringView);
564 
565   upb_MessageValue def;
566   def.str_val = default_val;
567   return upb_Message_GetField(msg, f, def).str_val;
568 }
569 
upb_Message_GetUInt32(const struct upb_Message * msg,const upb_MiniTableField * f,uint32_t default_val)570 UPB_API_INLINE uint32_t upb_Message_GetUInt32(const struct upb_Message* msg,
571                                               const upb_MiniTableField* f,
572                                               uint32_t default_val) {
573   UPB_ASSUME(upb_MiniTableField_CType(f) == kUpb_CType_UInt32);
574   UPB_ASSUME(upb_MiniTableField_IsScalar(f));
575   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableField_GetRep)(f) == kUpb_FieldRep_4Byte);
576 
577   upb_MessageValue def;
578   def.uint32_val = default_val;
579   return upb_Message_GetField(msg, f, def).uint32_val;
580 }
581 
upb_Message_GetUInt64(const struct upb_Message * msg,const upb_MiniTableField * f,uint64_t default_val)582 UPB_API_INLINE uint64_t upb_Message_GetUInt64(const struct upb_Message* msg,
583                                               const upb_MiniTableField* f,
584                                               uint64_t default_val) {
585   UPB_ASSUME(upb_MiniTableField_CType(f) == kUpb_CType_UInt64);
586   UPB_ASSUME(upb_MiniTableField_IsScalar(f));
587   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableField_GetRep)(f) == kUpb_FieldRep_8Byte);
588 
589   upb_MessageValue def;
590   def.uint64_val = default_val;
591   return upb_Message_GetField(msg, f, def).uint64_val;
592 }
593 
594 // BaseField Setters ///////////////////////////////////////////////////////////
595 
upb_Message_SetBaseFieldBool(struct upb_Message * msg,const upb_MiniTableField * f,bool value)596 UPB_API_INLINE void upb_Message_SetBaseFieldBool(struct upb_Message* msg,
597                                                  const upb_MiniTableField* f,
598                                                  bool value) {
599   UPB_ASSUME(upb_MiniTableField_CType(f) == kUpb_CType_Bool);
600   UPB_ASSUME(upb_MiniTableField_IsScalar(f));
601   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableField_GetRep)(f) == kUpb_FieldRep_1Byte);
602   upb_Message_SetBaseField(msg, f, &value);
603 }
604 
upb_Message_SetBaseFieldDouble(struct upb_Message * msg,const upb_MiniTableField * f,double value)605 UPB_API_INLINE void upb_Message_SetBaseFieldDouble(struct upb_Message* msg,
606                                                    const upb_MiniTableField* f,
607                                                    double value) {
608   UPB_ASSUME(upb_MiniTableField_CType(f) == kUpb_CType_Double);
609   UPB_ASSUME(upb_MiniTableField_IsScalar(f));
610   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableField_GetRep)(f) == kUpb_FieldRep_8Byte);
611   upb_Message_SetBaseField(msg, f, &value);
612 }
613 
upb_Message_SetBaseFieldFloat(struct upb_Message * msg,const upb_MiniTableField * f,float value)614 UPB_API_INLINE void upb_Message_SetBaseFieldFloat(struct upb_Message* msg,
615                                                   const upb_MiniTableField* f,
616                                                   float value) {
617   UPB_ASSUME(upb_MiniTableField_CType(f) == kUpb_CType_Float);
618   UPB_ASSUME(upb_MiniTableField_IsScalar(f));
619   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableField_GetRep)(f) == kUpb_FieldRep_4Byte);
620   upb_Message_SetBaseField(msg, f, &value);
621 }
622 
upb_Message_SetBaseFieldInt32(struct upb_Message * msg,const upb_MiniTableField * f,int32_t value)623 UPB_API_INLINE void upb_Message_SetBaseFieldInt32(struct upb_Message* msg,
624                                                   const upb_MiniTableField* f,
625                                                   int32_t value) {
626   UPB_ASSUME(upb_MiniTableField_CType(f) == kUpb_CType_Int32 ||
627              upb_MiniTableField_CType(f) == kUpb_CType_Enum);
628   UPB_ASSUME(upb_MiniTableField_IsScalar(f));
629   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableField_GetRep)(f) == kUpb_FieldRep_4Byte);
630   upb_Message_SetBaseField(msg, f, &value);
631 }
632 
upb_Message_SetBaseFieldInt64(struct upb_Message * msg,const upb_MiniTableField * f,int64_t value)633 UPB_API_INLINE void upb_Message_SetBaseFieldInt64(struct upb_Message* msg,
634                                                   const upb_MiniTableField* f,
635                                                   int64_t value) {
636   UPB_ASSUME(upb_MiniTableField_CType(f) == kUpb_CType_Int64);
637   UPB_ASSUME(upb_MiniTableField_IsScalar(f));
638   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableField_GetRep)(f) == kUpb_FieldRep_8Byte);
639   upb_Message_SetBaseField(msg, f, &value);
640 }
641 
upb_Message_SetBaseFieldMessage(struct upb_Message * msg,const upb_MiniTableField * f,struct upb_Message * value)642 UPB_API_INLINE void upb_Message_SetBaseFieldMessage(struct upb_Message* msg,
643                                                     const upb_MiniTableField* f,
644                                                     struct upb_Message* value) {
645   UPB_PRIVATE(_upb_Message_SetTaggedMessagePtr)
646   (msg, f, UPB_PRIVATE(_upb_TaggedMessagePtr_Pack)(value, false));
647 }
648 
upb_Message_SetBaseFieldString(struct upb_Message * msg,const upb_MiniTableField * f,upb_StringView value)649 UPB_API_INLINE void upb_Message_SetBaseFieldString(struct upb_Message* msg,
650                                                    const upb_MiniTableField* f,
651                                                    upb_StringView value) {
652   UPB_ASSUME(upb_MiniTableField_CType(f) == kUpb_CType_String ||
653              upb_MiniTableField_CType(f) == kUpb_CType_Bytes);
654   UPB_ASSUME(upb_MiniTableField_IsScalar(f));
655   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableField_GetRep)(f) ==
656              kUpb_FieldRep_StringView);
657   upb_Message_SetBaseField(msg, f, &value);
658 }
659 
upb_Message_SetBaseFieldUInt32(struct upb_Message * msg,const upb_MiniTableField * f,uint32_t value)660 UPB_API_INLINE void upb_Message_SetBaseFieldUInt32(struct upb_Message* msg,
661                                                    const upb_MiniTableField* f,
662                                                    uint32_t value) {
663   UPB_ASSUME(upb_MiniTableField_CType(f) == kUpb_CType_UInt32);
664   UPB_ASSUME(upb_MiniTableField_IsScalar(f));
665   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableField_GetRep)(f) == kUpb_FieldRep_4Byte);
666   upb_Message_SetBaseField(msg, f, &value);
667 }
668 
upb_Message_SetBaseFieldUInt64(struct upb_Message * msg,const upb_MiniTableField * f,uint64_t value)669 UPB_API_INLINE void upb_Message_SetBaseFieldUInt64(struct upb_Message* msg,
670                                                    const upb_MiniTableField* f,
671                                                    uint64_t value) {
672   UPB_ASSUME(upb_MiniTableField_CType(f) == kUpb_CType_UInt64);
673   UPB_ASSUME(upb_MiniTableField_IsScalar(f));
674   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableField_GetRep)(f) == kUpb_FieldRep_8Byte);
675   upb_Message_SetBaseField(msg, f, &value);
676 }
677 
upb_Message_SetClosedEnum(struct upb_Message * msg,const upb_MiniTable * m,const upb_MiniTableField * f,int32_t value)678 UPB_API_INLINE void upb_Message_SetClosedEnum(struct upb_Message* msg,
679                                               const upb_MiniTable* m,
680                                               const upb_MiniTableField* f,
681                                               int32_t value) {
682   UPB_ASSERT(upb_MiniTableField_IsClosedEnum(f));
683   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableField_GetRep)(f) == kUpb_FieldRep_4Byte);
684   UPB_ASSERT(
685       upb_MiniTableEnum_CheckValue(upb_MiniTable_GetSubEnumTable(m, f), value));
686   upb_Message_SetBaseField(msg, f, &value);
687 }
688 
689 // Extension Setters ///////////////////////////////////////////////////////////
690 
upb_Message_SetExtensionBool(struct upb_Message * msg,const upb_MiniTableExtension * e,bool value,upb_Arena * a)691 UPB_API_INLINE bool upb_Message_SetExtensionBool(
692     struct upb_Message* msg, const upb_MiniTableExtension* e, bool value,
693     upb_Arena* a) {
694   UPB_ASSUME(upb_MiniTableExtension_CType(e) == kUpb_CType_Bool);
695   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableExtension_GetRep)(e) ==
696              kUpb_FieldRep_1Byte);
697   return upb_Message_SetExtension(msg, e, &value, a);
698 }
699 
upb_Message_SetExtensionDouble(struct upb_Message * msg,const upb_MiniTableExtension * e,double value,upb_Arena * a)700 UPB_API_INLINE bool upb_Message_SetExtensionDouble(
701     struct upb_Message* msg, const upb_MiniTableExtension* e, double value,
702     upb_Arena* a) {
703   UPB_ASSUME(upb_MiniTableExtension_CType(e) == kUpb_CType_Double);
704   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableExtension_GetRep)(e) ==
705              kUpb_FieldRep_8Byte);
706   return upb_Message_SetExtension(msg, e, &value, a);
707 }
708 
upb_Message_SetExtensionFloat(struct upb_Message * msg,const upb_MiniTableExtension * e,float value,upb_Arena * a)709 UPB_API_INLINE bool upb_Message_SetExtensionFloat(
710     struct upb_Message* msg, const upb_MiniTableExtension* e, float value,
711     upb_Arena* a) {
712   UPB_ASSUME(upb_MiniTableExtension_CType(e) == kUpb_CType_Float);
713   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableExtension_GetRep)(e) ==
714              kUpb_FieldRep_4Byte);
715   return upb_Message_SetExtension(msg, e, &value, a);
716 }
717 
upb_Message_SetExtensionInt32(struct upb_Message * msg,const upb_MiniTableExtension * e,int32_t value,upb_Arena * a)718 UPB_API_INLINE bool upb_Message_SetExtensionInt32(
719     struct upb_Message* msg, const upb_MiniTableExtension* e, int32_t value,
720     upb_Arena* a) {
721   UPB_ASSUME(upb_MiniTableExtension_CType(e) == kUpb_CType_Int32 ||
722              upb_MiniTableExtension_CType(e) == kUpb_CType_Enum);
723   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableExtension_GetRep)(e) ==
724              kUpb_FieldRep_4Byte);
725   return upb_Message_SetExtension(msg, e, &value, a);
726 }
727 
upb_Message_SetExtensionInt64(struct upb_Message * msg,const upb_MiniTableExtension * e,int64_t value,upb_Arena * a)728 UPB_API_INLINE bool upb_Message_SetExtensionInt64(
729     struct upb_Message* msg, const upb_MiniTableExtension* e, int64_t value,
730     upb_Arena* a) {
731   UPB_ASSUME(upb_MiniTableExtension_CType(e) == kUpb_CType_Int64);
732   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableExtension_GetRep)(e) ==
733              kUpb_FieldRep_8Byte);
734   return upb_Message_SetExtension(msg, e, &value, a);
735 }
736 
upb_Message_SetExtensionString(struct upb_Message * msg,const upb_MiniTableExtension * e,upb_StringView value,upb_Arena * a)737 UPB_API_INLINE bool upb_Message_SetExtensionString(
738     struct upb_Message* msg, const upb_MiniTableExtension* e,
739     upb_StringView value, upb_Arena* a) {
740   UPB_ASSUME(upb_MiniTableExtension_CType(e) == kUpb_CType_String ||
741              upb_MiniTableExtension_CType(e) == kUpb_CType_Bytes);
742   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableExtension_GetRep)(e) ==
743              kUpb_FieldRep_StringView);
744   return upb_Message_SetExtension(msg, e, &value, a);
745 }
746 
upb_Message_SetExtensionUInt32(struct upb_Message * msg,const upb_MiniTableExtension * e,uint32_t value,upb_Arena * a)747 UPB_API_INLINE bool upb_Message_SetExtensionUInt32(
748     struct upb_Message* msg, const upb_MiniTableExtension* e, uint32_t value,
749     upb_Arena* a) {
750   UPB_ASSUME(upb_MiniTableExtension_CType(e) == kUpb_CType_UInt32);
751   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableExtension_GetRep)(e) ==
752              kUpb_FieldRep_4Byte);
753   return upb_Message_SetExtension(msg, e, &value, a);
754 }
755 
upb_Message_SetExtensionUInt64(struct upb_Message * msg,const upb_MiniTableExtension * e,uint64_t value,upb_Arena * a)756 UPB_API_INLINE bool upb_Message_SetExtensionUInt64(
757     struct upb_Message* msg, const upb_MiniTableExtension* e, uint64_t value,
758     upb_Arena* a) {
759   UPB_ASSUME(upb_MiniTableExtension_CType(e) == kUpb_CType_UInt64);
760   UPB_ASSUME(UPB_PRIVATE(_upb_MiniTableExtension_GetRep)(e) ==
761              kUpb_FieldRep_8Byte);
762   return upb_Message_SetExtension(msg, e, &value, a);
763 }
764 
765 // Universal Setters ///////////////////////////////////////////////////////////
766 
upb_Message_SetBool(struct upb_Message * msg,const upb_MiniTableField * f,bool value,upb_Arena * a)767 UPB_API_INLINE bool upb_Message_SetBool(struct upb_Message* msg,
768                                         const upb_MiniTableField* f, bool value,
769                                         upb_Arena* a) {
770   return upb_MiniTableField_IsExtension(f)
771              ? upb_Message_SetExtensionBool(
772                    msg, (const upb_MiniTableExtension*)f, value, a)
773              : (upb_Message_SetBaseFieldBool(msg, f, value), true);
774 }
775 
upb_Message_SetDouble(struct upb_Message * msg,const upb_MiniTableField * f,double value,upb_Arena * a)776 UPB_API_INLINE bool upb_Message_SetDouble(struct upb_Message* msg,
777                                           const upb_MiniTableField* f,
778                                           double value, upb_Arena* a) {
779   return upb_MiniTableField_IsExtension(f)
780              ? upb_Message_SetExtensionDouble(
781                    msg, (const upb_MiniTableExtension*)f, value, a)
782              : (upb_Message_SetBaseFieldDouble(msg, f, value), true);
783 }
784 
upb_Message_SetFloat(struct upb_Message * msg,const upb_MiniTableField * f,float value,upb_Arena * a)785 UPB_API_INLINE bool upb_Message_SetFloat(struct upb_Message* msg,
786                                          const upb_MiniTableField* f,
787                                          float value, upb_Arena* a) {
788   return upb_MiniTableField_IsExtension(f)
789              ? upb_Message_SetExtensionFloat(
790                    msg, (const upb_MiniTableExtension*)f, value, a)
791              : (upb_Message_SetBaseFieldFloat(msg, f, value), true);
792 }
793 
upb_Message_SetInt32(struct upb_Message * msg,const upb_MiniTableField * f,int32_t value,upb_Arena * a)794 UPB_API_INLINE bool upb_Message_SetInt32(struct upb_Message* msg,
795                                          const upb_MiniTableField* f,
796                                          int32_t value, upb_Arena* a) {
797   return upb_MiniTableField_IsExtension(f)
798              ? upb_Message_SetExtensionInt32(
799                    msg, (const upb_MiniTableExtension*)f, value, a)
800              : (upb_Message_SetBaseFieldInt32(msg, f, value), true);
801 }
802 
upb_Message_SetInt64(struct upb_Message * msg,const upb_MiniTableField * f,int64_t value,upb_Arena * a)803 UPB_API_INLINE bool upb_Message_SetInt64(struct upb_Message* msg,
804                                          const upb_MiniTableField* f,
805                                          int64_t value, upb_Arena* a) {
806   return upb_MiniTableField_IsExtension(f)
807              ? upb_Message_SetExtensionInt64(
808                    msg, (const upb_MiniTableExtension*)f, value, a)
809              : (upb_Message_SetBaseFieldInt64(msg, f, value), true);
810 }
811 
812 // Sets the value of a message-typed field. The mini_tables of `msg` and
813 // `value` must have been linked for this to work correctly.
upb_Message_SetMessage(struct upb_Message * msg,const upb_MiniTableField * f,struct upb_Message * value)814 UPB_API_INLINE void upb_Message_SetMessage(struct upb_Message* msg,
815                                            const upb_MiniTableField* f,
816                                            struct upb_Message* value) {
817   UPB_ASSERT(!upb_MiniTableField_IsExtension(f));
818   upb_Message_SetBaseFieldMessage(msg, f, value);
819 }
820 
821 // Sets the value of a `string` or `bytes` field. The bytes of the value are not
822 // copied, so it is the caller's responsibility to ensure that they remain valid
823 // for the lifetime of `msg`. That might be done by copying them into the given
824 // arena, or by fusing that arena with the arena the bytes live in, for example.
upb_Message_SetString(struct upb_Message * msg,const upb_MiniTableField * f,upb_StringView value,upb_Arena * a)825 UPB_API_INLINE bool upb_Message_SetString(struct upb_Message* msg,
826                                           const upb_MiniTableField* f,
827                                           upb_StringView value, upb_Arena* a) {
828   return upb_MiniTableField_IsExtension(f)
829              ? upb_Message_SetExtensionString(
830                    msg, (const upb_MiniTableExtension*)f, value, a)
831              : (upb_Message_SetBaseFieldString(msg, f, value), true);
832 }
833 
upb_Message_SetUInt32(struct upb_Message * msg,const upb_MiniTableField * f,uint32_t value,upb_Arena * a)834 UPB_API_INLINE bool upb_Message_SetUInt32(struct upb_Message* msg,
835                                           const upb_MiniTableField* f,
836                                           uint32_t value, upb_Arena* a) {
837   return upb_MiniTableField_IsExtension(f)
838              ? upb_Message_SetExtensionUInt32(
839                    msg, (const upb_MiniTableExtension*)f, value, a)
840              : (upb_Message_SetBaseFieldUInt32(msg, f, value), true);
841 }
842 
upb_Message_SetUInt64(struct upb_Message * msg,const upb_MiniTableField * f,uint64_t value,upb_Arena * a)843 UPB_API_INLINE bool upb_Message_SetUInt64(struct upb_Message* msg,
844                                           const upb_MiniTableField* f,
845                                           uint64_t value, upb_Arena* a) {
846   return upb_MiniTableField_IsExtension(f)
847              ? upb_Message_SetExtensionUInt64(
848                    msg, (const upb_MiniTableExtension*)f, value, a)
849              : (upb_Message_SetBaseFieldUInt64(msg, f, value), true);
850 }
851 
upb_Message_Clear(struct upb_Message * msg,const upb_MiniTable * m)852 UPB_API_INLINE void upb_Message_Clear(struct upb_Message* msg,
853                                       const upb_MiniTable* m) {
854   UPB_ASSERT(!upb_Message_IsFrozen(msg));
855   upb_Message_Internal* in = UPB_PRIVATE(_upb_Message_GetInternal)(msg);
856   memset(msg, 0, m->UPB_PRIVATE(size));
857   if (in) {
858     // Reset the internal buffer to empty.
859     in->unknown_end = sizeof(upb_Message_Internal);
860     in->ext_begin = in->size;
861     UPB_PRIVATE(_upb_Message_SetInternal)(msg, in);
862   }
863 }
864 
upb_Message_ClearBaseField(struct upb_Message * msg,const upb_MiniTableField * f)865 UPB_API_INLINE void upb_Message_ClearBaseField(struct upb_Message* msg,
866                                                const upb_MiniTableField* f) {
867   UPB_ASSERT(!upb_Message_IsFrozen(msg));
868   if (UPB_PRIVATE(_upb_MiniTableField_HasHasbit)(f)) {
869     UPB_PRIVATE(_upb_Message_ClearHasbit)(msg, f);
870   } else if (upb_MiniTableField_IsInOneof(f)) {
871     uint32_t* ptr = UPB_PRIVATE(_upb_Message_OneofCasePtr)(msg, f);
872     if (*ptr != upb_MiniTableField_Number(f)) return;
873     *ptr = 0;
874   }
875   const char zeros[16] = {0};
876   UPB_PRIVATE(_upb_MiniTableField_DataCopy)
877   (f, UPB_PRIVATE(_upb_Message_MutableDataPtr)(msg, f), zeros);
878 }
879 
upb_Message_ClearExtension(struct upb_Message * msg,const upb_MiniTableExtension * e)880 UPB_API_INLINE void upb_Message_ClearExtension(
881     struct upb_Message* msg, const upb_MiniTableExtension* e) {
882   UPB_ASSERT(!upb_Message_IsFrozen(msg));
883   upb_Message_Internal* in = UPB_PRIVATE(_upb_Message_GetInternal)(msg);
884   if (!in) return;
885   const upb_Extension* base = UPB_PTR_AT(in, in->ext_begin, upb_Extension);
886   upb_Extension* ext = (upb_Extension*)UPB_PRIVATE(_upb_Message_Getext)(msg, e);
887   if (ext) {
888     *ext = *base;
889     in->ext_begin += sizeof(upb_Extension);
890   }
891 }
892 
upb_Message_ClearOneof(struct upb_Message * msg,const upb_MiniTable * m,const upb_MiniTableField * f)893 UPB_API_INLINE void upb_Message_ClearOneof(struct upb_Message* msg,
894                                            const upb_MiniTable* m,
895                                            const upb_MiniTableField* f) {
896   UPB_ASSERT(!upb_Message_IsFrozen(msg));
897   uint32_t field_number = upb_Message_WhichOneofFieldNumber(msg, f);
898   if (field_number == 0) {
899     // No field in the oneof is set.
900     return;
901   }
902 
903   const upb_MiniTableField* field =
904       upb_MiniTable_FindFieldByNumber(m, field_number);
905   upb_Message_ClearBaseField(msg, field);
906 }
907 
upb_Message_ResizeArrayUninitialized(struct upb_Message * msg,const upb_MiniTableField * f,size_t size,upb_Arena * arena)908 UPB_API_INLINE void* upb_Message_ResizeArrayUninitialized(
909     struct upb_Message* msg, const upb_MiniTableField* f, size_t size,
910     upb_Arena* arena) {
911   UPB_PRIVATE(_upb_MiniTableField_CheckIsArray)(f);
912   upb_Array* arr = upb_Message_GetOrCreateMutableArray(msg, f, arena);
913   if (!arr || !UPB_PRIVATE(_upb_Array_ResizeUninitialized)(arr, size, arena)) {
914     return NULL;
915   }
916   return upb_Array_MutableDataPtr(arr);
917 }
918 
919 #ifdef __cplusplus
920 } /* extern "C" */
921 #endif
922 
923 #if defined(__GNUC__) && !defined(__clang__)
924 #pragma GCC diagnostic pop
925 #endif
926 
927 #include "upb/port/undef.inc"
928 
929 #endif  // UPB_MESSAGE_INTERNAL_ACCESSORS_H_
930