Use InstructionFormat inside InstructionFormatBuilder
This commit is contained in:
@@ -84,32 +84,26 @@ impl InstructionFormat {
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) struct InstructionFormatBuilder {
|
||||
name: &'static str,
|
||||
num_value_operands: usize,
|
||||
has_value_list: bool,
|
||||
imm_fields: Vec<FormatField>,
|
||||
typevar_operand: Option<usize>,
|
||||
}
|
||||
pub(crate) struct InstructionFormatBuilder(InstructionFormat);
|
||||
|
||||
impl InstructionFormatBuilder {
|
||||
pub fn new(name: &'static str) -> Self {
|
||||
Self {
|
||||
Self(InstructionFormat {
|
||||
name,
|
||||
num_value_operands: 0,
|
||||
has_value_list: false,
|
||||
imm_fields: Vec::new(),
|
||||
typevar_operand: None,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
pub fn value(mut self) -> Self {
|
||||
self.num_value_operands += 1;
|
||||
self.0.num_value_operands += 1;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn varargs(mut self) -> Self {
|
||||
self.has_value_list = true;
|
||||
self.0.has_value_list = true;
|
||||
self
|
||||
}
|
||||
|
||||
@@ -118,33 +112,23 @@ impl InstructionFormatBuilder {
|
||||
kind: operand_kind.clone(),
|
||||
member: operand_kind.rust_field_name,
|
||||
};
|
||||
self.imm_fields.push(field);
|
||||
self.0.imm_fields.push(field);
|
||||
self
|
||||
}
|
||||
|
||||
pub fn typevar_operand(mut self, operand_index: usize) -> Self {
|
||||
assert!(self.typevar_operand.is_none());
|
||||
assert!(operand_index < self.num_value_operands);
|
||||
self.typevar_operand = Some(operand_index);
|
||||
assert!(self.0.typevar_operand.is_none());
|
||||
assert!(operand_index < self.0.num_value_operands);
|
||||
self.0.typevar_operand = Some(operand_index);
|
||||
self
|
||||
}
|
||||
|
||||
pub fn build(self) -> Rc<InstructionFormat> {
|
||||
let typevar_operand = if self.typevar_operand.is_some() {
|
||||
self.typevar_operand
|
||||
} else if self.num_value_operands > 0 {
|
||||
pub fn build(mut self) -> Rc<InstructionFormat> {
|
||||
if self.0.typevar_operand.is_none() && self.0.num_value_operands > 0 {
|
||||
// Default to the first value operand, if there's one.
|
||||
Some(0)
|
||||
} else {
|
||||
None
|
||||
self.0.typevar_operand = Some(0);
|
||||
};
|
||||
|
||||
Rc::new(InstructionFormat {
|
||||
name: self.name,
|
||||
num_value_operands: self.num_value_operands,
|
||||
has_value_list: self.has_value_list,
|
||||
imm_fields: self.imm_fields,
|
||||
typevar_operand,
|
||||
})
|
||||
Rc::new(self.0)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user