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.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 }