OSDN Git Service

rusty-gd: move write_to logic to parent_def
authorZach Johnson <zachoverflow@google.com>
Tue, 2 Feb 2021 00:25:36 +0000 (16:25 -0800)
committerZach Johnson <zachoverflow@google.com>
Tue, 2 Feb 2021 00:28:35 +0000 (16:28 -0800)
this way it can be shared between struct & packet

Bug: 171749953
Tag: #gd-refactor
Test: gd/cert/run --rhost
Change-Id: I58d1972a28127ad28f2c1cbc51301a97027016e4

gd/packet/parser/packet_def.cc
gd/packet/parser/parent_def.cc
gd/packet/parser/parent_def.h
gd/packet/parser/struct_def.cc

index 181ebfd..d3bf525 100644 (file)
@@ -999,63 +999,7 @@ void PacketDef::GenRustStructImpls(std::ostream& s) const {
 
   // write_to function
   s << "fn write_to(&self, buffer: &mut BytesMut) {";
-
-  fields = fields_.GetFieldsWithoutTypes({
-      BodyField::kFieldType,
-      CountField::kFieldType,
-      PaddingField::kFieldType,
-      ReservedField::kFieldType,
-      FixedScalarField::kFieldType,
-  });
-
-  for (auto const& field : fields) {
-    auto start_field_offset = GetOffsetForField(field->GetName(), false);
-    auto end_field_offset = GetOffsetForField(field->GetName(), true);
-
-    if (start_field_offset.empty() && end_field_offset.empty()) {
-      ERROR(field) << "Field location for " << field->GetName() << " is ambiguous, "
-                   << "no method exists to determine field location from begin() or end().\n";
-    }
-
-    if (field->GetFieldType() == SizeField::kFieldType) {
-      const auto& field_name = ((SizeField*)field)->GetSizedFieldName();
-      const auto& sized_field = fields_.GetField(field_name);
-      if (sized_field == nullptr) {
-        ERROR(field) << __func__ << ": Can't find sized field named " << field_name;
-      }
-      if (sized_field->GetFieldType() == PayloadField::kFieldType) {
-        std::string modifier = ((PayloadField*)sized_field)->size_modifier_;
-        if (modifier != "") {
-          ERROR(field) << __func__ << ": size modifiers not implemented yet for " << field_name;
-        }
-
-        s << "let " << field->GetName() << " = " << field->GetRustDataType()
-          << "::try_from(self.child.get_total_size()).expect(\"payload size did not fit\");";
-      } else if (sized_field->GetFieldType() == BodyField::kFieldType) {
-        s << "let " << field->GetName() << " = " << field->GetRustDataType()
-          << "::try_from(self.get_total_size() - self.get_size()).expect(\"payload size did not fit\");";
-      } else if (sized_field->GetFieldType() == VectorField::kFieldType) {
-        const auto& vector_name = field_name + "_bytes";
-        const VectorField* vector = (VectorField*)sized_field;
-        if (vector->element_size_.empty() || vector->element_size_.has_dynamic()) {
-          s << "let " << vector_name + " = self." << field_name << ".iter().fold(0, |acc, x| acc + x.get_size());";
-        } else {
-          s << "let " << vector_name + " = self." << field_name << ".len() * ((" << vector->element_size_ << ") / 8);";
-        }
-        std::string modifier = vector->GetSizeModifier();
-        if (modifier != "") {
-          ERROR(field) << __func__ << ": size modifiers not implemented yet for " << field_name;
-        }
-
-        s << "let " << field->GetName() << " = " << field->GetRustDataType() << "::try_from(" << vector_name
-          << ").expect(\"payload size did not fit\");";
-      } else {
-        ERROR(field) << __func__ << ": Unhandled sized field type for " << field_name;
-      }
-    }
-
-    field->GenRustWriter(s, start_field_offset, end_field_offset);
-  }
+  GenRustWriteToFields(s);
 
   if (HasChildEnums()) {
     s << "match &self.child {";
index ec912d7..402b257 100644 (file)
@@ -569,3 +569,62 @@ std::vector<const ParentDef*> ParentDef::FindPathToDescendant(std::string descen
 bool ParentDef::HasChildEnums() const {
   return !children_.empty() || fields_.HasPayload();
 }
+
+void ParentDef::GenRustWriteToFields(std::ostream& s) const {
+  auto fields = fields_.GetFieldsWithoutTypes({
+      BodyField::kFieldType,
+      CountField::kFieldType,
+      PaddingField::kFieldType,
+      ReservedField::kFieldType,
+      FixedScalarField::kFieldType,
+  });
+
+  for (auto const& field : fields) {
+    auto start_field_offset = GetOffsetForField(field->GetName(), false);
+    auto end_field_offset = GetOffsetForField(field->GetName(), true);
+
+    if (start_field_offset.empty() && end_field_offset.empty()) {
+      ERROR(field) << "Field location for " << field->GetName() << " is ambiguous, "
+                   << "no method exists to determine field location from begin() or end().\n";
+    }
+
+    if (field->GetFieldType() == SizeField::kFieldType) {
+      const auto& field_name = ((SizeField*)field)->GetSizedFieldName();
+      const auto& sized_field = fields_.GetField(field_name);
+      if (sized_field == nullptr) {
+        ERROR(field) << __func__ << ": Can't find sized field named " << field_name;
+      }
+      if (sized_field->GetFieldType() == PayloadField::kFieldType) {
+        std::string modifier = ((PayloadField*)sized_field)->size_modifier_;
+        if (modifier != "") {
+          ERROR(field) << __func__ << ": size modifiers not implemented yet for " << field_name;
+        }
+
+        s << "let " << field->GetName() << " = " << field->GetRustDataType()
+          << "::try_from(self.child.get_total_size()).expect(\"payload size did not fit\");";
+      } else if (sized_field->GetFieldType() == BodyField::kFieldType) {
+        s << "let " << field->GetName() << " = " << field->GetRustDataType()
+          << "::try_from(self.get_total_size() - self.get_size()).expect(\"payload size did not fit\");";
+      } else if (sized_field->GetFieldType() == VectorField::kFieldType) {
+        const auto& vector_name = field_name + "_bytes";
+        const VectorField* vector = (VectorField*)sized_field;
+        if (vector->element_size_.empty() || vector->element_size_.has_dynamic()) {
+          s << "let " << vector_name + " = self." << field_name << ".iter().fold(0, |acc, x| acc + x.get_size());";
+        } else {
+          s << "let " << vector_name + " = self." << field_name << ".len() * ((" << vector->element_size_ << ") / 8);";
+        }
+        std::string modifier = vector->GetSizeModifier();
+        if (modifier != "") {
+          s << "let " << vector_name << " = " << vector_name << " + (" << modifier.substr(1) << ") / 8;";
+        }
+
+        s << "let " << field->GetName() << " = " << field->GetRustDataType() << "::try_from(" << vector_name
+          << ").expect(\"payload size did not fit\");";
+      } else {
+        ERROR(field) << __func__ << ": Unhandled sized field type for " << field_name;
+      }
+    }
+
+    field->GenRustWriter(s, start_field_offset, end_field_offset);
+  }
+}
index 84857e3..8b0a7f1 100644 (file)
@@ -87,4 +87,6 @@ class ParentDef : public TypeDef {
   bool is_little_endian_;
 
   bool HasChildEnums() const;
+
+  void GenRustWriteToFields(std::ostream& s) const;
 };
index 4f5b1b7..12288ab 100644 (file)
@@ -379,27 +379,6 @@ void StructDef::GenRustDeclarations(std::ostream& s) const {
 
 void StructDef::GenRustImpls(std::ostream& s) const {
   s << "impl " << name_ << "{";
-  /*s << "pub fn new(";
-  GenRustFieldNameAndType(s, false);
-  s << ") -> Self { Self {";
-  auto fields = fields_.GetFieldsWithoutTypes({
-      BodyField::kFieldType,
-      CountField::kFieldType,
-      PaddingField::kFieldType,
-      ReservedField::kFieldType,
-      SizeField::kFieldType,
-  });
-  for (const auto& field : fields) {
-    if (field->GetFieldType() == FixedScalarField::kFieldType) {
-      s << field->GetName() << ": ";
-      static_cast<FixedScalarField*>(field)->GenValue(s);
-    } else {
-      s << field->GetName();
-    }
-    s << ", ";
-  }
-  s << "}}";*/
-
   s << "pub fn parse(bytes: &[u8]) -> Result<Self> {";
   auto fields = fields_.GetFieldsWithoutTypes({
       BodyField::kFieldType,
@@ -439,26 +418,7 @@ void StructDef::GenRustImpls(std::ostream& s) const {
 
   // write_to function
   s << "fn write_to(&self, buffer: &mut BytesMut) {";
-  fields = fields_.GetFieldsWithoutTypes({
-      BodyField::kFieldType,
-      CountField::kFieldType,
-      PaddingField::kFieldType,
-      ReservedField::kFieldType,
-      SizeField::kFieldType,
-  });
-
-  for (auto const& field : fields) {
-    auto start_field_offset = GetOffsetForField(field->GetName(), false);
-    auto end_field_offset = GetOffsetForField(field->GetName(), true);
-
-    if (start_field_offset.empty() && end_field_offset.empty()) {
-      ERROR(field) << "Field location for " << field->GetName() << " is ambiguous, "
-                   << "no method exists to determine field location from begin() or end().\n";
-    }
-
-    field->GenRustWriter(s, start_field_offset, end_field_offset);
-  }
-
+  GenRustWriteToFields(s);
   s << "}\n";
 
   if (fields.size() > 0) {