upb: upb_Message_FindExtensionByNumber() no longer returns a (upb_Extension*)

PiperOrigin-RevId: 601494260
pull/15540/head
Eric Salo 1 year ago committed by Copybara-Service
parent 8dfe58bb16
commit 953d521a04
  1. 1
      upb/message/BUILD
  2. 31
      upb/message/compare.h
  3. 10
      upb/message/compat.c
  4. 6
      upb/message/compat.h
  5. 13
      upb/message/internal/accessors.h
  6. 19
      upb/message/internal/extension.c
  7. 10
      upb/message/internal/extension.h
  8. 9
      upb/message/internal/map_sorter.h
  9. 1
      upb/message/message.h
  10. 1
      upb/message/promote.h

@ -91,6 +91,7 @@ cc_library(
visibility = ["//visibility:public"],
deps = [
":message",
"//upb:base",
"//upb:mem",
"//upb:mini_table",
"//upb:port",

@ -8,7 +8,9 @@
#ifndef UPB_MESSAGE_COMPARE_H_
#define UPB_MESSAGE_COMPARE_H_
#include "upb/base/descriptor_constants.h"
#include "upb/message/message.h"
#include "upb/message/value.h"
#include "upb/mini_table/message.h"
// Must be last.
@ -23,6 +25,35 @@ UPB_API bool upb_Message_IsExactlyEqual(const upb_Message* msg1,
const upb_Message* msg2,
const upb_MiniTable* m);
// Performs a shallow field comparison. Do not use on message types.
UPB_API_INLINE bool upb_MessageValue_IsEqual(upb_MessageValue val1,
upb_MessageValue val2,
upb_CType ctype) {
switch (ctype) {
case kUpb_CType_Bool:
return val1.bool_val == val2.bool_val;
case kUpb_CType_Float:
case kUpb_CType_Int32:
case kUpb_CType_UInt32:
case kUpb_CType_Enum:
return val1.int32_val == val2.int32_val;
case kUpb_CType_Double:
case kUpb_CType_Int64:
case kUpb_CType_UInt64:
return val1.int64_val == val2.int64_val;
case kUpb_CType_String:
case kUpb_CType_Bytes:
return upb_StringView_IsEqual(val1.str_val, val2.str_val);
default: // Note: This includes kUpb_CType_Message
UPB_ASSERT(0);
return false;
}
}
#ifdef __cplusplus
} /* extern "C" */
#endif

@ -26,14 +26,14 @@ const upb_MiniTableExtension* upb_Message_ExtensionByIndex(
return ext[index].ext;
}
const upb_Extension* upb_Message_FindExtensionByNumber(const upb_Message* msg,
uint32_t field_number) {
const upb_MiniTableExtension* upb_Message_FindExtensionByNumber(
const upb_Message* msg, uint32_t field_number) {
size_t count;
const upb_Extension* ext = UPB_PRIVATE(_upb_Message_Getexts)(msg, &count);
while (count--) {
if (upb_MiniTableExtension_Number(ext->ext) == field_number) return ext;
ext++;
for (; count--; ext++) {
const upb_MiniTableExtension* e = ext->ext;
if (upb_MiniTableExtension_Number(e) == field_number) return e;
}
return NULL;
}

@ -28,9 +28,9 @@ extern "C" {
const upb_MiniTableExtension* upb_Message_ExtensionByIndex(
const upb_Message* msg, size_t index);
// Returns the extension with the given field number, or NULL on failure.
const upb_Extension* upb_Message_FindExtensionByNumber(const upb_Message* msg,
uint32_t field_number);
// Returns the minitable with the given field number, or NULL on failure.
const upb_MiniTableExtension* upb_Message_FindExtensionByNumber(
const upb_Message* msg, uint32_t field_number);
#ifdef __cplusplus
} /* extern "C" */

@ -260,8 +260,7 @@ static UPB_FORCEINLINE void _upb_Message_GetNonExtensionField(
UPB_INLINE void _upb_Message_GetExtensionField(
const struct upb_Message* msg, const upb_MiniTableExtension* mt_ext,
const void* default_val, void* val) {
const struct upb_Extension* ext =
UPB_PRIVATE(_upb_Message_Getext)(msg, mt_ext);
const upb_Extension* ext = UPB_PRIVATE(_upb_Message_Getext)(msg, mt_ext);
const upb_MiniTableField* f = &mt_ext->UPB_PRIVATE(field);
UPB_ASSUME(upb_MiniTableField_IsExtension(f));
@ -284,7 +283,7 @@ UPB_INLINE bool _upb_Message_SetExtensionField(
struct upb_Message* msg, const upb_MiniTableExtension* mt_ext,
const void* val, upb_Arena* a) {
UPB_ASSERT(a);
struct upb_Extension* ext =
upb_Extension* ext =
UPB_PRIVATE(_upb_Message_GetOrCreateExtension)(msg, mt_ext, a);
if (!ext) return false;
UPB_PRIVATE(_upb_MiniTableField_DataCopy)
@ -315,13 +314,11 @@ UPB_INLINE void UPB_PRIVATE(_upb_Message_ClearExtension)(
struct upb_Message* msg, const upb_MiniTableExtension* e) {
upb_Message_Internal* in = msg->internal;
if (!in) return;
const struct upb_Extension* base =
UPB_PTR_AT(in, in->ext_begin, struct upb_Extension);
struct upb_Extension* ext =
(struct upb_Extension*)UPB_PRIVATE(_upb_Message_Getext)(msg, e);
const upb_Extension* base = UPB_PTR_AT(in, in->ext_begin, upb_Extension);
upb_Extension* ext = (upb_Extension*)UPB_PRIVATE(_upb_Message_Getext)(msg, e);
if (ext) {
*ext = *base;
in->ext_begin += sizeof(struct upb_Extension);
in->ext_begin += sizeof(upb_Extension);
}
}

@ -18,10 +18,10 @@
// Must be last.
#include "upb/port/def.inc"
const struct upb_Extension* UPB_PRIVATE(_upb_Message_Getext)(
const upb_Extension* UPB_PRIVATE(_upb_Message_Getext)(
const struct upb_Message* msg, const upb_MiniTableExtension* e) {
size_t n;
const struct upb_Extension* ext = UPB_PRIVATE(_upb_Message_Getexts)(msg, &n);
const upb_Extension* ext = UPB_PRIVATE(_upb_Message_Getexts)(msg, &n);
// For now we use linear search exclusively to find extensions.
// If this becomes an issue due to messages with lots of extensions,
@ -35,11 +35,11 @@ const struct upb_Extension* UPB_PRIVATE(_upb_Message_Getext)(
return NULL;
}
const struct upb_Extension* UPB_PRIVATE(_upb_Message_Getexts)(
const upb_Extension* UPB_PRIVATE(_upb_Message_Getexts)(
const struct upb_Message* msg, size_t* count) {
upb_Message_Internal* in = msg->internal;
if (in) {
*count = (in->size - in->ext_begin) / sizeof(struct upb_Extension);
*count = (in->size - in->ext_begin) / sizeof(upb_Extension);
return UPB_PTR_AT(in, in->ext_begin, void);
} else {
*count = 0;
@ -47,17 +47,16 @@ const struct upb_Extension* UPB_PRIVATE(_upb_Message_Getexts)(
}
}
struct upb_Extension* UPB_PRIVATE(_upb_Message_GetOrCreateExtension)(
upb_Extension* UPB_PRIVATE(_upb_Message_GetOrCreateExtension)(
struct upb_Message* msg, const upb_MiniTableExtension* e, upb_Arena* a) {
struct upb_Extension* ext =
(struct upb_Extension*)UPB_PRIVATE(_upb_Message_Getext)(msg, e);
upb_Extension* ext = (upb_Extension*)UPB_PRIVATE(_upb_Message_Getext)(msg, e);
if (ext) return ext;
if (!UPB_PRIVATE(_upb_Message_Realloc)(msg, sizeof(struct upb_Extension), a))
if (!UPB_PRIVATE(_upb_Message_Realloc)(msg, sizeof(upb_Extension), a))
return NULL;
upb_Message_Internal* in = msg->internal;
in->ext_begin -= sizeof(struct upb_Extension);
in->ext_begin -= sizeof(upb_Extension);
ext = UPB_PTR_AT(in, in->ext_begin, void);
memset(ext, 0, sizeof(struct upb_Extension));
memset(ext, 0, sizeof(upb_Extension));
ext->ext = e;
return ext;
}

@ -24,14 +24,14 @@
// This is rather wasteful for scalars (in the extreme case of bool,
// it wastes 15 bytes). We accept this because we expect messages to be
// the most common extension type.
struct upb_Extension {
typedef struct {
const upb_MiniTableExtension* ext;
union {
upb_StringView str;
void* ptr;
char scalar_data[8];
} data;
};
} upb_Extension;
#ifdef __cplusplus
extern "C" {
@ -40,18 +40,18 @@ extern "C" {
// Adds the given extension data to the given message.
// |ext| is copied into the message instance.
// This logically replaces any previously-added extension with this number.
struct upb_Extension* UPB_PRIVATE(_upb_Message_GetOrCreateExtension)(
upb_Extension* UPB_PRIVATE(_upb_Message_GetOrCreateExtension)(
struct upb_Message* msg, const upb_MiniTableExtension* ext,
upb_Arena* arena);
// Returns an array of extensions for this message.
// Note: the array is ordered in reverse relative to the order of creation.
const struct upb_Extension* UPB_PRIVATE(_upb_Message_Getexts)(
const upb_Extension* UPB_PRIVATE(_upb_Message_Getexts)(
const struct upb_Message* msg, size_t* count);
// Returns an extension for a message with a given mini table,
// or NULL if no extension exists with this mini table.
const struct upb_Extension* UPB_PRIVATE(_upb_Message_Getext)(
const upb_Extension* UPB_PRIVATE(_upb_Message_Getext)(
const struct upb_Message* msg, const upb_MiniTableExtension* ext);
#ifdef __cplusplus

@ -66,9 +66,9 @@ UPB_INLINE bool _upb_sortedmap_next(_upb_mapsorter* s,
UPB_INLINE bool _upb_sortedmap_nextext(_upb_mapsorter* s,
_upb_sortedmap* sorted,
const struct upb_Extension** ext) {
const upb_Extension** ext) {
if (sorted->pos == sorted->end) return false;
*ext = (const struct upb_Extension*)s->entries[sorted->pos++];
*ext = (const upb_Extension*)s->entries[sorted->pos++];
return true;
}
@ -80,9 +80,8 @@ UPB_INLINE void _upb_mapsorter_popmap(_upb_mapsorter* s,
bool _upb_mapsorter_pushmap(_upb_mapsorter* s, upb_FieldType key_type,
const struct upb_Map* map, _upb_sortedmap* sorted);
bool _upb_mapsorter_pushexts(_upb_mapsorter* s,
const struct upb_Extension* exts, size_t count,
_upb_sortedmap* sorted);
bool _upb_mapsorter_pushexts(_upb_mapsorter* s, const upb_Extension* exts,
size_t count, _upb_sortedmap* sorted);
#ifdef __cplusplus
} /* extern "C" */

@ -20,7 +20,6 @@
// Must be last.
#include "upb/port/def.inc"
typedef struct upb_Extension upb_Extension;
typedef struct upb_Message upb_Message;
#ifdef __cplusplus

@ -9,7 +9,6 @@
#define UPB_MESSAGE_PROMOTE_H_
#include "upb/message/array.h"
#include "upb/message/internal/extension.h"
#include "upb/message/map.h"
#include "upb/wire/decode.h"

Loading…
Cancel
Save