From 138769cca8c220853303cdfa17e37de4c562916e Mon Sep 17 00:00:00 2001 From: Zach Johnson Date: Sun, 13 Dec 2020 02:17:22 -0800 Subject: [PATCH] rusty-gd: make scalar getters return by copy rather than ref Bug: 171749953 Tag: #gd-refactor Test: gd/cert/run --rhost SimpleHalTest Change-Id: I1427e8cc8c252a1eddb68470b1df215cf53c628f --- gd/packet/parser/fields/packet_field.h | 4 ++++ gd/packet/parser/fields/scalar_field.h | 4 ++++ gd/packet/parser/packet_def.cc | 12 +++++++++--- gd/rust/hci/src/lib.rs | 12 ++++++------ 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/gd/packet/parser/fields/packet_field.h b/gd/packet/parser/fields/packet_field.h index 958ce2500..75caa7628 100644 --- a/gd/packet/parser/fields/packet_field.h +++ b/gd/packet/parser/fields/packet_field.h @@ -128,6 +128,10 @@ class PacketField : public Loggable { virtual void GenRustWriter(std::ostream& s, Size start_offset, Size end_offset) const = 0; + virtual bool GetterIsByRef() const { + return true; + } + private: ParseLocation loc_; std::string name_; diff --git a/gd/packet/parser/fields/scalar_field.h b/gd/packet/parser/fields/scalar_field.h index 6490ad75e..81616cee7 100644 --- a/gd/packet/parser/fields/scalar_field.h +++ b/gd/packet/parser/fields/scalar_field.h @@ -62,6 +62,10 @@ class ScalarField : public PacketField { void GenRustWriter(std::ostream& s, Size start_offset, Size end_offset) const override; + virtual bool GetterIsByRef() const override { + return false; + } + private: const int size_; }; diff --git a/gd/packet/parser/packet_def.cc b/gd/packet/parser/packet_def.cc index 480561a29..4bdc81e31 100644 --- a/gd/packet/parser/packet_def.cc +++ b/gd/packet/parser/packet_def.cc @@ -1021,9 +1021,15 @@ void PacketDef::GenRustAccessStructImpls(std::ostream& s) const { }); for (auto const& field : fields) { - s << "pub fn get_" << field->GetName() << "(&self) -> &" << field->GetRustDataType() << "{"; - s << " &self." << util::CamelCaseToUnderScore(def->name_) << ".as_ref()." << field->GetName(); - s << "}\n"; + if (field->GetterIsByRef()) { + s << "pub fn get_" << field->GetName() << "(&self) -> &" << field->GetRustDataType() << "{"; + s << " &self." << util::CamelCaseToUnderScore(def->name_) << ".as_ref()." << field->GetName(); + s << "}\n"; + } else { + s << "pub fn get_" << field->GetName() << "(&self) -> " << field->GetRustDataType() << "{"; + s << " self." << util::CamelCaseToUnderScore(def->name_) << ".as_ref()." << field->GetName(); + s << "}\n"; + } } } diff --git a/gd/rust/hci/src/lib.rs b/gd/rust/hci/src/lib.rs index 31537e22e..7236cb0e2 100644 --- a/gd/rust/hci/src/lib.rs +++ b/gd/rust/hci/src/lib.rs @@ -59,7 +59,7 @@ async fn provide_hci(hal_exports: HalExports, rt: Arc) -> HciExports { }; assert!( - *exports.send(ResetBuilder {}.build()).await.get_status() == ErrorCode::Success, + exports.send(ResetBuilder {}.build()).await.get_status() == ErrorCode::Success, "reset did not complete successfully" ); @@ -175,7 +175,7 @@ async fn dispatch( match evt.specialize() { CommandStatus(evt) => { hci_timeout.cancel(); - let this_opcode = *evt.get_command_op_code(); + let this_opcode = evt.get_command_op_code(); match pending_cmd.take() { Some(PendingCommand{opcode, fut}) if opcode == this_opcode => fut.send(evt.into()).unwrap(), Some(PendingCommand{opcode, ..}) => panic!("Waiting for {:?}, got {:?}", opcode, this_opcode), @@ -184,7 +184,7 @@ async fn dispatch( }, CommandComplete(evt) => { hci_timeout.cancel(); - let this_opcode = *evt.get_command_op_code(); + let this_opcode = evt.get_command_op_code(); match pending_cmd.take() { Some(PendingCommand{opcode, fut}) if opcode == this_opcode => fut.send(evt.into()).unwrap(), Some(PendingCommand{opcode, ..}) => panic!("Waiting for {:?}, got {:?}", opcode, this_opcode), @@ -193,7 +193,7 @@ async fn dispatch( }, LeMetaEvent(evt) => { let code = evt.get_subevent_code(); - match le_evt_handlers.lock().await.get(code) { + match le_evt_handlers.lock().await.get(&code) { Some(sender) => sender.send(evt).await.unwrap(), None => panic!("Unhandled le subevent {:?}", code), } @@ -203,7 +203,7 @@ async fn dispatch( VendorSpecificEvent(_) => {}, _ => { let code = evt.get_event_code(); - match evt_handlers.lock().await.get(code) { + match evt_handlers.lock().await.get(&code) { Some(sender) => sender.send(evt).await.unwrap(), None => panic!("Unhandled le subevent {:?}", code), } @@ -212,7 +212,7 @@ async fn dispatch( }, Some(cmd) = cmd_rx.recv(), if pending_cmd.is_none() => { pending_cmd = Some(PendingCommand { - opcode: *cmd.cmd.get_op_code(), + opcode: cmd.cmd.get_op_code(), fut: cmd.fut, }); cmd_tx.send(cmd.cmd).await.unwrap(); -- 2.11.0