Skip to content

Commit 9c44e1c

Browse files
Fix_zero_offset_output_base_assumption (#2068)
1 parent 28f4004 commit 9c44e1c

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

vm/src/vm/runners/builtin_runner/output.rs

+14-3
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ use crate::vm::vm_memory::memory_segments::MemorySegmentManager;
1212
#[derive(Debug, Clone, PartialEq)]
1313
pub struct OutputBuiltinState {
1414
pub base: usize,
15+
pub base_offset: usize,
1516
pub pages: Pages,
1617
pub attributes: Attributes,
1718
}
1819

1920
#[derive(Debug, Clone)]
2021
pub struct OutputBuiltinRunner {
2122
base: usize,
23+
pub base_offset: usize,
2224
pub(crate) pages: Pages,
2325
pub(crate) attributes: Attributes,
2426
pub(crate) stop_ptr: Option<usize>,
@@ -29,15 +31,17 @@ impl OutputBuiltinRunner {
2931
pub fn new(included: bool) -> OutputBuiltinRunner {
3032
OutputBuiltinRunner {
3133
base: 0,
34+
base_offset: 0,
3235
pages: HashMap::default(),
3336
attributes: HashMap::default(),
3437
stop_ptr: None,
3538
included,
3639
}
3740
}
3841

39-
pub fn new_state(&mut self, base: usize, included: bool) {
42+
pub fn new_state(&mut self, base: usize, base_offset: usize, included: bool) {
4043
self.base = base;
44+
self.base_offset = base_offset;
4145
self.pages = HashMap::default();
4246
self.attributes = HashMap::default();
4347
self.stop_ptr = None;
@@ -143,13 +147,15 @@ impl OutputBuiltinRunner {
143147

144148
pub fn set_state(&mut self, new_state: OutputBuiltinState) {
145149
self.base = new_state.base;
150+
self.base_offset = new_state.base_offset;
146151
self.pages = new_state.pages;
147152
self.attributes = new_state.attributes;
148153
}
149154

150155
pub fn get_state(&mut self) -> OutputBuiltinState {
151156
OutputBuiltinState {
152157
base: self.base,
158+
base_offset: self.base_offset,
153159
pages: self.pages.clone(),
154160
attributes: self.attributes.clone(),
155161
}
@@ -168,7 +174,7 @@ impl OutputBuiltinRunner {
168174
self.pages.insert(
169175
page_id,
170176
PublicMemoryPage {
171-
start: page_start.offset,
177+
start: page_start.offset - self.base_offset,
172178
size: page_size,
173179
},
174180
);
@@ -493,6 +499,7 @@ mod tests {
493499

494500
let new_state = OutputBuiltinState {
495501
base: 10,
502+
base_offset: 0,
496503
pages: HashMap::from([(1, PublicMemoryPage { start: 0, size: 3 })]),
497504
attributes: HashMap::from([("gps_fact_topology".to_string(), vec![0, 2, 0])]),
498505
};
@@ -510,6 +517,7 @@ mod tests {
510517
fn new_state() {
511518
let mut builtin = OutputBuiltinRunner {
512519
base: 10,
520+
base_offset: 0,
513521
pages: HashMap::from([(1, PublicMemoryPage { start: 0, size: 3 })]),
514522
attributes: HashMap::from([("gps_fact_topology".to_string(), vec![0, 2, 0])]),
515523
stop_ptr: Some(10),
@@ -518,9 +526,10 @@ mod tests {
518526

519527
let new_base = 11;
520528
let new_included = false;
521-
builtin.new_state(new_base, new_included);
529+
builtin.new_state(new_base, 2, new_included);
522530

523531
assert_eq!(builtin.base, new_base);
532+
assert_eq!(builtin.base_offset, 2);
524533
assert!(builtin.pages.is_empty());
525534
assert!(builtin.attributes.is_empty());
526535
assert_eq!(builtin.stop_ptr, None);
@@ -614,6 +623,7 @@ mod tests {
614623
fn get_and_extend_additional_data() {
615624
let builtin_a = OutputBuiltinRunner {
616625
base: 0,
626+
base_offset: 0,
617627
pages: HashMap::from([(1, PublicMemoryPage { start: 0, size: 3 })]),
618628
attributes: HashMap::from([("gps_fact_topology".to_string(), vec![0, 2, 0])]),
619629
stop_ptr: None,
@@ -622,6 +632,7 @@ mod tests {
622632
let additional_data = builtin_a.get_additional_data();
623633
let mut builtin_b = OutputBuiltinRunner {
624634
base: 0,
635+
base_offset: 0,
625636
pages: Default::default(),
626637
attributes: Default::default(),
627638
stop_ptr: None,

0 commit comments

Comments
 (0)