Internal change

PiperOrigin-RevId: 811418305
diff --git a/rust/cpp_kernel/BUILD b/rust/cpp_kernel/BUILD
index 16fbb46..d007309 100644
--- a/rust/cpp_kernel/BUILD
+++ b/rust/cpp_kernel/BUILD
@@ -32,6 +32,7 @@
         "@abseil-cpp//absl/functional:overload",
         "@abseil-cpp//absl/log:absl_check",
         "@abseil-cpp//absl/log:absl_log",
+        "@abseil-cpp//absl/memory",
         "@abseil-cpp//absl/strings:string_view",
     ],
 )
diff --git a/rust/cpp_kernel/map.cc b/rust/cpp_kernel/map.cc
index 92151b9..f53c372 100644
--- a/rust/cpp_kernel/map.cc
+++ b/rust/cpp_kernel/map.cc
@@ -2,12 +2,14 @@
 
 #include <cstddef>
 #include <cstdint>
+#include <memory>
 #include <string>
 #include <type_traits>
 #include <utility>
 
 #include "absl/functional/overload.h"
 #include "absl/log/absl_log.h"
+#include "absl/memory/memory.h"
 #include "absl/strings/string_view.h"
 #include "google/protobuf/message.h"
 #include "google/protobuf/message_lite.h"
@@ -56,18 +58,25 @@
 
 absl::string_view AsViewType(PtrAndLen key) { return key.AsStringView(); }
 
-void InitializeMessageValue(void* raw_ptr, MessageLite* msg) {
-  MessageLite* new_msg = internal::RustMapHelper::PlacementNew(msg, raw_ptr);
-  auto* full_msg = DynamicCastMessage<Message>(new_msg);
+constexpr bool kHasFullRuntime = true;
 
+void InitializeMessageValue(void* raw_ptr,
+                            std::unique_ptr<MessageLite> prototype) {
+  MessageLite* new_msg =
+      internal::RustMapHelper::PlacementNew(prototype.get(), raw_ptr);
   // If we are working with a full (non-lite) proto, we reflectively swap the
   // value into place. Otherwise, we have to perform a copy.
-  if (full_msg != nullptr) {
-    full_msg->GetReflection()->Swap(full_msg, DynamicCastMessage<Message>(msg));
+  if constexpr (kHasFullRuntime) {
+    auto* full_msg = DynamicCastMessage<Message>(new_msg);
+    if (full_msg != nullptr) {
+      full_msg->GetReflection()->Swap(
+          full_msg, DynamicCastMessage<Message>(prototype.get()));
+    } else {
+      new_msg->CheckTypeAndMergeFrom(*prototype);
+    }
   } else {
-    new_msg->CheckTypeAndMergeFrom(*msg);
+    new_msg->CheckTypeAndMergeFrom(*prototype);
   }
-  delete msg;
 }
 
 template <typename Key>
@@ -90,7 +99,8 @@
                             delete value.s;
                           },
                           [&](MessageLite* msg) {
-                            InitializeMessageValue(msg, value.message);
+                            InitializeMessageValue(
+                                msg, absl::WrapUnique(value.message));
                           },
                       });