Skip to content

Commit e3699ac

Browse files
Auto-generate files after cl/848335540
1 parent 674e830 commit e3699ac

File tree

4 files changed

+106
-60
lines changed

4 files changed

+106
-60
lines changed

php/ext/google/protobuf/php-upb.c

Lines changed: 53 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12276,16 +12276,16 @@ const upb_EnumValueDef* upb_EnumDef_Value(const upb_EnumDef* e, int i) {
1227612276
return _upb_EnumValueDef_At(e->values, i);
1227712277
}
1227812278

12279+
static bool upb_EnumDef_IsSpecifiedAsClosed(const upb_EnumDef* e) {
12280+
return UPB_DESC(FeatureSet_enum_type)(e->resolved_features) ==
12281+
UPB_DESC(FeatureSet_CLOSED);
12282+
}
12283+
1227912284
bool upb_EnumDef_IsClosed(const upb_EnumDef* e) {
1228012285
if (UPB_TREAT_CLOSED_ENUMS_LIKE_OPEN) return false;
1228112286
return upb_EnumDef_IsSpecifiedAsClosed(e);
1228212287
}
1228312288

12284-
bool upb_EnumDef_IsSpecifiedAsClosed(const upb_EnumDef* e) {
12285-
return UPB_DESC(FeatureSet_enum_type)(e->resolved_features) ==
12286-
UPB_DESC(FeatureSet_CLOSED);
12287-
}
12288-
1228912289
bool upb_EnumDef_MiniDescriptorEncode(const upb_EnumDef* e, upb_Arena* a,
1229012290
upb_StringView* out) {
1229112291
upb_DescState s;
@@ -12376,22 +12376,36 @@ static void create_enumdef(upb_DefBuilder* ctx, const char* prefix,
1237612376

1237712377
values = UPB_DESC(EnumDescriptorProto_value)(enum_proto, &n_value);
1237812378

12379+
if (n_value == 0) {
12380+
_upb_DefBuilder_Errf(ctx, "enums must contain at least one value (%s)",
12381+
e->full_name);
12382+
}
12383+
12384+
e->defaultval = UPB_DESC(EnumValueDescriptorProto_number)(values[0]);
12385+
12386+
// When the special UPB_TREAT_CLOSED_ENUMS_LIKE_OPEN is enabled, we have to
12387+
// exempt closed enums from this check, even when we are treating them as
12388+
// open.
12389+
//
12390+
// We rely on the fact that the proto compiler will have already ensured that
12391+
// implicit presence fields do not use closed enums, even if we are treating
12392+
// them as open.
12393+
if (!upb_EnumDef_IsSpecifiedAsClosed(e) && e->defaultval != 0) {
12394+
_upb_DefBuilder_Errf(ctx,
12395+
"for open enums, the first value must be zero (%s)",
12396+
upb_EnumDef_FullName(e));
12397+
}
12398+
1237912399
bool ok = upb_strtable_init(&e->ntoi, n_value, ctx->arena);
1238012400
if (!ok) _upb_DefBuilder_OomErr(ctx);
1238112401

1238212402
ok = upb_inttable_init(&e->iton, ctx->arena);
1238312403
if (!ok) _upb_DefBuilder_OomErr(ctx);
1238412404

12385-
e->defaultval = 0;
1238612405
e->value_count = n_value;
1238712406
e->values = _upb_EnumValueDefs_New(ctx, prefix, n_value, values,
1238812407
e->resolved_features, e, &e->is_sorted);
1238912408

12390-
if (n_value == 0) {
12391-
_upb_DefBuilder_Errf(ctx, "enums must contain at least one value (%s)",
12392-
e->full_name);
12393-
}
12394-
1239512409
res_ranges =
1239612410
UPB_DESC(EnumDescriptorProto_reserved_range)(enum_proto, &n_res_range);
1239712411
e->res_range_count = n_res_range;
@@ -12586,18 +12600,6 @@ static void create_enumvaldef(upb_DefBuilder* ctx, const char* prefix,
1258612600
if (!ok) _upb_DefBuilder_OomErr(ctx);
1258712601
}
1258812602

12589-
static void _upb_EnumValueDef_CheckZeroValue(upb_DefBuilder* ctx,
12590-
const upb_EnumDef* e,
12591-
const upb_EnumValueDef* v, int n) {
12592-
// When the special UPB_TREAT_CLOSED_ENUMS_LIKE_OPEN is enabled, we have to
12593-
// exempt closed enums from this check, even when we are treating them as
12594-
// open.
12595-
if (upb_EnumDef_IsSpecifiedAsClosed(e) || n == 0 || v[0].number == 0) return;
12596-
12597-
_upb_DefBuilder_Errf(ctx, "for open enums, the first value must be zero (%s)",
12598-
upb_EnumDef_FullName(e));
12599-
}
12600-
1260112603
// Allocate and initialize an array of |n| enum value defs owned by |e|.
1260212604
upb_EnumValueDef* _upb_EnumValueDefs_New(
1260312605
upb_DefBuilder* ctx, const char* prefix, int n,
@@ -12618,8 +12620,6 @@ upb_EnumValueDef* _upb_EnumValueDefs_New(
1261812620
previous = current;
1261912621
}
1262012622

12621-
_upb_EnumValueDef_CheckZeroValue(ctx, e, v, n);
12622-
1262312623
return v;
1262412624
}
1262512625

@@ -13190,7 +13190,8 @@ static void parse_default(upb_DefBuilder* ctx, const char* str, size_t len,
1319013190
(int)upb_FieldDef_Type(f));
1319113191
}
1319213192

13193-
static void set_default_default(upb_DefBuilder* ctx, upb_FieldDef* f) {
13193+
static void set_default_default(upb_DefBuilder* ctx, upb_FieldDef* f,
13194+
bool must_be_empty) {
1319413195
switch (upb_FieldDef_CType(f)) {
1319513196
case kUpb_CType_Int32:
1319613197
case kUpb_CType_Int64:
@@ -13212,8 +13213,14 @@ static void set_default_default(upb_DefBuilder* ctx, upb_FieldDef* f) {
1321213213
f->defaultval.boolean = false;
1321313214
break;
1321413215
case kUpb_CType_Enum: {
13215-
const upb_EnumValueDef* v = upb_EnumDef_Value(f->sub.enumdef, 0);
13216-
f->defaultval.sint = upb_EnumValueDef_Number(v);
13216+
f->defaultval.sint = upb_EnumDef_Default(f->sub.enumdef);
13217+
if (must_be_empty && f->defaultval.sint != 0) {
13218+
_upb_DefBuilder_Errf(ctx,
13219+
"Implicit presence field (%s) cannot use an enum "
13220+
"type with a non-zero default (%s)",
13221+
f->full_name,
13222+
upb_EnumDef_FullName(f->sub.enumdef));
13223+
}
1321713224
break;
1321813225
}
1321913226
case kUpb_CType_Message:
@@ -13641,12 +13648,29 @@ void _upb_FieldDef_BuildMiniTableExtension(upb_DefBuilder* ctx,
1364113648
static void resolve_default(upb_DefBuilder* ctx, upb_FieldDef* f,
1364213649
const UPB_DESC(FieldDescriptorProto) *
1364313650
field_proto) {
13651+
// Implicit presence fields should always have an effective default of 0.
13652+
// This should naturally fall out of the validations that protoc performs:
13653+
// - Implicit presence fields cannot specify a default value.
13654+
// - Implicit presence fields for for enums can only use open enums, which
13655+
// are required to have zero as their default.
13656+
// - Even if we are treating all enums as open, the proto compiler will
13657+
// still reject using a nominally closed enum with an implicit presence
13658+
// field.
13659+
bool must_be_empty = !f->has_presence && !upb_FieldDef_IsRepeated(f);
13660+
1364413661
// Have to delay resolving of the default value until now because of the enum
1364513662
// case, since enum defaults are specified with a label.
1364613663
if (UPB_DESC(FieldDescriptorProto_has_default_value)(field_proto)) {
1364713664
upb_StringView defaultval =
1364813665
UPB_DESC(FieldDescriptorProto_default_value)(field_proto);
1364913666

13667+
if (must_be_empty) {
13668+
_upb_DefBuilder_Errf(ctx,
13669+
"fields with implicit presence cannot have "
13670+
"explicit defaults (%s)",
13671+
f->full_name);
13672+
}
13673+
1365013674
if (upb_FileDef_Syntax(f->file) == kUpb_Syntax_Proto3) {
1365113675
_upb_DefBuilder_Errf(ctx,
1365213676
"proto3 fields cannot have explicit defaults (%s)",
@@ -13662,7 +13686,7 @@ static void resolve_default(upb_DefBuilder* ctx, upb_FieldDef* f,
1366213686
parse_default(ctx, defaultval.data, defaultval.size, f);
1366313687
f->has_default = true;
1366413688
} else {
13665-
set_default_default(ctx, f);
13689+
set_default_default(ctx, f, must_be_empty);
1366613690
f->has_default = false;
1366713691
}
1366813692
}

php/ext/google/protobuf/php-upb.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14223,7 +14223,6 @@ UPB_API const upb_EnumValueDef* upb_EnumDef_FindValueByNumber(
1422314223
UPB_API const char* upb_EnumDef_FullName(const upb_EnumDef* e);
1422414224
bool upb_EnumDef_HasOptions(const upb_EnumDef* e);
1422514225
bool upb_EnumDef_IsClosed(const upb_EnumDef* e);
14226-
bool upb_EnumDef_IsSpecifiedAsClosed(const upb_EnumDef* e);
1422714226

1422814227
// Creates a mini descriptor string for an enum, returns true on success.
1422914228
bool upb_EnumDef_MiniDescriptorEncode(const upb_EnumDef* e, upb_Arena* a,

ruby/ext/google/protobuf_c/ruby-upb.c

Lines changed: 53 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11132,16 +11132,16 @@ const upb_EnumValueDef* upb_EnumDef_Value(const upb_EnumDef* e, int i) {
1113211132
return _upb_EnumValueDef_At(e->values, i);
1113311133
}
1113411134

11135+
static bool upb_EnumDef_IsSpecifiedAsClosed(const upb_EnumDef* e) {
11136+
return UPB_DESC(FeatureSet_enum_type)(e->resolved_features) ==
11137+
UPB_DESC(FeatureSet_CLOSED);
11138+
}
11139+
1113511140
bool upb_EnumDef_IsClosed(const upb_EnumDef* e) {
1113611141
if (UPB_TREAT_CLOSED_ENUMS_LIKE_OPEN) return false;
1113711142
return upb_EnumDef_IsSpecifiedAsClosed(e);
1113811143
}
1113911144

11140-
bool upb_EnumDef_IsSpecifiedAsClosed(const upb_EnumDef* e) {
11141-
return UPB_DESC(FeatureSet_enum_type)(e->resolved_features) ==
11142-
UPB_DESC(FeatureSet_CLOSED);
11143-
}
11144-
1114511145
bool upb_EnumDef_MiniDescriptorEncode(const upb_EnumDef* e, upb_Arena* a,
1114611146
upb_StringView* out) {
1114711147
upb_DescState s;
@@ -11232,22 +11232,36 @@ static void create_enumdef(upb_DefBuilder* ctx, const char* prefix,
1123211232

1123311233
values = UPB_DESC(EnumDescriptorProto_value)(enum_proto, &n_value);
1123411234

11235+
if (n_value == 0) {
11236+
_upb_DefBuilder_Errf(ctx, "enums must contain at least one value (%s)",
11237+
e->full_name);
11238+
}
11239+
11240+
e->defaultval = UPB_DESC(EnumValueDescriptorProto_number)(values[0]);
11241+
11242+
// When the special UPB_TREAT_CLOSED_ENUMS_LIKE_OPEN is enabled, we have to
11243+
// exempt closed enums from this check, even when we are treating them as
11244+
// open.
11245+
//
11246+
// We rely on the fact that the proto compiler will have already ensured that
11247+
// implicit presence fields do not use closed enums, even if we are treating
11248+
// them as open.
11249+
if (!upb_EnumDef_IsSpecifiedAsClosed(e) && e->defaultval != 0) {
11250+
_upb_DefBuilder_Errf(ctx,
11251+
"for open enums, the first value must be zero (%s)",
11252+
upb_EnumDef_FullName(e));
11253+
}
11254+
1123511255
bool ok = upb_strtable_init(&e->ntoi, n_value, ctx->arena);
1123611256
if (!ok) _upb_DefBuilder_OomErr(ctx);
1123711257

1123811258
ok = upb_inttable_init(&e->iton, ctx->arena);
1123911259
if (!ok) _upb_DefBuilder_OomErr(ctx);
1124011260

11241-
e->defaultval = 0;
1124211261
e->value_count = n_value;
1124311262
e->values = _upb_EnumValueDefs_New(ctx, prefix, n_value, values,
1124411263
e->resolved_features, e, &e->is_sorted);
1124511264

11246-
if (n_value == 0) {
11247-
_upb_DefBuilder_Errf(ctx, "enums must contain at least one value (%s)",
11248-
e->full_name);
11249-
}
11250-
1125111265
res_ranges =
1125211266
UPB_DESC(EnumDescriptorProto_reserved_range)(enum_proto, &n_res_range);
1125311267
e->res_range_count = n_res_range;
@@ -11442,18 +11456,6 @@ static void create_enumvaldef(upb_DefBuilder* ctx, const char* prefix,
1144211456
if (!ok) _upb_DefBuilder_OomErr(ctx);
1144311457
}
1144411458

11445-
static void _upb_EnumValueDef_CheckZeroValue(upb_DefBuilder* ctx,
11446-
const upb_EnumDef* e,
11447-
const upb_EnumValueDef* v, int n) {
11448-
// When the special UPB_TREAT_CLOSED_ENUMS_LIKE_OPEN is enabled, we have to
11449-
// exempt closed enums from this check, even when we are treating them as
11450-
// open.
11451-
if (upb_EnumDef_IsSpecifiedAsClosed(e) || n == 0 || v[0].number == 0) return;
11452-
11453-
_upb_DefBuilder_Errf(ctx, "for open enums, the first value must be zero (%s)",
11454-
upb_EnumDef_FullName(e));
11455-
}
11456-
1145711459
// Allocate and initialize an array of |n| enum value defs owned by |e|.
1145811460
upb_EnumValueDef* _upb_EnumValueDefs_New(
1145911461
upb_DefBuilder* ctx, const char* prefix, int n,
@@ -11474,8 +11476,6 @@ upb_EnumValueDef* _upb_EnumValueDefs_New(
1147411476
previous = current;
1147511477
}
1147611478

11477-
_upb_EnumValueDef_CheckZeroValue(ctx, e, v, n);
11478-
1147911479
return v;
1148011480
}
1148111481

@@ -12046,7 +12046,8 @@ static void parse_default(upb_DefBuilder* ctx, const char* str, size_t len,
1204612046
(int)upb_FieldDef_Type(f));
1204712047
}
1204812048

12049-
static void set_default_default(upb_DefBuilder* ctx, upb_FieldDef* f) {
12049+
static void set_default_default(upb_DefBuilder* ctx, upb_FieldDef* f,
12050+
bool must_be_empty) {
1205012051
switch (upb_FieldDef_CType(f)) {
1205112052
case kUpb_CType_Int32:
1205212053
case kUpb_CType_Int64:
@@ -12068,8 +12069,14 @@ static void set_default_default(upb_DefBuilder* ctx, upb_FieldDef* f) {
1206812069
f->defaultval.boolean = false;
1206912070
break;
1207012071
case kUpb_CType_Enum: {
12071-
const upb_EnumValueDef* v = upb_EnumDef_Value(f->sub.enumdef, 0);
12072-
f->defaultval.sint = upb_EnumValueDef_Number(v);
12072+
f->defaultval.sint = upb_EnumDef_Default(f->sub.enumdef);
12073+
if (must_be_empty && f->defaultval.sint != 0) {
12074+
_upb_DefBuilder_Errf(ctx,
12075+
"Implicit presence field (%s) cannot use an enum "
12076+
"type with a non-zero default (%s)",
12077+
f->full_name,
12078+
upb_EnumDef_FullName(f->sub.enumdef));
12079+
}
1207312080
break;
1207412081
}
1207512082
case kUpb_CType_Message:
@@ -12497,12 +12504,29 @@ void _upb_FieldDef_BuildMiniTableExtension(upb_DefBuilder* ctx,
1249712504
static void resolve_default(upb_DefBuilder* ctx, upb_FieldDef* f,
1249812505
const UPB_DESC(FieldDescriptorProto) *
1249912506
field_proto) {
12507+
// Implicit presence fields should always have an effective default of 0.
12508+
// This should naturally fall out of the validations that protoc performs:
12509+
// - Implicit presence fields cannot specify a default value.
12510+
// - Implicit presence fields for for enums can only use open enums, which
12511+
// are required to have zero as their default.
12512+
// - Even if we are treating all enums as open, the proto compiler will
12513+
// still reject using a nominally closed enum with an implicit presence
12514+
// field.
12515+
bool must_be_empty = !f->has_presence && !upb_FieldDef_IsRepeated(f);
12516+
1250012517
// Have to delay resolving of the default value until now because of the enum
1250112518
// case, since enum defaults are specified with a label.
1250212519
if (UPB_DESC(FieldDescriptorProto_has_default_value)(field_proto)) {
1250312520
upb_StringView defaultval =
1250412521
UPB_DESC(FieldDescriptorProto_default_value)(field_proto);
1250512522

12523+
if (must_be_empty) {
12524+
_upb_DefBuilder_Errf(ctx,
12525+
"fields with implicit presence cannot have "
12526+
"explicit defaults (%s)",
12527+
f->full_name);
12528+
}
12529+
1250612530
if (upb_FileDef_Syntax(f->file) == kUpb_Syntax_Proto3) {
1250712531
_upb_DefBuilder_Errf(ctx,
1250812532
"proto3 fields cannot have explicit defaults (%s)",
@@ -12518,7 +12542,7 @@ static void resolve_default(upb_DefBuilder* ctx, upb_FieldDef* f,
1251812542
parse_default(ctx, defaultval.data, defaultval.size, f);
1251912543
f->has_default = true;
1252012544
} else {
12521-
set_default_default(ctx, f);
12545+
set_default_default(ctx, f, must_be_empty);
1252212546
f->has_default = false;
1252312547
}
1252412548
}

ruby/ext/google/protobuf_c/ruby-upb.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14262,7 +14262,6 @@ UPB_API const upb_EnumValueDef* upb_EnumDef_FindValueByNumber(
1426214262
UPB_API const char* upb_EnumDef_FullName(const upb_EnumDef* e);
1426314263
bool upb_EnumDef_HasOptions(const upb_EnumDef* e);
1426414264
bool upb_EnumDef_IsClosed(const upb_EnumDef* e);
14265-
bool upb_EnumDef_IsSpecifiedAsClosed(const upb_EnumDef* e);
1426614265

1426714266
// Creates a mini descriptor string for an enum, returns true on success.
1426814267
bool upb_EnumDef_MiniDescriptorEncode(const upb_EnumDef* e, upb_Arena* a,

0 commit comments

Comments
 (0)