@@ -633,13 +633,6 @@ impl SimplifyExpr {
633
633
634
634
// Bit shift operations
635
635
op ! ( "<<" ) | op ! ( ">>" ) | op ! ( ">>>" ) => {
636
- /// Uses a method for treating a double as 32bits that is
637
- /// equivalent to how JavaScript would convert a
638
- /// number before applying a bit operation.
639
- fn js_convert_double_to_bits ( d : f64 ) -> i32 {
640
- ( ( d. floor ( ) as i64 ) & 0xffff_ffff ) as i32
641
- }
642
-
643
636
fn try_fold_shift (
644
637
ctx : & ExprCtx ,
645
638
op : BinaryOp ,
@@ -654,38 +647,12 @@ impl SimplifyExpr {
654
647
( Known ( lv) , Known ( rv) ) => ( lv, rv) ,
655
648
_ => unreachable ! ( ) ,
656
649
} ;
657
-
658
- // only the lower 5 bits are used when shifting, so don't do anything
659
- // if the shift amount is outside [0,32)
660
- if !( 0.0 ..32.0 ) . contains ( & rv) {
661
- return Unknown ;
662
- }
663
-
664
- let rv_int = rv as i32 ;
665
- if rv_int as f64 != rv {
666
- unimplemented ! ( "error reporting: FRACTIONAL_BITWISE_OPERAND" )
667
- // report(FRACTIONAL_BITWISE_OPERAND, right.span());
668
- // return n;
669
- }
670
-
671
- if lv. floor ( ) != lv {
672
- unimplemented ! ( "error reporting: FRACTIONAL_BITWISE_OPERAND" )
673
- // report(FRACTIONAL_BITWISE_OPERAND, left.span());
674
- // return n;
675
- }
676
-
677
- let bits = js_convert_double_to_bits ( lv) ;
650
+ let ( lv, rv) = ( JsNumber :: from ( lv) , JsNumber :: from ( rv) ) ;
678
651
679
652
Known ( match op {
680
- op ! ( "<<" ) => ( bits << rv_int) as f64 ,
681
- op ! ( ">>" ) => ( bits >> rv_int) as f64 ,
682
- op ! ( ">>>" ) => {
683
- let res = bits as u32 >> rv_int as u32 ;
684
- // JavaScript always treats the result of >>> as unsigned.
685
- // We must force Java to do the same here.
686
- // unimplemented!(">>> (Zerofill rshift)")
687
- res as f64
688
- }
653
+ op ! ( "<<" ) => * ( lv << rv) ,
654
+ op ! ( ">>" ) => * ( lv >> rv) ,
655
+ op ! ( ">>>" ) => * ( lv. unsigned_shr ( rv) ) ,
689
656
690
657
_ => unreachable ! ( "Unknown bit operator {:?}" , op) ,
691
658
} )
0 commit comments