Skip to content

Commit 8c0419e

Browse files
committed
Put RefCell around frames member of VirtualMachine. This allows for VirtualMachine to be immutable.
1 parent 6c660c9 commit 8c0419e

File tree

2 files changed

+16
-12
lines changed

2 files changed

+16
-12
lines changed

vm/src/sysmodule.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ fn argv(ctx: &PyContext) -> PyObjectRef {
2121
fn frame_idx(vm: &mut VirtualMachine, offset: Option<&PyObjectRef>) -> Result<usize, PyObjectRef> {
2222
if let Some(int) = offset {
2323
if let Some(offset) = objint::get_value(&int).to_usize() {
24-
if offset > vm.frames.len() - 1 {
24+
if offset > vm.frames.borrow().len() - 1 {
2525
return Err(vm.new_value_error("call stack is not deep enough".to_string()));
2626
}
2727
return Ok(offset);
@@ -39,8 +39,8 @@ fn getframe(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
3939
);
4040

4141
let idx = frame_idx(vm, offset)?;
42-
let idx = vm.frames.len() - idx - 1;
43-
let frame = &vm.frames[idx];
42+
let idx = vm.frames.borrow().len() - idx - 1;
43+
let frame = &vm.frames.borrow()[idx];
4444
Ok(frame.clone())
4545
}
4646

vm/src/vm.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
77
extern crate rustpython_parser;
88

9+
use std::cell::{Ref, RefCell};
910
use std::collections::hash_map::HashMap;
1011
use std::collections::hash_set::HashSet;
1112
use std::rc::Rc;
@@ -46,7 +47,7 @@ pub struct VirtualMachine {
4647
pub sys_module: PyObjectRef,
4748
pub stdlib_inits: HashMap<String, stdlib::StdlibInitFunc>,
4849
pub ctx: PyContext,
49-
pub frames: Vec<PyObjectRef>,
50+
pub frames: RefCell<Vec<PyObjectRef>>,
5051
pub wasm_id: Option<String>,
5152
}
5253

@@ -69,7 +70,7 @@ impl VirtualMachine {
6970
sys_module: sysmod,
7071
stdlib_inits,
7172
ctx,
72-
frames: vec![],
73+
frames: RefCell::new(vec![]),
7374
wasm_id: None,
7475
}
7576
}
@@ -87,21 +88,24 @@ impl VirtualMachine {
8788
}
8889

8990
pub fn run_frame(&mut self, frame: PyObjectRef) -> PyResult<ExecutionResult> {
90-
self.frames.push(frame.clone());
91+
self.frames.borrow_mut().push(frame.clone());
9192
let frame = objframe::get_value(&frame);
9293
let result = frame.run(self);
93-
self.frames.pop();
94+
self.frames.borrow_mut().pop();
9495
result
9596
}
9697

97-
pub fn current_frame(&self) -> &Frame {
98-
let current_frame = &self.frames[self.frames.len() - 1];
99-
objframe::get_value(current_frame)
98+
pub fn current_frame(&self) -> Ref<Frame> {
99+
Ref::map(self.frames.borrow(), |frames| {
100+
let index = frames.len() - 1;
101+
let current_frame = &frames[index];
102+
objframe::get_value(current_frame)
103+
})
100104
}
101105

102-
pub fn current_scope(&self) -> &Scope {
106+
pub fn current_scope(&self) -> Ref<Scope> {
103107
let frame = self.current_frame();
104-
&frame.scope
108+
Ref::map(frame, |f| &f.scope)
105109
}
106110

107111
pub fn class(&mut self, module: &str, class: &str) -> PyObjectRef {

0 commit comments

Comments
 (0)