From 3cd3e6f946c5d9b5999c5746cd010215331543c0 Mon Sep 17 00:00:00 2001 From: Andrew Morris Date: Wed, 27 Apr 2022 21:43:39 +1000 Subject: [PATCH] AssemblerFnData --- src/vstc/assemble.rs | 45 +++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/src/vstc/assemble.rs b/src/vstc/assemble.rs index 3ac7d72..c6d49ed 100644 --- a/src/vstc/assemble.rs +++ b/src/vstc/assemble.rs @@ -40,12 +40,16 @@ fn show_help() { println!(" vstc assemble "); } +struct AssemblerFnData { + register_map: HashMap, + register_count_pos: usize, +} + struct AssemblerData { content: String, // TODO: Avoid copying this in pos: usize, output: Vec, - register_map: HashMap, - register_count_pos: usize, + fn_data: AssemblerFnData, definitions_unresolved: HashMap>, definition_map: HashMap, } @@ -336,19 +340,24 @@ impl Assembler for AssemblerData { self.parse_exact("function("); self.output.push(ValueType::Function as u8); - self.register_map.clear(); - self.register_map.insert("return".to_string(), 0); - self.register_map.insert("this".to_string(), 1); - self.register_map.insert("ignore".to_string(), 0xff); + self.fn_data = AssemblerFnData { + register_map: HashMap::new(), + register_count_pos: 0, + }; + + self.fn_data.register_map.clear(); + self.fn_data.register_map.insert("return".to_string(), 0); + self.fn_data.register_map.insert("this".to_string(), 1); + self.fn_data.register_map.insert("ignore".to_string(), 0xff); loop { self.parse_optional_whitespace(); let mut next = self.parse_one_of(&["%", ")"]); if next == ")" { - self.register_count_pos = self.output.len(); + self.fn_data.register_count_pos = self.output.len(); self.output.push(0xff); - self.output.push((self.register_map.len() - 3) as u8); // TODO: Handle >255 + self.output.push((self.fn_data.register_map.len() - 3) as u8); // TODO: Handle >255 break; } @@ -358,7 +367,7 @@ impl Assembler for AssemblerData { let param_name = self.parse_identifier(); - if self.register_map.contains_key(param_name.as_str()) { + if self.fn_data.register_map.contains_key(param_name.as_str()) { std::panic!("Unexpected duplicate parameter name at {}", self.pos); } @@ -368,9 +377,9 @@ impl Assembler for AssemblerData { next = self.parse_one_of(&[",", ")"]); if next == ")" { - self.register_count_pos = self.output.len(); + self.fn_data.register_count_pos = self.output.len(); self.output.push(0xff); - self.output.push((self.register_map.len() - 3) as u8); // TODO: Handle >255 + self.output.push((self.fn_data.register_map.len() - 3) as u8); // TODO: Handle >255 break; } } @@ -397,7 +406,7 @@ impl Assembler for AssemblerData { } // TODO: Handle >255 registers - self.output[self.register_count_pos] = self.register_map.len() as u8; + self.output[self.fn_data.register_count_pos] = self.fn_data.register_map.len() as u8; } fn assemble_instruction(&mut self) { @@ -607,13 +616,13 @@ impl Assembler for AssemblerData { } fn get_register_index(&mut self, register_name: &str) -> u8 { - let get_result = self.register_map.get(®ister_name.to_string()); + let get_result = self.fn_data.register_map.get(®ister_name.to_string()); let result: u8; if get_result.is_none() { // TODO: Support >255 registers - result = (self.register_map.len() - 1) as u8; - self.register_map.insert(register_name.to_string(), result); + result = (self.fn_data.register_map.len() - 1) as u8; + self.fn_data.register_map.insert(register_name.to_string(), result); } else { result = *get_result.unwrap(); } @@ -668,8 +677,10 @@ fn assemble(content: &str) -> Vec { content: content.to_string(), pos: 0, output: Vec::new(), - register_map: HashMap::new(), - register_count_pos: 0, + fn_data: AssemblerFnData { + register_map: HashMap::new(), + register_count_pos: 0, + }, definitions_unresolved: HashMap::new(), definition_map: HashMap::new(), };