Skip to content

Commit 1b79dae

Browse files
zhouwfangia0
andauthored
Combine Label values in Frame (#598)
This is the first step towards adding a value stack in `Thread`. The next step is to merge `locals` and `labels_values` in `Frame`. After that, we can create a value stack in `Thread` by combining the values from the `Frame`'s. #46 --------- Co-authored-by: Zhou Fang <[email protected]> Co-authored-by: Julien Cretin <[email protected]> Co-authored-by: Julien Cretin <[email protected]>
1 parent 382e573 commit 1b79dae

File tree

1 file changed

+20
-11
lines changed

1 file changed

+20
-11
lines changed

crates/interpreter/src/exec.rs

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -989,7 +989,7 @@ impl<'m> Thread<'m> {
989989
}
990990

991991
fn values(&mut self) -> &mut Vec<Val> {
992-
&mut self.label().values
992+
&mut self.frame().labels_values
993993
}
994994

995995
fn peek_value(&mut self) -> Val {
@@ -998,6 +998,7 @@ impl<'m> Thread<'m> {
998998

999999
fn push_value(&mut self, value: Val) {
10001000
self.values().push(value);
1001+
self.label().values_cnt += 1;
10011002
}
10021003

10031004
fn push_value_or_trap(&mut self, value: Option<Val>) -> Result<(), Error> {
@@ -1011,9 +1012,11 @@ impl<'m> Thread<'m> {
10111012

10121013
fn push_values(&mut self, values: &[Val]) {
10131014
self.values().extend_from_slice(values);
1015+
self.label().values_cnt += values.len();
10141016
}
10151017

10161018
fn pop_value(&mut self) -> Val {
1019+
self.label().values_cnt -= 1;
10171020
self.values().pop().unwrap()
10181021
}
10191022

@@ -1027,12 +1030,12 @@ impl<'m> Thread<'m> {
10271030
}
10281031

10291032
fn push_label(&mut self, type_: FuncType<'m>, kind: LabelKind<'m>) {
1030-
let values = self.pop_values(type_.params.len());
10311033
let arity = match kind {
10321034
LabelKind::Block | LabelKind::If => type_.results.len(),
10331035
LabelKind::Loop(_) => type_.params.len(),
10341036
};
1035-
let label = Label { arity, kind, values };
1037+
let label = Label { arity, kind, values_cnt: type_.params.len() };
1038+
self.label().values_cnt -= label.values_cnt;
10361039
self.labels().push(label);
10371040
}
10381041

@@ -1041,10 +1044,12 @@ impl<'m> Thread<'m> {
10411044
if i == 0 {
10421045
return self.exit_frame();
10431046
}
1044-
let values = core::mem::take(self.values());
10451047
let frame = self.frame();
1048+
let values_cnt: usize = frame.labels[i ..].iter().map(|label| label.values_cnt).sum();
10461049
let Label { arity, kind, .. } = frame.labels.drain(i ..).next().unwrap();
1047-
self.values().extend_from_slice(&values[values.len() - arity ..]);
1050+
let values_len = self.values().len();
1051+
self.values().drain(values_len - values_cnt .. values_len - arity);
1052+
self.label().values_cnt += arity;
10481053
match kind {
10491054
LabelKind::Loop(pos) => unsafe { self.parser.restore(pos) },
10501055
LabelKind::Block | LabelKind::If => self.skip_to_end(inst, l),
@@ -1057,13 +1062,15 @@ impl<'m> Thread<'m> {
10571062
let label = frame.labels.pop().unwrap();
10581063
if frame.labels.is_empty() {
10591064
let frame = self.frames.pop().unwrap();
1060-
debug_assert_eq!(label.values.len(), frame.arity);
1065+
debug_assert_eq!(frame.labels_values.len(), label.values_cnt);
1066+
debug_assert_eq!(frame.labels_values.len(), frame.arity);
10611067
if self.frames.is_empty() {
1062-
return ThreadResult::Done(label.values);
1068+
return ThreadResult::Done(frame.labels_values);
10631069
}
10641070
unsafe { self.parser.restore(frame.ret) };
1071+
self.values().extend(frame.labels_values);
10651072
}
1066-
self.values().extend_from_slice(&label.values);
1073+
self.label().values_cnt += label.values_cnt;
10671074
ThreadResult::Continue(self)
10681075
}
10691076

@@ -1077,6 +1084,7 @@ impl<'m> Thread<'m> {
10771084
}
10781085
unsafe { self.parser.restore(frame.ret) };
10791086
self.values().extend_from_slice(&values[mid ..]);
1087+
self.label().values_cnt += frame.arity;
10801088
ThreadResult::Continue(self)
10811089
}
10821090

@@ -1401,20 +1409,21 @@ struct Frame<'m> {
14011409
ret: &'m [u8],
14021410
locals: Vec<Val>,
14031411
labels: Vec<Label<'m>>,
1412+
labels_values: Vec<Val>,
14041413
}
14051414

14061415
impl<'m> Frame<'m> {
14071416
fn new(inst_id: usize, arity: usize, ret: &'m [u8], locals: Vec<Val>) -> Self {
1408-
let label = Label { arity, kind: LabelKind::Block, values: vec![] };
1409-
Frame { inst_id, arity, ret, locals, labels: vec![label] }
1417+
let label = Label { arity, kind: LabelKind::Block, values_cnt: 0 };
1418+
Frame { inst_id, arity, ret, locals, labels: vec![label], labels_values: vec![] }
14101419
}
14111420
}
14121421

14131422
#[derive(Debug)]
14141423
struct Label<'m> {
14151424
arity: usize,
14161425
kind: LabelKind<'m>,
1417-
values: Vec<Val>,
1426+
values_cnt: usize,
14181427
}
14191428

14201429
#[derive(Debug)]

0 commit comments

Comments
 (0)