Generate an opcode_name() function.
This function returning a &'static str is more primitive that the Display implementation. It allows the opcode strings to be reused by the parser.
This commit is contained in:
@@ -8,9 +8,16 @@
|
|||||||
use std::fmt::{self, Display, Formatter};
|
use std::fmt::{self, Display, Formatter};
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
|
||||||
// The `Opcode` enum is generated from the meta instruction descriptions.
|
// The `Opcode` enum and the `opcode_name` function are generated from the meta instruction
|
||||||
|
// descriptions.
|
||||||
include!(concat!(env!("OUT_DIR"), "/opcodes.rs"));
|
include!(concat!(env!("OUT_DIR"), "/opcodes.rs"));
|
||||||
|
|
||||||
|
impl Display for Opcode {
|
||||||
|
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
|
||||||
|
write!(f, "{}", opcode_name(*self))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// 64-bit immediate integer operand.
|
/// 64-bit immediate integer operand.
|
||||||
///
|
///
|
||||||
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
|
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
|
||||||
|
|||||||
@@ -36,11 +36,11 @@ def gen_opcodes(groups, out_dir):
|
|||||||
# Enum variant itself.
|
# Enum variant itself.
|
||||||
fmt.line(i.camel_name + ',')
|
fmt.line(i.camel_name + ',')
|
||||||
|
|
||||||
with fmt.indented('impl Display for Opcode {', '}'):
|
# Generate a private opcode_name function.
|
||||||
with fmt.indented('fn fmt(&self, f: &mut Formatter) -> fmt::Result {', '}'):
|
with fmt.indented('fn opcode_name(opc: Opcode) -> &\'static str {', '}'):
|
||||||
with fmt.indented('f.write_str(match *self {', '})'):
|
with fmt.indented('match opc {', '}'):
|
||||||
for i in instrs:
|
for i in instrs:
|
||||||
fmt.format('Opcode::{} => "{}",', i.camel_name, i.name)
|
fmt.format('Opcode::{} => "{}",', i.camel_name, i.name)
|
||||||
|
|
||||||
fmt.update_file('opcodes.rs', out_dir)
|
fmt.update_file('opcodes.rs', out_dir)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user