Bump upb version to fix ruby flakes PiperOrigin-RevId: 506798675
diff --git a/php/ext/google/protobuf/php-upb.c b/php/ext/google/protobuf/php-upb.c index fd2f3e2..ef95724 100644 --- a/php/ext/google/protobuf/php-upb.c +++ b/php/ext/google/protobuf/php-upb.c
@@ -5811,6 +5811,7 @@ return ret; } +// Warning: See TODO(b/267655898) upb_UnknownToMessageRet upb_MiniTable_PromoteUnknownToMessage( upb_Message* msg, const upb_MiniTable* mini_table, const upb_MiniTableField* field, const upb_MiniTable* sub_mini_table, @@ -5821,7 +5822,10 @@ // Callers should check that message is not set first before calling // PromotoUnknownToMessage. UPB_ASSERT(mini_table->subs[field->submsg_index].submsg == sub_mini_table); - UPB_ASSERT(upb_Message_GetMessage(msg, field, NULL) == NULL); + bool is_oneof = _upb_MiniTableField_InOneOf(field); + if (!is_oneof || _upb_getoneofcase_field(msg, field) == field->number) { + UPB_ASSERT(upb_Message_GetMessage(msg, field, NULL) == NULL); + } upb_UnknownToMessageRet ret; ret.status = kUpb_UnknownToMessage_Ok; do { @@ -5849,6 +5853,9 @@ } } while (unknown.status == kUpb_FindUnknown_Ok); if (message) { + if (is_oneof) { + *_upb_oneofcase_field(msg, field) = field->number; + } upb_Message_SetMessage(msg, mini_table, field, message); ret.message = message; } @@ -6170,6 +6177,38 @@ return field->descriptortype; } +static bool upb_MiniTable_Is_Oneof(const upb_MiniTableField* f) { + return f->presence < 0; +} + +const upb_MiniTableField* upb_MiniTable_GetOneof(const upb_MiniTable* m, + const upb_MiniTableField* f) { + if (UPB_UNLIKELY(!upb_MiniTable_Is_Oneof(f))) { + return NULL; + } + const upb_MiniTableField* ptr = &m->fields[0]; + const upb_MiniTableField* end = &m->fields[m->field_count]; + while (++ptr < end) { + if (ptr->presence == (*f).presence) { + return ptr; + } + } + return NULL; +} + +bool upb_MiniTable_NextOneofField(const upb_MiniTable* m, + const upb_MiniTableField** f) { + const upb_MiniTableField* ptr = *f; + const upb_MiniTableField* end = &m->fields[m->field_count]; + while (++ptr < end) { + if (ptr->presence == (*f)->presence) { + *f = ptr; + return true; + } + } + return false; +} + #include <inttypes.h> #include <stdlib.h>
diff --git a/php/ext/google/protobuf/php-upb.h b/php/ext/google/protobuf/php-upb.h index f17a2dd..6b554cc 100644 --- a/php/ext/google/protobuf/php-upb.h +++ b/php/ext/google/protobuf/php-upb.h
@@ -2253,6 +2253,26 @@ return mini_table->subs[field->submsg_index].subenum; } +// If this field is in a oneof, returns the first field in the oneof. +// +// Otherwise returns NULL. +// +// Usage: +// const upb_MiniTableField* field = upb_MiniTable_GetOneof(m, f); +// do { +// .. +// } while (upb_MiniTable_NextOneofField(m, &field); +// +const upb_MiniTableField* upb_MiniTable_GetOneof(const upb_MiniTable* m, + const upb_MiniTableField* f); + +// Returns the next field in the oneof. If this is the last field in the +// oneof, returns NULL. The ordering of fields in the oneof is not +// guaranteed. +// REQUIRES: |iter| is and iterator. +bool upb_MiniTable_NextOneofField(const upb_MiniTable* m, + const upb_MiniTableField** f); + #ifdef __cplusplus } /* extern "C" */ #endif @@ -2942,6 +2962,8 @@ // // The unknown data is removed from message after field value is set // using upb_Message_SetMessage. +// +// WARNING!: See b/267655898 upb_UnknownToMessageRet upb_MiniTable_PromoteUnknownToMessage( upb_Message* msg, const upb_MiniTable* mini_table, const upb_MiniTableField* field, const upb_MiniTable* sub_mini_table, @@ -3290,6 +3312,12 @@ extern const upb_MiniTable google_protobuf_GeneratedCodeInfo_Annotation_msg_init; typedef enum { + google_protobuf_FieldDescriptorProto_LABEL_OPTIONAL = 1, + google_protobuf_FieldDescriptorProto_LABEL_REQUIRED = 2, + google_protobuf_FieldDescriptorProto_LABEL_REPEATED = 3 +} google_protobuf_FieldDescriptorProto_Label; + +typedef enum { google_protobuf_FieldDescriptorProto_TYPE_DOUBLE = 1, google_protobuf_FieldDescriptorProto_TYPE_FLOAT = 2, google_protobuf_FieldDescriptorProto_TYPE_INT64 = 3, @@ -3311,18 +3339,6 @@ } google_protobuf_FieldDescriptorProto_Type; typedef enum { - google_protobuf_FieldDescriptorProto_LABEL_OPTIONAL = 1, - google_protobuf_FieldDescriptorProto_LABEL_REQUIRED = 2, - google_protobuf_FieldDescriptorProto_LABEL_REPEATED = 3 -} google_protobuf_FieldDescriptorProto_Label; - -typedef enum { - google_protobuf_FileOptions_SPEED = 1, - google_protobuf_FileOptions_CODE_SIZE = 2, - google_protobuf_FileOptions_LITE_RUNTIME = 3 -} google_protobuf_FileOptions_OptimizeMode; - -typedef enum { google_protobuf_FieldOptions_STRING = 0, google_protobuf_FieldOptions_CORD = 1, google_protobuf_FieldOptions_STRING_PIECE = 2 @@ -3354,10 +3370,10 @@ } google_protobuf_FieldOptions_OptionTargetType; typedef enum { - google_protobuf_MethodOptions_IDEMPOTENCY_UNKNOWN = 0, - google_protobuf_MethodOptions_NO_SIDE_EFFECTS = 1, - google_protobuf_MethodOptions_IDEMPOTENT = 2 -} google_protobuf_MethodOptions_IdempotencyLevel; + google_protobuf_FileOptions_SPEED = 1, + google_protobuf_FileOptions_CODE_SIZE = 2, + google_protobuf_FileOptions_LITE_RUNTIME = 3 +} google_protobuf_FileOptions_OptimizeMode; typedef enum { google_protobuf_GeneratedCodeInfo_Annotation_NONE = 0, @@ -3365,16 +3381,22 @@ google_protobuf_GeneratedCodeInfo_Annotation_ALIAS = 2 } google_protobuf_GeneratedCodeInfo_Annotation_Semantic; +typedef enum { + google_protobuf_MethodOptions_IDEMPOTENCY_UNKNOWN = 0, + google_protobuf_MethodOptions_NO_SIDE_EFFECTS = 1, + google_protobuf_MethodOptions_IDEMPOTENT = 2 +} google_protobuf_MethodOptions_IdempotencyLevel; -extern const upb_MiniTableEnum google_protobuf_FieldDescriptorProto_Type_enum_init; + extern const upb_MiniTableEnum google_protobuf_FieldDescriptorProto_Label_enum_init; -extern const upb_MiniTableEnum google_protobuf_FileOptions_OptimizeMode_enum_init; +extern const upb_MiniTableEnum google_protobuf_FieldDescriptorProto_Type_enum_init; extern const upb_MiniTableEnum google_protobuf_FieldOptions_CType_enum_init; extern const upb_MiniTableEnum google_protobuf_FieldOptions_JSType_enum_init; extern const upb_MiniTableEnum google_protobuf_FieldOptions_OptionRetention_enum_init; extern const upb_MiniTableEnum google_protobuf_FieldOptions_OptionTargetType_enum_init; -extern const upb_MiniTableEnum google_protobuf_MethodOptions_IdempotencyLevel_enum_init; +extern const upb_MiniTableEnum google_protobuf_FileOptions_OptimizeMode_enum_init; extern const upb_MiniTableEnum google_protobuf_GeneratedCodeInfo_Annotation_Semantic_enum_init; +extern const upb_MiniTableEnum google_protobuf_MethodOptions_IdempotencyLevel_enum_init; /* google.protobuf.FileDescriptorSet */
diff --git a/protobuf_deps.bzl b/protobuf_deps.bzl index 18439ab..fee1e9c 100644 --- a/protobuf_deps.bzl +++ b/protobuf_deps.bzl
@@ -149,7 +149,7 @@ _github_archive( name = "upb", repo = "https://github.com/protocolbuffers/upb", - commit = "84a3fd2d2d943c8ff37f09feadb1dd3f60f954ee", - sha256 = "5c144471b9d92250e77710376251a6929e47b49eea50b8f380e759a9447fb60b", + commit = "662497f1d3dcced2bba1620cea9aae8b484bd3cd", + sha256 = "57c87ca4145d2cbc162a6c613b114b9325b577f4f6525bd78747a34b3d03627c", patches = ["@com_google_protobuf//build_defs:upb.patch"], )
diff --git a/ruby/ext/google/protobuf_c/ruby-upb.c b/ruby/ext/google/protobuf_c/ruby-upb.c index 4763683..6fbf78b 100644 --- a/ruby/ext/google/protobuf_c/ruby-upb.c +++ b/ruby/ext/google/protobuf_c/ruby-upb.c
@@ -5448,6 +5448,7 @@ return ret; } +// Warning: See TODO(b/267655898) upb_UnknownToMessageRet upb_MiniTable_PromoteUnknownToMessage( upb_Message* msg, const upb_MiniTable* mini_table, const upb_MiniTableField* field, const upb_MiniTable* sub_mini_table, @@ -5458,7 +5459,10 @@ // Callers should check that message is not set first before calling // PromotoUnknownToMessage. UPB_ASSERT(mini_table->subs[field->submsg_index].submsg == sub_mini_table); - UPB_ASSERT(upb_Message_GetMessage(msg, field, NULL) == NULL); + bool is_oneof = _upb_MiniTableField_InOneOf(field); + if (!is_oneof || _upb_getoneofcase_field(msg, field) == field->number) { + UPB_ASSERT(upb_Message_GetMessage(msg, field, NULL) == NULL); + } upb_UnknownToMessageRet ret; ret.status = kUpb_UnknownToMessage_Ok; do { @@ -5486,6 +5490,9 @@ } } while (unknown.status == kUpb_FindUnknown_Ok); if (message) { + if (is_oneof) { + *_upb_oneofcase_field(msg, field) = field->number; + } upb_Message_SetMessage(msg, mini_table, field, message); ret.message = message; } @@ -5807,6 +5814,38 @@ return field->descriptortype; } +static bool upb_MiniTable_Is_Oneof(const upb_MiniTableField* f) { + return f->presence < 0; +} + +const upb_MiniTableField* upb_MiniTable_GetOneof(const upb_MiniTable* m, + const upb_MiniTableField* f) { + if (UPB_UNLIKELY(!upb_MiniTable_Is_Oneof(f))) { + return NULL; + } + const upb_MiniTableField* ptr = &m->fields[0]; + const upb_MiniTableField* end = &m->fields[m->field_count]; + while (++ptr < end) { + if (ptr->presence == (*f).presence) { + return ptr; + } + } + return NULL; +} + +bool upb_MiniTable_NextOneofField(const upb_MiniTable* m, + const upb_MiniTableField** f) { + const upb_MiniTableField* ptr = *f; + const upb_MiniTableField* end = &m->fields[m->field_count]; + while (++ptr < end) { + if (ptr->presence == (*f)->presence) { + *f = ptr; + return true; + } + } + return false; +} + #include <inttypes.h> #include <stdlib.h>
diff --git a/ruby/ext/google/protobuf_c/ruby-upb.h b/ruby/ext/google/protobuf_c/ruby-upb.h index 7d01e6c..cd703c2 100755 --- a/ruby/ext/google/protobuf_c/ruby-upb.h +++ b/ruby/ext/google/protobuf_c/ruby-upb.h
@@ -2255,6 +2255,26 @@ return mini_table->subs[field->submsg_index].subenum; } +// If this field is in a oneof, returns the first field in the oneof. +// +// Otherwise returns NULL. +// +// Usage: +// const upb_MiniTableField* field = upb_MiniTable_GetOneof(m, f); +// do { +// .. +// } while (upb_MiniTable_NextOneofField(m, &field); +// +const upb_MiniTableField* upb_MiniTable_GetOneof(const upb_MiniTable* m, + const upb_MiniTableField* f); + +// Returns the next field in the oneof. If this is the last field in the +// oneof, returns NULL. The ordering of fields in the oneof is not +// guaranteed. +// REQUIRES: |iter| is and iterator. +bool upb_MiniTable_NextOneofField(const upb_MiniTable* m, + const upb_MiniTableField** f); + #ifdef __cplusplus } /* extern "C" */ #endif @@ -2944,6 +2964,8 @@ // // The unknown data is removed from message after field value is set // using upb_Message_SetMessage. +// +// WARNING!: See b/267655898 upb_UnknownToMessageRet upb_MiniTable_PromoteUnknownToMessage( upb_Message* msg, const upb_MiniTable* mini_table, const upb_MiniTableField* field, const upb_MiniTable* sub_mini_table, @@ -3292,6 +3314,12 @@ extern const upb_MiniTable google_protobuf_GeneratedCodeInfo_Annotation_msg_init; typedef enum { + google_protobuf_FieldDescriptorProto_LABEL_OPTIONAL = 1, + google_protobuf_FieldDescriptorProto_LABEL_REQUIRED = 2, + google_protobuf_FieldDescriptorProto_LABEL_REPEATED = 3 +} google_protobuf_FieldDescriptorProto_Label; + +typedef enum { google_protobuf_FieldDescriptorProto_TYPE_DOUBLE = 1, google_protobuf_FieldDescriptorProto_TYPE_FLOAT = 2, google_protobuf_FieldDescriptorProto_TYPE_INT64 = 3, @@ -3313,18 +3341,6 @@ } google_protobuf_FieldDescriptorProto_Type; typedef enum { - google_protobuf_FieldDescriptorProto_LABEL_OPTIONAL = 1, - google_protobuf_FieldDescriptorProto_LABEL_REQUIRED = 2, - google_protobuf_FieldDescriptorProto_LABEL_REPEATED = 3 -} google_protobuf_FieldDescriptorProto_Label; - -typedef enum { - google_protobuf_FileOptions_SPEED = 1, - google_protobuf_FileOptions_CODE_SIZE = 2, - google_protobuf_FileOptions_LITE_RUNTIME = 3 -} google_protobuf_FileOptions_OptimizeMode; - -typedef enum { google_protobuf_FieldOptions_STRING = 0, google_protobuf_FieldOptions_CORD = 1, google_protobuf_FieldOptions_STRING_PIECE = 2 @@ -3356,10 +3372,10 @@ } google_protobuf_FieldOptions_OptionTargetType; typedef enum { - google_protobuf_MethodOptions_IDEMPOTENCY_UNKNOWN = 0, - google_protobuf_MethodOptions_NO_SIDE_EFFECTS = 1, - google_protobuf_MethodOptions_IDEMPOTENT = 2 -} google_protobuf_MethodOptions_IdempotencyLevel; + google_protobuf_FileOptions_SPEED = 1, + google_protobuf_FileOptions_CODE_SIZE = 2, + google_protobuf_FileOptions_LITE_RUNTIME = 3 +} google_protobuf_FileOptions_OptimizeMode; typedef enum { google_protobuf_GeneratedCodeInfo_Annotation_NONE = 0, @@ -3367,16 +3383,22 @@ google_protobuf_GeneratedCodeInfo_Annotation_ALIAS = 2 } google_protobuf_GeneratedCodeInfo_Annotation_Semantic; +typedef enum { + google_protobuf_MethodOptions_IDEMPOTENCY_UNKNOWN = 0, + google_protobuf_MethodOptions_NO_SIDE_EFFECTS = 1, + google_protobuf_MethodOptions_IDEMPOTENT = 2 +} google_protobuf_MethodOptions_IdempotencyLevel; -extern const upb_MiniTableEnum google_protobuf_FieldDescriptorProto_Type_enum_init; + extern const upb_MiniTableEnum google_protobuf_FieldDescriptorProto_Label_enum_init; -extern const upb_MiniTableEnum google_protobuf_FileOptions_OptimizeMode_enum_init; +extern const upb_MiniTableEnum google_protobuf_FieldDescriptorProto_Type_enum_init; extern const upb_MiniTableEnum google_protobuf_FieldOptions_CType_enum_init; extern const upb_MiniTableEnum google_protobuf_FieldOptions_JSType_enum_init; extern const upb_MiniTableEnum google_protobuf_FieldOptions_OptionRetention_enum_init; extern const upb_MiniTableEnum google_protobuf_FieldOptions_OptionTargetType_enum_init; -extern const upb_MiniTableEnum google_protobuf_MethodOptions_IdempotencyLevel_enum_init; +extern const upb_MiniTableEnum google_protobuf_FileOptions_OptimizeMode_enum_init; extern const upb_MiniTableEnum google_protobuf_GeneratedCodeInfo_Annotation_Semantic_enum_init; +extern const upb_MiniTableEnum google_protobuf_MethodOptions_IdempotencyLevel_enum_init; /* google.protobuf.FileDescriptorSet */