Support non-canonical extensions in Python upb unknown fields. PiperOrigin-RevId: 970866648
diff --git a/python/BUILD.bazel b/python/BUILD.bazel index 20b73d0..4bc0695 100644 --- a/python/BUILD.bazel +++ b/python/BUILD.bazel
@@ -124,6 +124,7 @@ "//upb/message", "//upb/message:compare", "//upb/message:copy", + "//upb/message:message_unknowns", "//upb/mini_table", "//upb/port", "//upb/reflection", @@ -131,6 +132,7 @@ "//upb/util:def_to_proto", "//upb/util:required_fields", "//upb/wire", + "//upb/wire:encode_extension", "//upb/wire:eps_copy_input_stream", "//upb/wire:reader", "@abseil-cpp//absl/base:core_headers",
diff --git a/python/unknown_fields.c b/python/unknown_fields.c index 4739472..5c90f6d 100644 --- a/python/unknown_fields.c +++ b/python/unknown_fields.c
@@ -13,7 +13,9 @@ #include "python/message.h" #include "python/protobuf.h" #include "upb/base/string_view.h" +#include "upb/mem/arena.h" #include "upb/message/message.h" +#include "upb/message/unknown_fields.h" #include "upb/reflection/def.h" #include "upb/wire/eps_copy_input_stream.h" #include "upb/wire/reader.h" @@ -266,7 +268,8 @@ uintptr_t iter = kUpb_Message_UnknownBegin; upb_StringView view; - while (upb_Message_NextUnknown(msg, &view, &iter)) { + upb_Arena* upb_arena = NULL; + while (upb_Message_NextWireFormatUnknown(msg, &upb_arena, &view, &iter)) { const char* ptr = view.data; upb_EpsCopyInputStream stream; upb_EpsCopyInputStream_Init(&stream, &ptr, view.size); @@ -280,11 +283,13 @@ } if (!ok) { + if (upb_arena) upb_Arena_Free(upb_arena); Py_DECREF(&self->ob_base); return NULL; } } + if (upb_arena) upb_Arena_Free(upb_arena); return &self->ob_base; }