From 5b549977a970fc77441c24016ef0c6ec5cf3c631 Mon Sep 17 00:00:00 2001 From: Jie Luo Date: Fri, 15 Sep 2023 11:31:23 -0700 Subject: [PATCH 1/2] On demand create message meta class for upb python PiperOrigin-RevId: 565733360 --- .../protobuf/internal/factory_test1.proto | 1 + .../protobuf/internal/message_factory_test.py | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/python/google/protobuf/internal/factory_test1.proto b/python/google/protobuf/internal/factory_test1.proto index 5e729f5b08..a18efcea74 100644 --- a/python/google/protobuf/internal/factory_test1.proto +++ b/python/google/protobuf/internal/factory_test1.proto @@ -52,6 +52,7 @@ message Factory1Message { optional NestedFactory1Message nested_factory_1_message = 3; optional int32 scalar_value = 4; repeated string list_value = 5; + map map_field = 6; extensions 1000 to max; } diff --git a/python/google/protobuf/internal/message_factory_test.py b/python/google/protobuf/internal/message_factory_test.py index 0d132828bd..7138b98202 100644 --- a/python/google/protobuf/internal/message_factory_test.py +++ b/python/google/protobuf/internal/message_factory_test.py @@ -33,6 +33,7 @@ __author__ = 'matthewtoia@google.com (Matt Toia)' import unittest +import gc from google.protobuf import descriptor_pb2 from google.protobuf.internal import api_implementation @@ -285,5 +286,29 @@ class MessageFactoryTest(unittest.TestCase): self.assertEqual(345, m.Extensions[ext2].setting) + def testOndemandCreateMetaClass(self): + def loadFile(): + f = descriptor_pb2.FileDescriptorProto.FromString( + factory_test1_pb2.DESCRIPTOR.serialized_pb) + return message_factory.GetMessages([f]) + + messages = loadFile() + data = factory_test1_pb2.Factory1Message() + data.map_field['hello'] = 'welcome' + # Force GC to collect. UPB python will clean up the map entry class. + # cpp extension and pure python will still keep the map entry class. + gc.collect() + message = messages['google.protobuf.python.internal.Factory1Message']() + message.ParseFromString(data.SerializeToString()) + value = message.map_field + values = [ + # The entry class will be created on demand in upb python. + value.GetEntryClass()(key=k, value=value[k]) for k in sorted(value) + ] + gc.collect() + self.assertEqual(1, len(values)) + self.assertEqual('hello', values[0].key) + self.assertEqual('welcome', values[0].value) + if __name__ == '__main__': unittest.main() From 953aec63e6a5c375e5178c607a520d8ca0b282e4 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Tue, 17 Oct 2023 09:47:40 -0700 Subject: [PATCH 2/2] Updated upb dep. --- protobuf_deps.bzl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/protobuf_deps.bzl b/protobuf_deps.bzl index 37cef50a26..554971616d 100644 --- a/protobuf_deps.bzl +++ b/protobuf_deps.bzl @@ -151,7 +151,7 @@ def protobuf_deps(): _github_archive( name = "upb", repo = "https://github.com/protocolbuffers/upb", - commit = "455cfdb8ae60a1763e6d924e36851c6897a781bb", - sha256 = "2c8b4e961c38fcc7c58e8aca807cc3cc5190f42afdf39551ce49812b130493de", + commit = "5afd8ccb253d408483782ec19f0090a82d10ba1d", + sha256 = "0e3ce017e0636023fe9cd67c6fb513dfd534bad5d43b3a16a9141c3b58822435", patches = ["@com_google_protobuf//build_defs:upb.patch"], )