Fixed some corner cases around empty packages in upb.

1. upb now tolerates a present-but-empty package name in a `FileDescriptorProto`.
2. upb now always returns a non-NULL string for `upb_FileDef_Package()`.  If the package was empty or missing, the returned string is zero-length.  This better matches the proto2 behavior: `proto2::FileDescriptor::package()` always returns a package string, which may be empty.

PiperOrigin-RevId: 460831797
pull/13171/head
Joshua Haberman 3 years ago committed by Copybara-Service
parent 17b6451684
commit b0ed763a41
  1. 2
      python/descriptor.c
  2. 8
      upb/def.c

@ -1105,7 +1105,7 @@ static const void* PyUpb_FileDescriptor_NestedLookup(
PyUpb_FileDescriptor_LookupFunc* func) {
const upb_DefPool* symtab = upb_FileDef_Pool(filedef);
const char* package = upb_FileDef_Package(filedef);
if (package) {
if (strlen(package)) {
PyObject* qname = PyUnicode_FromFormat("%s.%s", package, name);
const void* ret = func(symtab, PyUnicode_AsUTF8AndSize(qname, NULL));
Py_DECREF(qname);

@ -927,7 +927,9 @@ bool upb_FileDef_HasOptions(const upb_FileDef* f) {
const char* upb_FileDef_Name(const upb_FileDef* f) { return f->name; }
const char* upb_FileDef_Package(const upb_FileDef* f) { return f->package; }
const char* upb_FileDef_Package(const upb_FileDef* f) {
return f->package ? f->package : "";
}
upb_Syntax upb_FileDef_Syntax(const upb_FileDef* f) { return f->syntax; }
@ -2897,8 +2899,8 @@ static void build_filedef(
file->name = strviewdup(ctx, google_protobuf_FileDescriptorProto_name(file_proto));
if (google_protobuf_FileDescriptorProto_has_package(file_proto)) {
upb_StringView package = google_protobuf_FileDescriptorProto_package(file_proto);
upb_StringView package = google_protobuf_FileDescriptorProto_package(file_proto);
if (package.size) {
check_ident(ctx, package, true);
file->package = strviewdup(ctx, package);
} else {

Loading…
Cancel
Save