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

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:77668aa9c267
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/. */
5
6
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.
13
14 The production ShiftExpression : ShiftExpression >> AdditiveExpression is
15 evaluated as follows:
16
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).
29
30 Author: christine@netscape.com
31 Date: 12 november 1997
32 */
33 var SECTION = "11.7.2";
34 var VERSION = "ECMA_1";
35 startTest();
36
37 writeHeaderToLog( SECTION + " The signed right shift operator ( >> )");
38
39 var power = 0;
40 var addexp = 0;
41
42 for ( power = 0; power <= 32; power++ ) {
43 shiftexp = Math.pow( 2, power );
44
45 for ( addexp = 0; addexp <= 32; addexp++ ) {
46 new TestCase( SECTION,
47 shiftexp + " >> " + addexp,
48 SignedRightShift( shiftexp, addexp ),
49 shiftexp >> addexp );
50 }
51 }
52
53 for ( power = 0; power <= 32; power++ ) {
54 shiftexp = -Math.pow( 2, power );
55
56 for ( addexp = 0; addexp <= 32; addexp++ ) {
57 new TestCase( SECTION,
58 shiftexp + " >> " + addexp,
59 SignedRightShift( shiftexp, addexp ),
60 shiftexp >> addexp );
61 }
62 }
63
64 test();
65
66 function ToInteger( n ) {
67 n = Number( n );
68 var sign = ( n < 0 ) ? -1 : 1;
69
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;
81
82 if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY) {
83 return 0;
84 }
85
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;
88
89 return ( n );
90 }
91 function ToUint32( n ) {
92 n = Number( n );
93 var sign = ( n < 0 ) ? -1 : 1;
94
95 if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY) {
96 return 0;
97 }
98 n = sign * Math.floor( Math.abs(n) )
99
100 n = n % Math.pow(2,32);
101
102 if ( n < 0 ){
103 n += Math.pow(2,32);
104 }
105
106 return ( n );
107 }
108 function ToUint16( n ) {
109 var sign = ( n < 0 ) ? -1 : 1;
110
111 if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY) {
112 return 0;
113 }
114
115 n = ( sign * Math.floor( Math.abs(n) ) ) % Math.pow(2,16);
116
117 if (n <0) {
118 n += Math.pow(2,16);
119 }
120
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;
144
145 b += ( sign == 1 ) ? "0" : "1";
146
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 }
155
156 return b;
157 }
158 function ToInt32Decimal( bin ) {
159 var r = 0;
160 var sign;
161
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 }
169
170 for ( var j = 0; j < 31; j++ ) {
171 r += Math.pow( 2, j ) * Number(bin.charAt(31-j));
172 }
173
174 return r;
175 }
176 function ToUint32Decimal( bin ) {
177 var r = 0;
178
179 for ( l = bin.length; l < 32; l++ ) {
180 bin = "0" + bin;
181 }
182
183 for ( j = 0; j < 31; j++ ) {
184 r += Math.pow( 2, j ) * Number(bin.charAt(31-j));
185 }
186
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 );
197
198 var firstbit = s.substring(0,1);
199
200 s = s.substring( 1, s.length );
201
202 for ( var z = 0; z < a; z++ ) {
203 s = firstbit + s;
204 }
205
206 s = s.substring( 0, s.length - a);
207
208 s = firstbit +s;
209
210
211 return ToInt32(ToInt32Decimal(s));
212 }

mercurial