From b7a145df95315e5a83098c662b79eeea8a5fb9d3 Mon Sep 17 00:00:00 2001 From: Jakob Buchgraber Date: Mon, 29 Apr 2024 05:50:45 -0700 Subject: [PATCH] Implement _mut() accessors for messages without FieldEntry PiperOrigin-RevId: 629041337 --- .../rust/accessors/singular_message.cc | 46 ++++++++----------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/src/google/protobuf/compiler/rust/accessors/singular_message.cc b/src/google/protobuf/compiler/rust/accessors/singular_message.cc index 347f1d5dcd54..c5f77c2ca2ff 100644 --- a/src/google/protobuf/compiler/rust/accessors/singular_message.cc +++ b/src/google/protobuf/compiler/rust/accessors/singular_message.cc @@ -69,39 +69,34 @@ void SingularMessage::InMsgImpl(Context& ctx, const FieldDescriptor& field, } )rs"); }}, - {"getter_mut", + {"getter_mut_body", [&] { - if (accessor_case == AccessorCase::VIEW) { - return; - } - ctx.Emit({}, R"rs( - pub fn $raw_field_name$_mut(&mut self) -> $msg_type$Mut<'_> { - self.$raw_field_name$_entry().or_default() - } + if (ctx.is_cpp()) { + ctx.Emit({}, R"rs( + let raw_msg = unsafe { $getter_mut_thunk$(self.raw_msg()) }; + $msg_type$Mut::from_parent($pbi$::Private, + self.as_mutator_message_ref($pbi$::Private), raw_msg) + )rs"); + } else { + ctx.Emit({}, R"rs( + let raw_msg = unsafe { + $getter_mut_thunk$(self.raw_msg(), self.arena().raw()) + }; + $msg_type$Mut::from_parent($pbi$::Private, + self.as_mutator_message_ref($pbi$::Private), raw_msg) )rs"); + } }}, - {"private_getter_entry", + {"getter_mut", [&] { if (accessor_case == AccessorCase::VIEW) { return; } + ctx.Emit({}, R"rs( - fn $raw_field_name$_entry(&mut self) - -> $pb$::FieldEntry<'_, $msg_type$> { - static VTABLE: $pbr$::MessageVTable = - $pbr$::MessageVTable::new($pbi$::Private, - $getter_thunk$, - $getter_mut_thunk$, - $clearer_thunk$); - unsafe { - let has = self.has_$raw_field_name$(); - $pbi$::new_vtable_field_entry($pbi$::Private, - self.as_mutator_message_ref($pbi$::Private), - &VTABLE, - has) - } - } - )rs"); + pub fn $raw_field_name$_mut(&mut self) -> $msg_type$Mut<'_> { + $getter_mut_body$ + })rs"); }}, {"getter_opt", [&] { @@ -172,7 +167,6 @@ void SingularMessage::InMsgImpl(Context& ctx, const FieldDescriptor& field, R"rs( $getter$ $getter_mut$ - $private_getter_entry$ $getter_opt$ $setter$ $hazzer$