@@ -989,7 +989,7 @@ impl<'m> Thread<'m> {
989
989
}
990
990
991
991
fn values ( & mut self ) -> & mut Vec < Val > {
992
- & mut self . label ( ) . values
992
+ & mut self . frame ( ) . labels_values
993
993
}
994
994
995
995
fn peek_value ( & mut self ) -> Val {
@@ -998,6 +998,7 @@ impl<'m> Thread<'m> {
998
998
999
999
fn push_value ( & mut self , value : Val ) {
1000
1000
self . values ( ) . push ( value) ;
1001
+ self . label ( ) . values_cnt += 1 ;
1001
1002
}
1002
1003
1003
1004
fn push_value_or_trap ( & mut self , value : Option < Val > ) -> Result < ( ) , Error > {
@@ -1011,9 +1012,11 @@ impl<'m> Thread<'m> {
1011
1012
1012
1013
fn push_values ( & mut self , values : & [ Val ] ) {
1013
1014
self . values ( ) . extend_from_slice ( values) ;
1015
+ self . label ( ) . values_cnt += values. len ( ) ;
1014
1016
}
1015
1017
1016
1018
fn pop_value ( & mut self ) -> Val {
1019
+ self . label ( ) . values_cnt -= 1 ;
1017
1020
self . values ( ) . pop ( ) . unwrap ( )
1018
1021
}
1019
1022
@@ -1027,12 +1030,12 @@ impl<'m> Thread<'m> {
1027
1030
}
1028
1031
1029
1032
fn push_label ( & mut self , type_ : FuncType < ' m > , kind : LabelKind < ' m > ) {
1030
- let values = self . pop_values ( type_. params . len ( ) ) ;
1031
1033
let arity = match kind {
1032
1034
LabelKind :: Block | LabelKind :: If => type_. results . len ( ) ,
1033
1035
LabelKind :: Loop ( _) => type_. params . len ( ) ,
1034
1036
} ;
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 ;
1036
1039
self . labels ( ) . push ( label) ;
1037
1040
}
1038
1041
@@ -1041,10 +1044,12 @@ impl<'m> Thread<'m> {
1041
1044
if i == 0 {
1042
1045
return self . exit_frame ( ) ;
1043
1046
}
1044
- let values = core:: mem:: take ( self . values ( ) ) ;
1045
1047
let frame = self . frame ( ) ;
1048
+ let values_cnt: usize = frame. labels [ i ..] . iter ( ) . map ( |label| label. values_cnt ) . sum ( ) ;
1046
1049
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;
1048
1053
match kind {
1049
1054
LabelKind :: Loop ( pos) => unsafe { self . parser . restore ( pos) } ,
1050
1055
LabelKind :: Block | LabelKind :: If => self . skip_to_end ( inst, l) ,
@@ -1057,13 +1062,15 @@ impl<'m> Thread<'m> {
1057
1062
let label = frame. labels . pop ( ) . unwrap ( ) ;
1058
1063
if frame. labels . is_empty ( ) {
1059
1064
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) ;
1061
1067
if self . frames . is_empty ( ) {
1062
- return ThreadResult :: Done ( label . values ) ;
1068
+ return ThreadResult :: Done ( frame . labels_values ) ;
1063
1069
}
1064
1070
unsafe { self . parser . restore ( frame. ret ) } ;
1071
+ self . values ( ) . extend ( frame. labels_values ) ;
1065
1072
}
1066
- self . values ( ) . extend_from_slice ( & label. values ) ;
1073
+ self . label ( ) . values_cnt += label. values_cnt ;
1067
1074
ThreadResult :: Continue ( self )
1068
1075
}
1069
1076
@@ -1077,6 +1084,7 @@ impl<'m> Thread<'m> {
1077
1084
}
1078
1085
unsafe { self . parser . restore ( frame. ret ) } ;
1079
1086
self . values ( ) . extend_from_slice ( & values[ mid ..] ) ;
1087
+ self . label ( ) . values_cnt += frame. arity ;
1080
1088
ThreadResult :: Continue ( self )
1081
1089
}
1082
1090
@@ -1401,20 +1409,21 @@ struct Frame<'m> {
1401
1409
ret : & ' m [ u8 ] ,
1402
1410
locals : Vec < Val > ,
1403
1411
labels : Vec < Label < ' m > > ,
1412
+ labels_values : Vec < Val > ,
1404
1413
}
1405
1414
1406
1415
impl < ' m > Frame < ' m > {
1407
1416
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 ! [ ] }
1410
1419
}
1411
1420
}
1412
1421
1413
1422
#[ derive( Debug ) ]
1414
1423
struct Label < ' m > {
1415
1424
arity : usize ,
1416
1425
kind : LabelKind < ' m > ,
1417
- values : Vec < Val > ,
1426
+ values_cnt : usize ,
1418
1427
}
1419
1428
1420
1429
#[ derive( Debug ) ]
0 commit comments