upb: reverse the polarity of the MiniTableField untyped data accessors

PiperOrigin-RevId: 590007603
pull/15045/head
Eric Salo 1 year ago committed by Copybara-Service
parent de52944f38
commit a649ddadb5
  1. 2
      upb/base/string_view.h
  2. 53
      upb/message/internal/accessors.h
  3. 3
      upb/reflection/message.c

@ -42,7 +42,7 @@ UPB_INLINE upb_StringView upb_StringView_FromString(const char* data) {
} }
UPB_INLINE bool upb_StringView_IsEqual(upb_StringView a, upb_StringView b) { UPB_INLINE bool upb_StringView_IsEqual(upb_StringView a, upb_StringView b) {
return a.size == b.size && memcmp(a.data, b.data, a.size) == 0; return (a.size == b.size) && (!a.size || !memcmp(a.data, b.data, a.size));
} }
// LINT.ThenChange( // LINT.ThenChange(

@ -117,26 +117,32 @@ UPB_INLINE void UPB_PRIVATE(_upb_Message_SetPresence)(
} }
} }
UPB_INLINE bool _upb_MiniTable_ValueIsNonZero(const void* default_val, UPB_INLINE bool UPB_PRIVATE(_upb_MiniTableField_DataEquals)(
const upb_MiniTableField* field) { const upb_MiniTableField* field, const void* a, const void* b) {
char zero[16] = {0};
switch (UPB_PRIVATE(_upb_MiniTableField_GetRep)(field)) { switch (UPB_PRIVATE(_upb_MiniTableField_GetRep)(field)) {
case kUpb_FieldRep_1Byte: case kUpb_FieldRep_1Byte:
return memcmp(&zero, default_val, 1) != 0; return memcmp(a, b, 1) == 0;
case kUpb_FieldRep_4Byte: case kUpb_FieldRep_4Byte:
return memcmp(&zero, default_val, 4) != 0; return memcmp(a, b, 4) == 0;
case kUpb_FieldRep_8Byte: case kUpb_FieldRep_8Byte:
return memcmp(&zero, default_val, 8) != 0; return memcmp(a, b, 8) == 0;
case kUpb_FieldRep_StringView: { case kUpb_FieldRep_StringView: {
const upb_StringView* sv = (const upb_StringView*)default_val; const upb_StringView sa = *(const upb_StringView*)a;
return sv->size != 0; const upb_StringView sb = *(const upb_StringView*)b;
return upb_StringView_IsEqual(sa, sb);
} }
} }
UPB_UNREACHABLE(); UPB_UNREACHABLE();
} }
UPB_INLINE void _upb_MiniTable_CopyFieldData(void* to, const void* from, UPB_INLINE bool UPB_PRIVATE(_upb_MiniTableField_DataIsZero)(
const upb_MiniTableField* field) { const upb_MiniTableField* field, const void* val) {
const char zero[16] = {0};
return UPB_PRIVATE(_upb_MiniTableField_DataEquals)(field, val, zero);
}
UPB_INLINE void UPB_PRIVATE(_upb_MiniTableField_DataCopy)(
const upb_MiniTableField* field, void* to, const void* from) {
switch (UPB_PRIVATE(_upb_MiniTableField_GetRep)(field)) { switch (UPB_PRIVATE(_upb_MiniTableField_GetRep)(field)) {
case kUpb_FieldRep_1Byte: case kUpb_FieldRep_1Byte:
memcpy(to, from, 1); memcpy(to, from, 1);
@ -211,24 +217,26 @@ static UPB_FORCEINLINE void _upb_Message_GetNonExtensionField(
const void* default_val, void* val) { const void* default_val, void* val) {
UPB_ASSUME(!upb_MiniTableField_IsExtension(field)); UPB_ASSUME(!upb_MiniTableField_IsExtension(field));
if ((upb_MiniTableField_IsInOneof(field) || if ((upb_MiniTableField_IsInOneof(field) ||
_upb_MiniTable_ValueIsNonZero(default_val, field)) && !UPB_PRIVATE(_upb_MiniTableField_DataIsZero)(field, default_val)) &&
!_upb_Message_HasNonExtensionField(msg, field)) { !_upb_Message_HasNonExtensionField(msg, field)) {
_upb_MiniTable_CopyFieldData(val, default_val, field); UPB_PRIVATE(_upb_MiniTableField_DataCopy)(field, val, default_val);
return; return;
} }
_upb_MiniTable_CopyFieldData(val, _upb_MiniTableField_GetConstPtr(msg, field), UPB_PRIVATE(_upb_MiniTableField_DataCopy)
field); (field, val, _upb_MiniTableField_GetConstPtr(msg, field));
} }
UPB_INLINE void _upb_Message_GetExtensionField( UPB_INLINE void _upb_Message_GetExtensionField(
const upb_Message* msg, const upb_MiniTableExtension* mt_ext, const upb_Message* msg, const upb_MiniTableExtension* mt_ext,
const void* default_val, void* val) { const void* default_val, void* val) {
UPB_ASSUME(upb_MiniTableField_IsExtension(&mt_ext->UPB_PRIVATE(field)));
const upb_Message_Extension* ext = _upb_Message_Getext(msg, mt_ext); const upb_Message_Extension* ext = _upb_Message_Getext(msg, mt_ext);
const upb_MiniTableField* f = &mt_ext->UPB_PRIVATE(field);
UPB_ASSUME(upb_MiniTableField_IsExtension(f));
if (ext) { if (ext) {
_upb_MiniTable_CopyFieldData(val, &ext->data, &mt_ext->UPB_PRIVATE(field)); UPB_PRIVATE(_upb_MiniTableField_DataCopy)(f, val, &ext->data);
} else { } else {
_upb_MiniTable_CopyFieldData(val, default_val, &mt_ext->UPB_PRIVATE(field)); UPB_PRIVATE(_upb_MiniTableField_DataCopy)(f, val, default_val);
} }
} }
@ -263,8 +271,8 @@ UPB_INLINE void _upb_Message_SetNonExtensionField(
upb_Message* msg, const upb_MiniTableField* field, const void* val) { upb_Message* msg, const upb_MiniTableField* field, const void* val) {
UPB_ASSUME(!upb_MiniTableField_IsExtension(field)); UPB_ASSUME(!upb_MiniTableField_IsExtension(field));
UPB_PRIVATE(_upb_Message_SetPresence)(msg, field); UPB_PRIVATE(_upb_Message_SetPresence)(msg, field);
_upb_MiniTable_CopyFieldData(_upb_MiniTableField_GetPtr(msg, field), val, UPB_PRIVATE(_upb_MiniTableField_DataCopy)
field); (field, _upb_MiniTableField_GetPtr(msg, field), val);
} }
UPB_INLINE bool _upb_Message_SetExtensionField( UPB_INLINE bool _upb_Message_SetExtensionField(
@ -274,7 +282,8 @@ UPB_INLINE bool _upb_Message_SetExtensionField(
upb_Message_Extension* ext = upb_Message_Extension* ext =
_upb_Message_GetOrCreateExtension(msg, mt_ext, a); _upb_Message_GetOrCreateExtension(msg, mt_ext, a);
if (!ext) return false; if (!ext) return false;
_upb_MiniTable_CopyFieldData(&ext->data, val, &mt_ext->UPB_PRIVATE(field)); UPB_PRIVATE(_upb_MiniTableField_DataCopy)
(&mt_ext->UPB_PRIVATE(field), &ext->data, val);
return true; return true;
} }
@ -302,8 +311,8 @@ UPB_INLINE void _upb_Message_ClearNonExtensionField(
*ptr = 0; *ptr = 0;
} }
const char zeros[16] = {0}; const char zeros[16] = {0};
_upb_MiniTable_CopyFieldData(_upb_MiniTableField_GetPtr(msg, field), zeros, UPB_PRIVATE(_upb_MiniTableField_DataCopy)
field); (field, _upb_MiniTableField_GetPtr(msg, field), zeros);
} }
UPB_INLINE void _upb_Message_AssertMapIsUntagged( UPB_INLINE void _upb_Message_AssertMapIsUntagged(

@ -131,7 +131,8 @@ bool upb_Message_Next(const upb_Message* msg, const upb_MessageDef* m,
if (!val.array_val || upb_Array_Size(val.array_val) == 0) continue; if (!val.array_val || upb_Array_Size(val.array_val) == 0) continue;
break; break;
case kUpb_FieldMode_Scalar: case kUpb_FieldMode_Scalar:
if (!_upb_MiniTable_ValueIsNonZero(&val, field)) continue; if (UPB_PRIVATE(_upb_MiniTableField_DataIsZero)(field, &val))
continue;
break; break;
} }
} }

Loading…
Cancel
Save