Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 287702bb authored by Zach Johnson's avatar Zach Johnson Committed by Gerrit Code Review
Browse files

Merge changes Id10b509c,I3f1a6073,I07885881

* changes:
  rusty-gd: mark vector field writing as unimplemented
  rusty-gd: add support for struct fields in write_to()
  rusty-gd: start writing scalar fields in write_to()
parents e7e54568 6c35d197
Loading
Loading
Loading
Loading
+32 −1
Original line number Diff line number Diff line
@@ -180,4 +180,35 @@ void ScalarField::GenRustGetter(std::ostream& s, Size start_offset, Size end_off
  }
}

void ScalarField::GenRustWriter(std::ostream&, Size, Size) const {}
void ScalarField::GenRustWriter(std::ostream& s, Size start_offset, Size end_offset) const {
  Size size = GetSize();
  int num_leading_bits = GetRustBitOffset(s, start_offset, end_offset, GetSize());

  s << "let " << GetName() << " = self." << GetName() << ";";
  if (util::RoundSizeUp(size.bits()) != size.bits()) {
    uint64_t mask = 0;
    for (int i = 0; i < size.bits(); i++) {
      mask <<= 1;
      mask |= 1;
    }
    s << "let " << GetName() << " = ";
    s << GetName() << " & 0x" << std::hex << mask << std::dec << ";";
  }

  int access_offset = 0;
  if (num_leading_bits != 0) {
    access_offset = -1;
    uint64_t mask = 0;
    for (int i = 0; i < num_leading_bits; i++) {
      mask <<= 1;
      mask |= 1;
    }
    s << "let " << GetName() << " = (" << GetName() << " << " << num_leading_bits << ") | ("
      << "(buffer[" << start_offset.bytes() << "] as " << GetRustDataType() << ") & 0x" << std::hex << mask << std::dec
      << ");";
  }

  s << "buffer[" << start_offset.bytes() + access_offset << ".."
    << start_offset.bytes() + GetSize().bytes() + access_offset << "].copy_from_slice(&" << GetName()
    << ".to_le_bytes());";
}
+3 −1
Original line number Diff line number Diff line
@@ -98,4 +98,6 @@ void StructField::GenRustGetter(std::ostream& s, Size start_offset, Size) const
  s << start_offset.bytes() + GetSize().bytes() << "]).unwrap();";
}

void StructField::GenRustWriter(std::ostream&, Size, Size) const {}
void StructField::GenRustWriter(std::ostream& s, Size, Size) const {
  s << "self." << GetName() << ".write_to(buffer);";
}
+3 −1
Original line number Diff line number Diff line
@@ -302,4 +302,6 @@ void VectorField::GenRustGetter(std::ostream& s, Size start_offset, Size) const
  }
}

void VectorField::GenRustWriter(std::ostream&, Size, Size) const {}
void VectorField::GenRustWriter(std::ostream& s, Size, Size) const {
  s << "unimplemented!();";
}
+4 −0
Original line number Diff line number Diff line
@@ -881,6 +881,10 @@ void PacketDef::GenRustStructImpls(std::ostream& s) const {

  fields = fields_.GetFieldsWithoutTypes({
      BodyField::kFieldType,
      CountField::kFieldType,
      PaddingField::kFieldType,
      ReservedField::kFieldType,
      SizeField::kFieldType,
  });

  for (auto const& field : fields) {
+24 −0
Original line number Diff line number Diff line
@@ -438,6 +438,30 @@ void StructDef::GenRustImpls(std::ostream& s) const {
  GenRustSizeField(s);
  s << "})}\n";

  // 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);
  }

  s << "}\n";

  if (fields.size() > 0) {
    s << "pub fn get_size(&self) -> usize { self.size }";
  }