main
Alpha Chen 2 years ago
parent eed4628613
commit 93a074bda9

@ -1,12 +1,13 @@
#[repr(u8)] #[repr(u8)]
pub enum OpCode { pub enum OpCode {
Constant,
Return, Return,
} }
type Value = f32; type Value = f32;
pub struct Chunk { pub struct Chunk {
code: Vec<OpCode>, code: Vec<u8>,
constants: Vec<Value>, constants: Vec<Value>,
} }
@ -19,13 +20,16 @@ impl Chunk {
} }
// https://doc.rust-lang.org/nomicon/vec/vec-push-pop.html // https://doc.rust-lang.org/nomicon/vec/vec-push-pop.html
pub fn write(&mut self, op_code: OpCode) { pub fn write(&mut self, byte: u8) {
self.code.push(op_code); self.code.push(byte);
} }
pub fn add_constant(&mut self, value: Value) -> usize{ pub fn add_constant(&mut self, value: Value) -> u8 {
self.constants.push(value); self.constants.push(value);
self.constants.len() - 1
assert!(self.constants.len() <= u8::MAX.into(), "Too many constants");
(self.constants.len() - 1) as u8
} }
pub fn disassemble(&self, name: &str) { pub fn disassemble(&self, name: &str) {
@ -41,7 +45,9 @@ impl Chunk {
print!("{:04} ", offset); print!("{:04} ", offset);
match self.code[offset] { match self.code[offset] {
OpCode::Return => self.simple_instruction("OP_RETURN", offset), 0 => self.constant_instruction("OP_CONSTANT", offset),
1 => self.simple_instruction("OP_RETURN", offset),
_ => unreachable!(),
} }
} }
@ -49,6 +55,13 @@ impl Chunk {
println!("{}", name); println!("{}", name);
offset + 1 offset + 1
} }
fn constant_instruction(&self, name: &str, offset: usize) -> usize {
let constant_index = self.code[offset+1];
let value = self.constants[constant_index as usize];
println!("{:<16} {:04} '{}'", name, constant_index, value);
offset + 2
}
} }
impl Default for Chunk { impl Default for Chunk {

@ -5,7 +5,11 @@ pub mod vec;
fn main() { fn main() {
let mut chunk = Chunk::default(); let mut chunk = Chunk::default();
chunk.write(OpCode::Return); chunk.write(OpCode::Return as u8);
let constant = chunk.add_constant(1.2);
chunk.write(OpCode::Constant as u8);
chunk.write(constant);
chunk.disassemble("test chunk"); chunk.disassemble("test chunk");
} }

Loading…
Cancel
Save