diff --git a/php/ext/google/protobuf/php-upb.c b/php/ext/google/protobuf/php-upb.c index 89625d7645..053cc5e6ae 100644 --- a/php/ext/google/protobuf/php-upb.c +++ b/php/ext/google/protobuf/php-upb.c @@ -14713,20 +14713,35 @@ const UPB_DESC(FeatureSet*) size_t n; const UPB_DESC(FeatureSetDefaults_FeatureSetEditionDefault)* const* d = UPB_DESC(FeatureSetDefaults_defaults)(defaults, &n); - const UPB_DESC(FeatureSet)* ret = NULL; + const UPB_DESC(FeatureSetDefaults_FeatureSetEditionDefault)* result = NULL; for (size_t i = 0; i < n; i++) { if (UPB_DESC(FeatureSetDefaults_FeatureSetEditionDefault_edition)(d[i]) > edition) { break; } - ret = UPB_DESC(FeatureSetDefaults_FeatureSetEditionDefault_features)(d[i]); + result = d[i]; } - if (ret == NULL) { + if (result == NULL) { _upb_DefBuilder_Errf(ctx, "No valid default found for edition %s", upb_FileDef_EditionName(edition)); return NULL; } - return ret; + + // Merge the fixed and overridable features to get the edition's default + // feature set. + const UPB_DESC(FeatureSet)* fixed = UPB_DESC( + FeatureSetDefaults_FeatureSetEditionDefault_fixed_features)(result); + const UPB_DESC(FeatureSet)* overridable = UPB_DESC( + FeatureSetDefaults_FeatureSetEditionDefault_overridable_features)(result); + if (!fixed && !overridable) { + _upb_DefBuilder_Errf(ctx, "No valid default found for edition %s", + upb_FileDef_EditionName(edition)); + return NULL; + } else if (!fixed) { + return overridable; + } + return _upb_DefBuilder_DoResolveFeatures(ctx, fixed, overridable, + /*is_implicit=*/true); } // Allocate and initialize one file def, and add it to the context object. diff --git a/ruby/ext/google/protobuf_c/ruby-upb.c b/ruby/ext/google/protobuf_c/ruby-upb.c index b0e40d8b78..04fd8120aa 100644 --- a/ruby/ext/google/protobuf_c/ruby-upb.c +++ b/ruby/ext/google/protobuf_c/ruby-upb.c @@ -14204,20 +14204,35 @@ const UPB_DESC(FeatureSet*) size_t n; const UPB_DESC(FeatureSetDefaults_FeatureSetEditionDefault)* const* d = UPB_DESC(FeatureSetDefaults_defaults)(defaults, &n); - const UPB_DESC(FeatureSet)* ret = NULL; + const UPB_DESC(FeatureSetDefaults_FeatureSetEditionDefault)* result = NULL; for (size_t i = 0; i < n; i++) { if (UPB_DESC(FeatureSetDefaults_FeatureSetEditionDefault_edition)(d[i]) > edition) { break; } - ret = UPB_DESC(FeatureSetDefaults_FeatureSetEditionDefault_features)(d[i]); + result = d[i]; } - if (ret == NULL) { + if (result == NULL) { _upb_DefBuilder_Errf(ctx, "No valid default found for edition %s", upb_FileDef_EditionName(edition)); return NULL; } - return ret; + + // Merge the fixed and overridable features to get the edition's default + // feature set. + const UPB_DESC(FeatureSet)* fixed = UPB_DESC( + FeatureSetDefaults_FeatureSetEditionDefault_fixed_features)(result); + const UPB_DESC(FeatureSet)* overridable = UPB_DESC( + FeatureSetDefaults_FeatureSetEditionDefault_overridable_features)(result); + if (!fixed && !overridable) { + _upb_DefBuilder_Errf(ctx, "No valid default found for edition %s", + upb_FileDef_EditionName(edition)); + return NULL; + } else if (!fixed) { + return overridable; + } + return _upb_DefBuilder_DoResolveFeatures(ctx, fixed, overridable, + /*is_implicit=*/true); } // Allocate and initialize one file def, and add it to the context object.