js/src/tests/ecma/Expressions/11.7.3.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.3.js
     9    ECMA Section:       11.7.3  The unsigned right shift operator ( >>> )
    10    Description:
    11    11.7.3 The unsigned right shift operator ( >>> )
    12    Performs a zero-filling bitwise right shift operation on the left argument
    13    by the amount specified by the right argument.
    15    The production ShiftExpression : ShiftExpression >>> AdditiveExpression is
    16    evaluated as follows:
    18    1.  Evaluate ShiftExpression.
    19    2.  Call GetValue(Result(1)).
    20    3.  Evaluate AdditiveExpression.
    21    4.  Call GetValue(Result(3)).
    22    5.  Call ToUint32(Result(2)).
    23    6.  Call ToUint32(Result(4)).
    24    7.  Mask out all but the least significant 5 bits of Result(6), that is,
    25    compute Result(6) & 0x1F.
    26    8.  Perform zero-filling right shift of Result(5) by Result(7) bits.
    27    Vacated bits are filled with zero. The result is an unsigned 32 bit
    28    integer.
    29    9.  Return Result(8).
    31    Author:             christine@netscape.com
    32    Date:               12 november 1997
    33 */
    34 var SECTION = "11.7.3";
    35 var VERSION = "ECMA_1";
    36 startTest();
    38 writeHeaderToLog( SECTION + "  The unsigned right shift operator ( >>> )");
    40 var addexp = 0;
    41 var power = 0;
    43 for ( power = 0; power <= 32; power++ ) {
    44   shiftexp = Math.pow( 2, power );
    46   for ( addexp = 0; addexp <= 32; addexp++ ) {
    47     new TestCase( SECTION,
    48                   shiftexp + " >>> " + addexp,
    49                   UnsignedRightShift( shiftexp, addexp ),
    50                   shiftexp >>> addexp );
    51   }
    52 }
    54 test();
    57 function ToInteger( n ) {
    58   n = Number( n );
    59   var sign = ( n < 0 ) ? -1 : 1;
    61   if ( n != n ) {
    62     return 0;
    63   }
    64   if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY ) {
    65     return n;
    66   }
    67   return ( sign * Math.floor(Math.abs(n)) );
    68 }
    69 function ToInt32( n ) {
    70   n = Number( n );
    71   var sign = ( n < 0 ) ? -1 : 1;
    73   if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY) {
    74     return 0;
    75   }
    77   n = (sign * Math.floor( Math.abs(n) )) % Math.pow(2,32);
    78   n = ( n >= Math.pow(2,31) ) ? n - Math.pow(2,32) : n;
    80   return ( n );
    81 }
    82 function ToUint32( n ) {
    83   n = Number( n );
    84   var sign = ( n < 0 ) ? -1 : 1;
    86   if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY) {
    87     return 0;
    88   }
    89   n = sign * Math.floor( Math.abs(n) )
    91     n = n % Math.pow(2,32);
    93   if ( n < 0 ){
    94     n += Math.pow(2,32);
    95   }
    97   return ( n );
    98 }
    99 function ToUint16( n ) {
   100   var sign = ( n < 0 ) ? -1 : 1;
   102   if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY) {
   103     return 0;
   104   }
   106   n = ( sign * Math.floor( Math.abs(n) ) ) % Math.pow(2,16);
   108   if (n <0) {
   109     n += Math.pow(2,16);
   110   }
   112   return ( n );
   113 }
   114 function Mask( b, n ) {
   115   b = ToUint32BitString( b );
   116   b = b.substring( b.length - n );
   117   b = ToUint32Decimal( b );
   118   return ( b );
   119 }
   120 function ToUint32BitString( n ) {
   121   var b = "";
   122   for ( p = 31; p >=0; p-- ) {
   123     if ( n >= Math.pow(2,p) ) {
   124       b += "1";
   125       n -= Math.pow(2,p);
   126     } else {
   127       b += "0";
   128     }
   129   }
   130   return b;
   131 }
   132 function ToInt32BitString( n ) {
   133   var b = "";
   134   var sign = ( n < 0 ) ? -1 : 1;
   136   b += ( sign == 1 ) ? "0" : "1";
   138   for ( p = 30; p >=0; p-- ) {
   139     if ( (sign == 1 ) ? sign * n >= Math.pow(2,p) : sign * n > Math.pow(2,p) ) {
   140       b += ( sign == 1 ) ? "1" : "0";
   141       n -= sign * Math.pow( 2, p );
   142     } else {
   143       b += ( sign == 1 ) ? "0" : "1";
   144     }
   145   }
   147   return b;
   148 }
   149 function ToInt32Decimal( bin ) {
   150   var r = 0;
   151   var sign;
   153   if ( Number(bin.charAt(0)) == 0 ) {
   154     sign = 1;
   155     r = 0;
   156   } else {
   157     sign = -1;
   158     r = -(Math.pow(2,31));
   159   }
   161   for ( var j = 0; j < 31; j++ ) {
   162     r += Math.pow( 2, j ) * Number(bin.charAt(31-j));
   163   }
   165   return r;
   166 }
   167 function ToUint32Decimal( bin ) {
   168   var r = 0;
   171   for ( l = bin.length; l < 32; l++ ) {
   172     bin = "0" + bin;
   173   }
   175   for ( j = 0; j < 32; j++ ) {
   176     r += Math.pow( 2, j ) * Number(bin.charAt(31-j));
   178   }
   180   return r;
   181 }
   182 function RShift( s, a ) {
   183   s = ToUint32BitString( s );
   184   for ( z = 0; z < a; z++ ) {
   185     s = "0" + s;
   186   }
   187   s = s.substring( 0, s.length - a );
   189   return ToUint32Decimal(s);
   190 }
   191 function UnsignedRightShift( s, a ) {
   192   s = ToUint32( s );
   193   a = ToUint32( a );
   194   a = Mask( a, 5 );
   195   return ( RShift( s, a ) );
   196 }

mercurial