diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/xixanta/src/assembler.rs | 16 | ||||
| -rw-r--r-- | lib/xixanta/src/node.rs | 2 | ||||
| -rw-r--r-- | lib/xixanta/src/object.rs | 2 | ||||
| -rw-r--r-- | lib/xixanta/src/parser.rs | 40 |
4 files changed, 34 insertions, 26 deletions
diff --git a/lib/xixanta/src/assembler.rs b/lib/xixanta/src/assembler.rs index 6ae4d3c..6a83dcb 100644 --- a/lib/xixanta/src/assembler.rs +++ b/lib/xixanta/src/assembler.rs @@ -134,7 +134,7 @@ struct Assembler<'a> { asan_next_ignore: bool, // The amount of bytes to reserve for the next variable assignment. - asan_next_reserve: u8, + asan_next_reserve: usize, } /// The result to be given at the end of `assembler::assemble` and @@ -888,7 +888,7 @@ impl<'a> Assembler<'a> { // Build up the memory range object for this bundle. let val = bundle.bundle.value() as usize; let range = MemoryRange { - range: (val..val + bundle.asan_reserve as usize), + range: (val..val + bundle.asan_reserve), name: name.clone(), }; @@ -928,7 +928,7 @@ impl<'a> Assembler<'a> { // Increase the counters for memory usage on either RAM slot and // check for bounds. if actual_name.starts_with("zp_") || actual_name.starts_with("m_") { - memory.total_internal_ram += bundle.asan_reserve as usize; + memory.total_internal_ram += bundle.asan_reserve; if memory.total_internal_ram > 0x800 { errors.push(Error { @@ -939,7 +939,7 @@ impl<'a> Assembler<'a> { }); } } else if actual_name.starts_with("wr_") { - memory.total_working_ram += bundle.asan_reserve as usize; + memory.total_working_ram += bundle.asan_reserve; if memory.total_working_ram > 0x2000 { errors.push(Error { @@ -2619,7 +2619,7 @@ impl<'a> Assembler<'a> { if object.bundle.resolved { let original_value = object.bundle.value() as usize; let given_value = value.value() as usize; - let end = original_value + object.asan_reserve as usize; + let end = original_value + object.asan_reserve; if given_value < original_value || given_value >= end { let range = MemoryRange { @@ -2680,7 +2680,7 @@ impl<'a> Assembler<'a> { let value = bundle.value() as usize; let range = MemoryRange { name: node.value.value.to_owned(), - range: (value..(value + self.asan_next_reserve as usize)), + range: (value..(value + self.asan_next_reserve)), }; self.warnings.push(Error { line: node.value.line, @@ -2693,7 +2693,7 @@ impl<'a> Assembler<'a> { let value = bundle.value() as usize; let range = MemoryRange { name: node.value.value.to_owned(), - range: (value..(value + self.asan_next_reserve as usize)), + range: (value..(value + self.asan_next_reserve)), }; self.warnings.push(Error { line: node.value.line, @@ -2707,7 +2707,7 @@ impl<'a> Assembler<'a> { let value = bundle.value() as usize; let range = MemoryRange { name: node.value.value.to_owned(), - range: (value..(value + self.asan_next_reserve as usize)), + range: (value..(value + self.asan_next_reserve)), }; if !(0x6000..0x8000).contains(&value) { self.warnings.push(Error { diff --git a/lib/xixanta/src/node.rs b/lib/xixanta/src/node.rs index 465dde2..65bc09e 100644 --- a/lib/xixanta/src/node.rs +++ b/lib/xixanta/src/node.rs @@ -259,7 +259,7 @@ pub enum OperationType { #[derive(Debug, Clone, PartialEq)] pub enum CommentType { - AsanReserve(u8), + AsanReserve(usize), AsanIgnore, } diff --git a/lib/xixanta/src/object.rs b/lib/xixanta/src/object.rs index 049798f..5904b56 100644 --- a/lib/xixanta/src/object.rs +++ b/lib/xixanta/src/object.rs @@ -138,7 +138,7 @@ pub struct Object { pub asan_ignore: bool, /// Amount of bytes reserved for this object on the address sanitizer. - pub asan_reserve: u8, + pub asan_reserve: usize, /// Number of times this object was accessed. Incremented by `get_variable`. pub accessed: usize, diff --git a/lib/xixanta/src/parser.rs b/lib/xixanta/src/parser.rs index 75e6cd8..7a892b0 100644 --- a/lib/xixanta/src/parser.rs +++ b/lib/xixanta/src/parser.rs @@ -184,16 +184,16 @@ impl Parser { } // Argument validation. - if !arg.starts_with('$') || arg.len() > 3 { + if !arg.starts_with('$') || arg.len() > 5 { return Err(Error { line: self.line, global: false, source: self.sources[self.current_source].clone(), - message: "expecting a byte formatted with a leading '$' sign".to_string(), + message: "expecting a number formatted with a leading '$' sign".to_string(), } .into()); } - let Ok(val) = u8::from_str_radix(arg.get(1..).unwrap_or("00"), 16) else { + let Ok(val) = usize::from_str_radix(arg.get(1..).unwrap_or("0000"), 16) else { return Err(Error { line: self.line, global: false, @@ -3341,6 +3341,8 @@ inc $20 VAR = $00 VAR2 = $02 ;; asan:reserve $03 + +VAR3 = $200 ;; asan:reserve $100 "#; let mut parser = Parser::default(); assert!(parser @@ -3348,7 +3350,7 @@ VAR2 = $02 ;; asan:reserve $03 .is_ok()); let nodes = parser.nodes(); - assert_eq!(nodes.len(), 4); + assert_eq!(nodes.len(), 6); assert_node( nodes.first().unwrap(), @@ -3359,15 +3361,25 @@ VAR2 = $02 ;; asan:reserve $03 // Yeah, `assert_node` is bad at multi-line cases, let's do it // manually... - let last = nodes.get(2).unwrap(); + let var2 = nodes.get(2).unwrap(); assert_eq!( - last.node_type, + var2.node_type, NodeType::Comment(CommentType::AsanReserve(3)) ); - assert_eq!(last.value.line, 3); - assert_eq!(last.value.start, 14); - assert_eq!(last.value.end, 26); - assert_eq!(last.value.value.as_str(), "asan:reserve"); + assert_eq!(var2.value.line, 3); + assert_eq!(var2.value.start, 14); + assert_eq!(var2.value.end, 26); + assert_eq!(var2.value.value.as_str(), "asan:reserve"); + + let var3 = nodes.get(4).unwrap(); + assert_eq!( + var3.node_type, + NodeType::Comment(CommentType::AsanReserve(256)) + ); + assert_eq!(var3.value.line, 5); + assert_eq!(var3.value.start, 15); + assert_eq!(var3.value.end, 27); + assert_eq!(var3.value.value.as_str(), "asan:reserve"); } #[test] @@ -3384,11 +3396,11 @@ VAR2 = $02 ;; asan:reserve $03 assert!(res.is_err()); let errors = res.unwrap_err(); - assert_eq!(errors.len(), 4); + assert_eq!(errors.len(), 3); assert_eq!( errors.first().unwrap().message, - "expecting a byte formatted with a leading '$' sign" + "expecting a number formatted with a leading '$' sign" ); assert_eq!( errors.get(1).unwrap().message, @@ -3398,9 +3410,5 @@ VAR2 = $02 ;; asan:reserve $03 errors.get(2).unwrap().message, "bad asan:reserve number, should be higher than $01" ); - assert_eq!( - errors.last().unwrap().message, - "expecting a byte formatted with a leading '$' sign" - ); } } |
