js/src/tests/ecma/Expressions/11.7.2.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     7 /**
     8    File Name:          11.7.2.js
     9    ECMA Section:       11.7.2  The signed right shift operator ( >> )
    10    Description:
    11    Performs a sign-filling bitwise right shift operation on the left argument
    12    by the amount specified by the right argument.
    14    The production ShiftExpression : ShiftExpression >> AdditiveExpression is
    15    evaluated as follows:
    17    1.  Evaluate ShiftExpression.
    18    2.  Call GetValue(Result(1)).
    19    3.  Evaluate AdditiveExpression.
    20    4.  Call GetValue(Result(3)).
    21    5.  Call ToInt32(Result(2)).
    22    6.  Call ToUint32(Result(4)).
    23    7.  Mask out all but the least significant 5 bits of Result(6), that is,
    24    compute Result(6) & 0x1F.
    25    8.  Perform sign-extending right shift of Result(5) by Result(7) bits. The
    26    most significant bit is propagated. The result is a signed 32 bit
    27    integer.
    28    9.  Return Result(8).
    30    Author:             christine@netscape.com
    31    Date:               12 november 1997
    32 */
    33 var SECTION = "11.7.2";
    34 var VERSION = "ECMA_1";
    35 startTest();
    37 writeHeaderToLog( SECTION + "  The signed right shift operator ( >> )");
    39 var power = 0;
    40 var addexp = 0;
    42 for ( power = 0; power <= 32; power++ ) {
    43   shiftexp = Math.pow( 2, power );
    45   for ( addexp = 0; addexp <= 32; addexp++ ) {
    46     new TestCase( SECTION,
    47 		  shiftexp + " >> " + addexp,
    48 		  SignedRightShift( shiftexp, addexp ),
    49 		  shiftexp >> addexp );
    50   }
    51 }
    53 for ( power = 0; power <= 32; power++ ) {
    54   shiftexp = -Math.pow( 2, power );
    56   for ( addexp = 0; addexp <= 32; addexp++ ) {
    57     new TestCase( SECTION,
    58 		  shiftexp + " >> " + addexp,
    59 		  SignedRightShift( shiftexp, addexp ),
    60 		  shiftexp >> addexp );
    61   }
    62 }
    64 test();
    66 function ToInteger( n ) {
    67   n = Number( n );
    68   var sign = ( n < 0 ) ? -1 : 1;
    70   if ( n != n ) {
    71     return 0;
    72   }
    73   if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY ) {
    74     return n;
    75   }
    76   return ( sign * Math.floor(Math.abs(n)) );
    77 }
    78 function ToInt32( n ) {
    79   n = Number( n );
    80   var sign = ( n < 0 ) ? -1 : 1;
    82   if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY) {
    83     return 0;
    84   }
    86   n = (sign * Math.floor( Math.abs(n) )) % Math.pow(2,32);
    87   n = ( n >= Math.pow(2,31) ) ? n - Math.pow(2,32) : n;
    89   return ( n );
    90 }
    91 function ToUint32( n ) {
    92   n = Number( n );
    93   var sign = ( n < 0 ) ? -1 : 1;
    95   if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY) {
    96     return 0;
    97   }
    98   n = sign * Math.floor( Math.abs(n) )
   100     n = n % Math.pow(2,32);
   102   if ( n < 0 ){
   103     n += Math.pow(2,32);
   104   }
   106   return ( n );
   107 }
   108 function ToUint16( n ) {
   109   var sign = ( n < 0 ) ? -1 : 1;
   111   if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY) {
   112     return 0;
   113   }
   115   n = ( sign * Math.floor( Math.abs(n) ) ) % Math.pow(2,16);
   117   if (n <0) {
   118     n += Math.pow(2,16);
   119   }
   121   return ( n );
   122 }
   123 function Mask( b, n ) {
   124   b = ToUint32BitString( b );
   125   b = b.substring( b.length - n );
   126   b = ToUint32Decimal( b );
   127   return ( b );
   128 }
   129 function ToUint32BitString( n ) {
   130   var b = "";
   131   for ( p = 31; p >=0; p-- ) {
   132     if ( n >= Math.pow(2,p) ) {
   133       b += "1";
   134       n -= Math.pow(2,p);
   135     } else {
   136       b += "0";
   137     }
   138   }
   139   return b;
   140 }
   141 function ToInt32BitString( n ) {
   142   var b = "";
   143   var sign = ( n < 0 ) ? -1 : 1;
   145   b += ( sign == 1 ) ? "0" : "1";
   147   for ( p = 30; p >=0; p-- ) {
   148     if ( (sign == 1 ) ? sign * n >= Math.pow(2,p) : sign * n > Math.pow(2,p) ) {
   149       b += ( sign == 1 ) ? "1" : "0";
   150       n -= sign * Math.pow( 2, p );
   151     } else {
   152       b += ( sign == 1 ) ? "0" : "1";
   153     }
   154   }
   156   return b;
   157 }
   158 function ToInt32Decimal( bin ) {
   159   var r = 0;
   160   var sign;
   162   if ( Number(bin.charAt(0)) == 0 ) {
   163     sign = 1;
   164     r = 0;
   165   } else {
   166     sign = -1;
   167     r = -(Math.pow(2,31));
   168   }
   170   for ( var j = 0; j < 31; j++ ) {
   171     r += Math.pow( 2, j ) * Number(bin.charAt(31-j));
   172   }
   174   return r;
   175 }
   176 function ToUint32Decimal( bin ) {
   177   var r = 0;
   179   for ( l = bin.length; l < 32; l++ ) {
   180     bin = "0" + bin;
   181   }
   183   for ( j = 0; j < 31; j++ ) {
   184     r += Math.pow( 2, j ) * Number(bin.charAt(31-j));
   185   }
   187   return r;
   188 }
   189 function SignedRightShift( s, a ) {
   190   s = ToInt32( s );
   191   a = ToUint32( a );
   192   a = Mask( a, 5 );
   193   return ( SignedRShift( s, a ) );
   194 }
   195 function SignedRShift( s, a ) {
   196   s = ToInt32BitString( s );
   198   var firstbit = s.substring(0,1);
   200   s = s.substring( 1, s.length );
   202   for ( var z = 0; z < a; z++ ) {
   203     s = firstbit + s;
   204   }
   206   s = s.substring( 0, s.length - a);
   208   s = firstbit +s;
   211   return ToInt32(ToInt32Decimal(s));
   212 }

mercurial