js/src/tests/ecma/Expressions/11.7.1.js

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:54ca2049dd1f
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.1.js
9 ECMA Section: 11.7.1 The Left Shift Operator ( << )
10 Description:
11 Performs a bitwise left shift operation on the left argument by the amount
12 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. Left shift Result(5) by Result(7) bits. The result is a signed 32 bit
26 integer.
27 9. Return Result(8).
28
29 Author: christine@netscape.com
30 Date: 12 november 1997
31 */
32 var SECTION = "11.7.1";
33 var VERSION = "ECMA_1";
34 startTest();
35
36 writeHeaderToLog( SECTION + " The left shift operator ( << )");
37
38 for ( power = 0; power < 33; power++ ) {
39 shiftexp = Math.pow( 2, power );
40
41 for ( addexp = 0; addexp < 33; addexp++ ) {
42 new TestCase( SECTION,
43 shiftexp + " << " + addexp,
44 LeftShift( shiftexp, addexp ),
45 shiftexp << addexp );
46 }
47 }
48
49 test();
50
51 function ToInteger( n ) {
52 n = Number( n );
53 var sign = ( n < 0 ) ? -1 : 1;
54
55 if ( n != n ) {
56 return 0;
57 }
58 if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY ) {
59 return n;
60 }
61 return ( sign * Math.floor(Math.abs(n)) );
62 }
63 function ToInt32( n ) {
64 n = Number( n );
65 var sign = ( n < 0 ) ? -1 : 1;
66
67 if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY) {
68 return 0;
69 }
70
71 n = (sign * Math.floor( Math.abs(n) )) % Math.pow(2,32);
72 n = ( n >= Math.pow(2,31) ) ? n - Math.pow(2,32) : n;
73
74 return ( n );
75 }
76 function ToUint32( n ) {
77 n = Number( n );
78 var sign = ( n < 0 ) ? -1 : 1;
79
80 if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY) {
81 return 0;
82 }
83 n = sign * Math.floor( Math.abs(n) )
84
85 n = n % Math.pow(2,32);
86
87 if ( n < 0 ){
88 n += Math.pow(2,32);
89 }
90
91 return ( n );
92 }
93 function ToUint16( n ) {
94 var sign = ( n < 0 ) ? -1 : 1;
95
96 if ( Math.abs( n ) == 0 || Math.abs( n ) == Number.POSITIVE_INFINITY) {
97 return 0;
98 }
99
100 n = ( sign * Math.floor( Math.abs(n) ) ) % Math.pow(2,16);
101
102 if (n <0) {
103 n += Math.pow(2,16);
104 }
105
106 return ( n );
107 }
108 function Mask( b, n ) {
109 b = ToUint32BitString( b );
110 b = b.substring( b.length - n );
111 b = ToUint32Decimal( b );
112 return ( b );
113 }
114 function ToUint32BitString( n ) {
115 var b = "";
116 for ( p = 31; p >=0; p-- ) {
117 if ( n >= Math.pow(2,p) ) {
118 b += "1";
119 n -= Math.pow(2,p);
120 } else {
121 b += "0";
122 }
123 }
124 return b;
125 }
126 function ToInt32BitString( n ) {
127 var b = "";
128 var sign = ( n < 0 ) ? -1 : 1;
129
130 b += ( sign == 1 ) ? "0" : "1";
131
132 for ( p = 30; p >=0; p-- ) {
133 if ( (sign == 1 ) ? sign * n >= Math.pow(2,p) : sign * n > Math.pow(2,p) ) {
134 b += ( sign == 1 ) ? "1" : "0";
135 n -= sign * Math.pow( 2, p );
136 } else {
137 b += ( sign == 1 ) ? "0" : "1";
138 }
139 }
140
141 return b;
142 }
143 function ToInt32Decimal( bin ) {
144 var r = 0;
145 var sign;
146
147 if ( Number(bin.charAt(0)) == 0 ) {
148 sign = 1;
149 r = 0;
150 } else {
151 sign = -1;
152 r = -(Math.pow(2,31));
153 }
154
155 for ( var j = 0; j < 31; j++ ) {
156 r += Math.pow( 2, j ) * Number(bin.charAt(31-j));
157 }
158
159 return r;
160 }
161 function ToUint32Decimal( bin ) {
162 var r = 0;
163
164
165 for ( l = bin.length; l < 32; l++ ) {
166 bin = "0" + bin;
167 }
168
169 for ( j = 0; j < 31; j++ ) {
170 r += Math.pow( 2, j ) * Number(bin.charAt(31-j));
171
172 }
173
174 return r;
175 }
176 function LeftShift( s, a ) {
177 var shift = ToInt32( s );
178 var add = ToUint32( a );
179 add = Mask( add, 5 );
180 var exp = LShift( shift, add );
181
182 return ( exp );
183 }
184 function LShift( s, a ) {
185 s = ToInt32BitString( s );
186
187 for ( var z = 0; z < a; z++ ) {
188 s += "0";
189 }
190
191 s = s.substring( a, s.length);
192
193 return ToInt32(ToInt32Decimal(s));
194 }

mercurial