Fix Serialize failing for Proxy/CProxy.
Refactor minitable access.

PiperOrigin-RevId: 542895074
diff --git a/protos/protos.h b/protos/protos.h
index 809e964..2e2fae9 100644
--- a/protos/protos.h
+++ b/protos/protos.h
@@ -199,12 +199,12 @@
 };
 
 template <typename T>
-void* GetInternalMsg(const T& message) {
-  return message.msg();
+void* GetInternalMsg(const T* message) {
+  return message->msg();
 }
 
 template <typename T>
-void* GetInternalMsg(const Ptr<T>& message) {
+void* GetInternalMsg(Ptr<T> message) {
   return message->msg();
 }
 
@@ -214,10 +214,20 @@
 }
 
 template <typename T>
-upb_Arena* GetArena(const Ptr<T>& message) {
+upb_Arena* GetArena(Ptr<T> message) {
   return static_cast<upb_Arena*>(message->GetInternalArena());
 }
 
+template <typename T>
+const upb_MiniTable* GetMiniTable(const T*) {
+  return T::minitable();
+}
+
+template <typename T>
+const upb_MiniTable* GetMiniTable(Ptr<T>) {
+  return T::minitable();
+}
+
 upb_ExtensionRegistry* GetUpbExtensions(
     const ExtensionRegistry& extension_registry);
 
@@ -328,7 +338,7 @@
   if (message_arena != extension_arena) {
     upb_Arena_Fuse(message_arena, extension_arena);
   }
-  msg_ext->data.ptr = ::protos::internal::GetInternalMsg(value);
+  msg_ext->data.ptr = ::protos::internal::GetInternalMsg(&value);
   return absl::OkStatus();
 }
 
@@ -362,7 +372,7 @@
 
 template <typename T>
 bool Parse(T& message, absl::string_view bytes) {
-  upb_Message_Clear(message.msg(), T::minitable());
+  upb_Message_Clear(message.msg(), ::protos::internal::GetMiniTable(&message));
   auto* arena = static_cast<upb_Arena*>(message.GetInternalArena());
   return upb_Decode(bytes.data(), bytes.size(), message.msg(), T::minitable(),
                     /* extreg= */ nullptr, /* options= */ 0,
@@ -372,9 +382,10 @@
 template <typename T>
 bool Parse(T& message, absl::string_view bytes,
            const ::protos::ExtensionRegistry& extension_registry) {
-  upb_Message_Clear(message.msg(), T::minitable());
+  upb_Message_Clear(message.msg(), ::protos::internal::GetMiniTable(message));
   auto* arena = static_cast<upb_Arena*>(message.GetInternalArena());
-  return upb_Decode(bytes.data(), bytes.size(), message.msg(), T::minitable(),
+  return upb_Decode(bytes.data(), bytes.size(), message.msg(),
+                    ::protos::internal::GetMiniTable(message),
                     /* extreg= */
                     ::protos::internal::GetUpbExtensions(extension_registry),
                     /* options= */ 0, arena) == kUpb_DecodeStatus_Ok;
@@ -382,9 +393,10 @@
 
 template <typename T>
 bool Parse(Ptr<T>& message, absl::string_view bytes) {
-  upb_Message_Clear(message->msg(), T::minitable());
+  upb_Message_Clear(message->msg(), ::protos::internal::GetMiniTable(message));
   auto* arena = static_cast<upb_Arena*>(message->GetInternalArena());
-  return upb_Decode(bytes.data(), bytes.size(), message->msg(), T::minitable(),
+  return upb_Decode(bytes.data(), bytes.size(), message->msg(),
+                    ::protos::internal::GetMiniTable(message),
                     /* extreg= */ nullptr, /* options= */ 0,
                     arena) == kUpb_DecodeStatus_Ok;
 }
@@ -392,60 +404,32 @@
 template <typename T>
 bool Parse(Ptr<T>& message, absl::string_view bytes,
            const ::protos::ExtensionRegistry& extension_registry) {
-  upb_Message_Clear(message->msg(), T::minitable());
+  upb_Message_Clear(message->msg(), ::protos::internal::GetMiniTable(message));
   auto* arena = static_cast<upb_Arena*>(message->GetInternalArena());
-  return upb_Decode(bytes.data(), bytes.size(), message->msg(), T::minitable(),
+  return upb_Decode(bytes.data(), bytes.size(), message->msg(),
+                    ::protos::internal::GetMiniTable(message),
                     /* extreg= */
                     ::protos::internal::GetUpbExtensions(extension_registry),
                     /* options= */ 0, arena) == kUpb_DecodeStatus_Ok;
 }
 
 template <typename T>
-bool Parse(std::unique_ptr<T>& message, absl::string_view bytes) {
-  upb_Message_Clear(message->msg(), T::minitable());
+bool Parse(T* message, absl::string_view bytes) {
+  upb_Message_Clear(message->msg(), ::protos::internal::GetMiniTable(message));
   auto* arena = static_cast<upb_Arena*>(message->GetInternalArena());
-  return upb_Decode(bytes.data(), bytes.size(), message->msg(), T::minitable(),
+  return upb_Decode(bytes.data(), bytes.size(), message->msg(),
+                    ::protos::internal::GetMiniTable(message),
                     /* extreg= */ nullptr, /* options= */ 0,
                     arena) == kUpb_DecodeStatus_Ok;
 }
 
 template <typename T>
-bool Parse(std::unique_ptr<T>& message, absl::string_view bytes,
-           const ::protos::ExtensionRegistry& extension_registry) {
-  upb_Message_Clear(message->msg(), T::minitable());
-  auto* arena = static_cast<upb_Arena*>(message->GetInternalArena());
-  return upb_Decode(bytes.data(), bytes.size(), message->msg(), T::minitable(),
-                    /* extreg= */
-                    ::protos::internal::GetUpbExtensions(extension_registry),
-                    /* options= */ 0, arena) == kUpb_DecodeStatus_Ok;
-}
-
-template <typename T>
-bool Parse(std::shared_ptr<T>& message, absl::string_view bytes) {
-  upb_Message_Clear(message->msg(), T::minitable());
-  auto* arena = static_cast<upb_Arena*>(message->GetInternalArena());
-  return upb_Decode(bytes.data(), bytes.size(), message->msg(), T::minitable(),
-                    /* extreg= */ nullptr, /* options= */ 0,
-                    arena) == kUpb_DecodeStatus_Ok;
-}
-
-template <typename T>
-bool Parse(std::shared_ptr<T>& message, absl::string_view bytes,
-           const ::protos::ExtensionRegistry& extension_registry) {
-  upb_Message_Clear(message->msg(), T::minitable());
-  auto* arena = static_cast<upb_Arena*>(message->GetInternalArena());
-  return upb_Decode(bytes.data(), bytes.size(), message->msg(), T::minitable(),
-                    /* extreg= */
-                    ::protos::internal::GetUpbExtensions(extension_registry),
-                    /* options= */ 0, arena) == kUpb_DecodeStatus_Ok;
-}
-
-template <typename T>
 absl::StatusOr<T> Parse(absl::string_view bytes, int options = 0) {
   T message;
   auto* arena = static_cast<upb_Arena*>(message.GetInternalArena());
   upb_DecodeStatus status =
-      upb_Decode(bytes.data(), bytes.size(), message.msg(), T::minitable(),
+      upb_Decode(bytes.data(), bytes.size(), message.msg(),
+                 ::protos::internal::GetMiniTable(&message),
                  /* extreg= */ nullptr, /* options= */ 0, arena);
   if (status == kUpb_DecodeStatus_Ok) {
     return message;
@@ -460,7 +444,8 @@
   T message;
   auto* arena = static_cast<upb_Arena*>(message.GetInternalArena());
   upb_DecodeStatus status =
-      upb_Decode(bytes.data(), bytes.size(), message.msg(), T::minitable(),
+      upb_Decode(bytes.data(), bytes.size(), message.msg(),
+                 ::protos::internal::GetMiniTable(&message),
                  ::protos::internal::GetUpbExtensions(extension_registry),
                  /* options= */ 0, arena);
   if (status == kUpb_DecodeStatus_Ok) {
@@ -470,34 +455,19 @@
 }
 
 template <typename T>
-absl::StatusOr<absl::string_view> Serialize(const T& message, upb::Arena& arena,
+absl::StatusOr<absl::string_view> Serialize(const T* message, upb::Arena& arena,
                                             int options = 0) {
   return ::protos::internal::Serialize(
-      ::protos::internal::GetInternalMsg(message), T::minitable(), arena.ptr(),
+      message->msg(), ::protos::internal::GetMiniTable(message), arena.ptr(),
       options);
 }
 
 template <typename T>
-absl::StatusOr<absl::string_view> Serialize(std::unique_ptr<T>& message,
-                                            upb::Arena& arena,
-                                            int options = 0) {
-  return ::protos::internal::Serialize(message->msg(), T::minitable(),
-                                       arena.ptr(), options);
-}
-
-template <typename T>
-absl::StatusOr<absl::string_view> Serialize(std::shared_ptr<T>& message,
-                                            upb::Arena& arena,
-                                            int options = 0) {
-  return ::protos::internal::Serialize(message->msg(), T::minitable(),
-                                       arena.ptr(), options);
-}
-
-template <typename T>
 absl::StatusOr<absl::string_view> Serialize(Ptr<T> message, upb::Arena& arena,
                                             int options = 0) {
-  return ::protos::internal::Serialize(message->msg(), T::minitable(),
-                                       arena.ptr(), options);
+  return ::protos::internal::Serialize(
+      message->msg(), ::protos::internal::GetMiniTable(message), arena.ptr(),
+      options);
 }
 
 }  // namespace protos
diff --git a/protos/repeated_field.h b/protos/repeated_field.h
index a040e50..3bdb20d 100644
--- a/protos/repeated_field.h
+++ b/protos/repeated_field.h
@@ -145,8 +145,8 @@
             typename = std::enable_if_t<b>>
   void push_back(const T& t) {
     upb_MessageValue message_value;
-    message_value.msg_val =
-        upb_Message_DeepClone(GetInternalMsg(t), T::minitable(), this->arena_);
+    message_value.msg_val = upb_Message_DeepClone(
+        GetInternalMsg(&t), ::protos::internal::GetMiniTable(&t), this->arena_);
     upb_Array_Append(this->arr_, message_value, this->arena_);
   }
 
@@ -155,7 +155,7 @@
             typename = std::enable_if_t<b>>
   void push_back(T&& msg) {
     upb_MessageValue message_value;
-    message_value.msg_val = GetInternalMsg(msg);
+    message_value.msg_val = GetInternalMsg(&msg);
     upb_Arena_Fuse(GetArena(msg), this->arena_);
     upb_Array_Append(this->arr_, message_value, this->arena_);
     T moved_msg = std::move(msg);