Wed, 31 Dec 2014 06:09:35 +0100
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 }