@@ -74,14 +74,6 @@ impl Stack {
7474 }
7575 }
7676
77- fn pop_as_integral_or_bail ( & mut self ) -> Result < i64 > {
78- if let Either :: Left ( int) = self . pop_as_number_or_bail ( ) ? {
79- return Ok ( int) ;
80- }
81-
82- Err ( EvalError :: UnexpectedRuntimeError )
83- }
84-
8577 fn pop_as_bool_or_bail ( & mut self ) -> Result < bool > {
8678 match self . pop_as_literal_or_bail ( ) ? {
8779 Literal :: Bool ( b) => Ok ( b) ,
@@ -97,22 +89,6 @@ impl Stack {
9789 Err ( EvalError :: UnexpectedRuntimeError )
9890 }
9991
100- fn pop_as_array_of_strings_or_bail ( & mut self ) -> Result < Vec < String > > {
101- let vec_of_items = self . pop_as_array_or_bail ( ) ?;
102- let mut result = Vec :: with_capacity ( vec_of_items. len ( ) ) ;
103-
104- for item in vec_of_items {
105- if let Item :: Literal ( Literal :: String ( s) ) = item {
106- result. push ( s) ;
107- continue ;
108- }
109-
110- return Err ( EvalError :: UnexpectedRuntimeError ) ;
111- }
112-
113- Ok ( result)
114- }
115-
11692 fn push_literal ( & mut self , lit : Literal ) {
11793 self . inner . push ( Item :: Literal ( lit) ) ;
11894 }
@@ -133,11 +109,7 @@ pub fn eval_where_clause(dict: &Dictionary, instrs: Vec<Instr>) -> Result<bool>
133109 match instr {
134110 Instr :: Push ( lit) => stack. push_literal ( lit) ,
135111
136- Instr :: LoadVar => {
137- let name = stack. pop_as_string_or_bail ( ) ?;
138- let path = stack. pop_as_array_of_strings_or_bail ( ) ?;
139- let var = Var { name, path } ;
140-
112+ Instr :: LoadVar ( var) => {
141113 stack. push_literal ( dict. lookup ( & var) ?) ;
142114 }
143115
@@ -469,8 +441,7 @@ pub fn eval_where_clause(dict: &Dictionary, instrs: Vec<Instr>) -> Result<bool>
469441 }
470442 } ,
471443
472- Instr :: Array => {
473- let siz = stack. pop_as_integral_or_bail ( ) ? as usize ;
444+ Instr :: Array ( siz) => {
474445 let mut array = Vec :: with_capacity ( siz) ;
475446
476447 for _ in 0 ..siz {
@@ -480,58 +451,52 @@ pub fn eval_where_clause(dict: &Dictionary, instrs: Vec<Instr>) -> Result<bool>
480451 stack. push_array ( array) ;
481452 }
482453
483- Instr :: Rec => {
484- let siz = stack. pop_as_integral_or_bail ( ) ? as usize ;
454+ Instr :: Rec ( siz) => {
485455 let mut fields = HashMap :: with_capacity ( siz) ;
486456
487- todo ! ( "the keys come first now, then the values" ) ;
488457 for _ in 0 ..siz {
489- let value = stack. pop_or_bail ( ) ?;
490458 let key = stack. pop_as_string_or_bail ( ) ?;
459+ let value = stack. pop_or_bail ( ) ?;
491460
492461 fields. insert ( key, value) ;
493462 }
494463
495464 stack. push_record ( Rec { fields } ) ;
496465 }
497466
498- Instr :: Call => {
499- let fun_name = stack. pop_as_string_or_bail ( ) ?;
500-
501- match fun_name. as_str ( ) {
502- "abs" => match stack. pop_as_number_or_bail ( ) ? {
503- Either :: Left ( i) => stack. push_literal ( Literal :: Integral ( i. abs ( ) ) ) ,
504- Either :: Right ( f) => stack. push_literal ( Literal :: Float ( f. abs ( ) ) ) ,
505- } ,
506-
507- "ceil" => match stack. pop_as_number_or_bail ( ) ? {
508- Either :: Left ( i) => stack. push_literal ( Literal :: Integral ( i) ) ,
509- Either :: Right ( f) => stack. push_literal ( Literal :: Float ( f. ceil ( ) ) ) ,
510- } ,
511-
512- "floor" => match stack. pop_as_number_or_bail ( ) ? {
513- Either :: Left ( i) => stack. push_literal ( Literal :: Integral ( i) ) ,
514- Either :: Right ( f) => stack. push_literal ( Literal :: Float ( f. floor ( ) ) ) ,
515- } ,
516-
517- "sin" => match stack. pop_as_number_or_bail ( ) ? {
518- Either :: Left ( i) => stack. push_literal ( Literal :: Float ( ( i as f64 ) . sin ( ) ) ) ,
519- Either :: Right ( f) => stack. push_literal ( Literal :: Float ( f. sin ( ) ) ) ,
520- } ,
521-
522- "cos" => match stack. pop_as_number_or_bail ( ) ? {
523- Either :: Left ( i) => stack. push_literal ( Literal :: Float ( ( i as f64 ) . cos ( ) ) ) ,
524- Either :: Right ( f) => stack. push_literal ( Literal :: Float ( f. cos ( ) ) ) ,
525- } ,
526-
527- "tan" => match stack. pop_as_number_or_bail ( ) ? {
528- Either :: Left ( i) => stack. push_literal ( Literal :: Float ( ( i as f64 ) . tan ( ) ) ) ,
529- Either :: Right ( f) => stack. push_literal ( Literal :: Float ( f. tan ( ) ) ) ,
530- } ,
531-
532- _ => return Err ( EvalError :: UnexpectedRuntimeError ) ,
533- }
534- }
467+ Instr :: Call ( fun_name) => match fun_name. as_str ( ) {
468+ "abs" => match stack. pop_as_number_or_bail ( ) ? {
469+ Either :: Left ( i) => stack. push_literal ( Literal :: Integral ( i. abs ( ) ) ) ,
470+ Either :: Right ( f) => stack. push_literal ( Literal :: Float ( f. abs ( ) ) ) ,
471+ } ,
472+
473+ "ceil" => match stack. pop_as_number_or_bail ( ) ? {
474+ Either :: Left ( i) => stack. push_literal ( Literal :: Integral ( i) ) ,
475+ Either :: Right ( f) => stack. push_literal ( Literal :: Float ( f. ceil ( ) ) ) ,
476+ } ,
477+
478+ "floor" => match stack. pop_as_number_or_bail ( ) ? {
479+ Either :: Left ( i) => stack. push_literal ( Literal :: Integral ( i) ) ,
480+ Either :: Right ( f) => stack. push_literal ( Literal :: Float ( f. floor ( ) ) ) ,
481+ } ,
482+
483+ "sin" => match stack. pop_as_number_or_bail ( ) ? {
484+ Either :: Left ( i) => stack. push_literal ( Literal :: Float ( ( i as f64 ) . sin ( ) ) ) ,
485+ Either :: Right ( f) => stack. push_literal ( Literal :: Float ( f. sin ( ) ) ) ,
486+ } ,
487+
488+ "cos" => match stack. pop_as_number_or_bail ( ) ? {
489+ Either :: Left ( i) => stack. push_literal ( Literal :: Float ( ( i as f64 ) . cos ( ) ) ) ,
490+ Either :: Right ( f) => stack. push_literal ( Literal :: Float ( f. cos ( ) ) ) ,
491+ } ,
492+
493+ "tan" => match stack. pop_as_number_or_bail ( ) ? {
494+ Either :: Left ( i) => stack. push_literal ( Literal :: Float ( ( i as f64 ) . tan ( ) ) ) ,
495+ Either :: Right ( f) => stack. push_literal ( Literal :: Float ( f. tan ( ) ) ) ,
496+ } ,
497+
498+ _ => return Err ( EvalError :: UnexpectedRuntimeError ) ,
499+ } ,
535500 }
536501 }
537502
0 commit comments