aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/xixanta/src/assembler.rs16
-rw-r--r--lib/xixanta/src/node.rs2
-rw-r--r--lib/xixanta/src/object.rs2
-rw-r--r--lib/xixanta/src/parser.rs40
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"
- );
}
}