Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(109)

Side by Side Diff: src/math.js

Issue 28793002: Harmony: implement Math.trunc. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: inline number conversion Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/harmony-math.js ('k') | test/mjsunit/harmony/math-trunc.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 27 matching lines...) Expand all
38 // Instance class name can only be set on functions. That is the only 38 // Instance class name can only be set on functions. That is the only
39 // purpose for MathConstructor. 39 // purpose for MathConstructor.
40 function MathConstructor() {} 40 function MathConstructor() {}
41 var $Math = new MathConstructor(); 41 var $Math = new MathConstructor();
42 42
43 // ------------------------------------------------------------------- 43 // -------------------------------------------------------------------
44 44
45 // ECMA 262 - 15.8.2.1 45 // ECMA 262 - 15.8.2.1
46 function MathAbs(x) { 46 function MathAbs(x) {
47 if (%_IsSmi(x)) return x >= 0 ? x : -x; 47 if (%_IsSmi(x)) return x >= 0 ? x : -x;
48 if (!IS_NUMBER(x)) x = NonNumberToNumber(x); 48 x = TO_NUMBER_INLINE(x);
49 if (x === 0) return 0; // To handle -0. 49 if (x === 0) return 0; // To handle -0.
50 return x > 0 ? x : -x; 50 return x > 0 ? x : -x;
51 } 51 }
52 52
53 // ECMA 262 - 15.8.2.2 53 // ECMA 262 - 15.8.2.2
54 function MathAcos(x) { 54 function MathAcos(x) {
55 if (!IS_NUMBER(x)) x = NonNumberToNumber(x); 55 return %Math_acos(TO_NUMBER_INLINE(x));
56 return %Math_acos(x);
57 } 56 }
58 57
59 // ECMA 262 - 15.8.2.3 58 // ECMA 262 - 15.8.2.3
60 function MathAsin(x) { 59 function MathAsin(x) {
61 if (!IS_NUMBER(x)) x = NonNumberToNumber(x); 60 return %Math_asin(TO_NUMBER_INLINE(x));
62 return %Math_asin(x);
63 } 61 }
64 62
65 // ECMA 262 - 15.8.2.4 63 // ECMA 262 - 15.8.2.4
66 function MathAtan(x) { 64 function MathAtan(x) {
67 if (!IS_NUMBER(x)) x = NonNumberToNumber(x); 65 return %Math_atan(TO_NUMBER_INLINE(x));
68 return %Math_atan(x);
69 } 66 }
70 67
71 // ECMA 262 - 15.8.2.5 68 // ECMA 262 - 15.8.2.5
72 // The naming of y and x matches the spec, as does the order in which 69 // The naming of y and x matches the spec, as does the order in which
73 // ToNumber (valueOf) is called. 70 // ToNumber (valueOf) is called.
74 function MathAtan2(y, x) { 71 function MathAtan2(y, x) {
75 if (!IS_NUMBER(y)) y = NonNumberToNumber(y); 72 return %Math_atan2(TO_NUMBER_INLINE(y), TO_NUMBER_INLINE(x));
76 if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
77 return %Math_atan2(y, x);
78 } 73 }
79 74
80 // ECMA 262 - 15.8.2.6 75 // ECMA 262 - 15.8.2.6
81 function MathCeil(x) { 76 function MathCeil(x) {
82 if (!IS_NUMBER(x)) x = NonNumberToNumber(x); 77 return %Math_ceil(TO_NUMBER_INLINE(x));
83 return %Math_ceil(x);
84 } 78 }
85 79
86 // ECMA 262 - 15.8.2.7 80 // ECMA 262 - 15.8.2.7
87 function MathCos(x) { 81 function MathCos(x) {
88 if (!IS_NUMBER(x)) x = NonNumberToNumber(x); 82 return %_MathCos(TO_NUMBER_INLINE(x));
89 return %_MathCos(x);
90 } 83 }
91 84
92 // ECMA 262 - 15.8.2.8 85 // ECMA 262 - 15.8.2.8
93 function MathExp(x) { 86 function MathExp(x) {
94 if (!IS_NUMBER(x)) x = NonNumberToNumber(x); 87 return %Math_exp(TO_NUMBER_INLINE(x));
95 return %Math_exp(x);
96 } 88 }
97 89
98 // ECMA 262 - 15.8.2.9 90 // ECMA 262 - 15.8.2.9
99 function MathFloor(x) { 91 function MathFloor(x) {
100 if (!IS_NUMBER(x)) x = NonNumberToNumber(x); 92 x = TO_NUMBER_INLINE(x);
101 // It's more common to call this with a positive number that's out 93 // It's more common to call this with a positive number that's out
102 // of range than negative numbers; check the upper bound first. 94 // of range than negative numbers; check the upper bound first.
103 if (x < 0x80000000 && x > 0) { 95 if (x < 0x80000000 && x > 0) {
104 // Numbers in the range [0, 2^31) can be floored by converting 96 // Numbers in the range [0, 2^31) can be floored by converting
105 // them to an unsigned 32-bit value using the shift operator. 97 // them to an unsigned 32-bit value using the shift operator.
106 // We avoid doing so for -0, because the result of Math.floor(-0) 98 // We avoid doing so for -0, because the result of Math.floor(-0)
107 // has to be -0, which wouldn't be the case with the shift. 99 // has to be -0, which wouldn't be the case with the shift.
108 return TO_UINT32(x); 100 return TO_UINT32(x);
109 } else { 101 } else {
110 return %Math_floor(x); 102 return %Math_floor(x);
111 } 103 }
112 } 104 }
113 105
114 // ECMA 262 - 15.8.2.10 106 // ECMA 262 - 15.8.2.10
115 function MathLog(x) { 107 function MathLog(x) {
116 if (!IS_NUMBER(x)) x = NonNumberToNumber(x); 108 return %_MathLog(TO_NUMBER_INLINE(x));
117 return %_MathLog(x);
118 } 109 }
119 110
120 // ECMA 262 - 15.8.2.11 111 // ECMA 262 - 15.8.2.11
121 function MathMax(arg1, arg2) { // length == 2 112 function MathMax(arg1, arg2) { // length == 2
122 var length = %_ArgumentsLength(); 113 var length = %_ArgumentsLength();
123 if (length == 2) { 114 if (length == 2) {
124 if (!IS_NUMBER(arg1)) arg1 = NonNumberToNumber(arg1); 115 arg1 = TO_NUMBER_INLINE(arg1);
125 if (!IS_NUMBER(arg2)) arg2 = NonNumberToNumber(arg2); 116 arg2 = TO_NUMBER_INLINE(arg2);
126 if (arg2 > arg1) return arg2; 117 if (arg2 > arg1) return arg2;
127 if (arg1 > arg2) return arg1; 118 if (arg1 > arg2) return arg1;
128 if (arg1 == arg2) { 119 if (arg1 == arg2) {
129 // Make sure -0 is considered less than +0. -0 is never a Smi, +0 can be 120 // Make sure -0 is considered less than +0. -0 is never a Smi, +0 can be
130 // a Smi or a heap number. 121 // a Smi or a heap number.
131 return (arg1 == 0 && !%_IsSmi(arg1) && 1 / arg1 < 0) ? arg2 : arg1; 122 return (arg1 == 0 && !%_IsSmi(arg1) && 1 / arg1 < 0) ? arg2 : arg1;
132 } 123 }
133 // All comparisons failed, one of the arguments must be NaN. 124 // All comparisons failed, one of the arguments must be NaN.
134 return NAN; 125 return NAN;
135 } 126 }
136 var r = -INFINITY; 127 var r = -INFINITY;
137 for (var i = 0; i < length; i++) { 128 for (var i = 0; i < length; i++) {
138 var n = %_Arguments(i); 129 var n = %_Arguments(i);
139 if (!IS_NUMBER(n)) n = NonNumberToNumber(n); 130 if (!IS_NUMBER(n)) n = NonNumberToNumber(n);
140 // Make sure +0 is considered greater than -0. -0 is never a Smi, +0 can be 131 // Make sure +0 is considered greater than -0. -0 is never a Smi, +0 can be
141 // a Smi or heap number. 132 // a Smi or heap number.
142 if (NUMBER_IS_NAN(n) || n > r || 133 if (NUMBER_IS_NAN(n) || n > r ||
143 (r == 0 && n == 0 && !%_IsSmi(r) && 1 / r < 0)) { 134 (r == 0 && n == 0 && !%_IsSmi(r) && 1 / r < 0)) {
144 r = n; 135 r = n;
145 } 136 }
146 } 137 }
147 return r; 138 return r;
148 } 139 }
149 140
150 // ECMA 262 - 15.8.2.12 141 // ECMA 262 - 15.8.2.12
151 function MathMin(arg1, arg2) { // length == 2 142 function MathMin(arg1, arg2) { // length == 2
152 var length = %_ArgumentsLength(); 143 var length = %_ArgumentsLength();
153 if (length == 2) { 144 if (length == 2) {
154 if (!IS_NUMBER(arg1)) arg1 = NonNumberToNumber(arg1); 145 arg1 = TO_NUMBER_INLINE(arg1);
155 if (!IS_NUMBER(arg2)) arg2 = NonNumberToNumber(arg2); 146 arg2 = TO_NUMBER_INLINE(arg2);
156 if (arg2 > arg1) return arg1; 147 if (arg2 > arg1) return arg1;
157 if (arg1 > arg2) return arg2; 148 if (arg1 > arg2) return arg2;
158 if (arg1 == arg2) { 149 if (arg1 == arg2) {
159 // Make sure -0 is considered less than +0. -0 is never a Smi, +0 can be 150 // Make sure -0 is considered less than +0. -0 is never a Smi, +0 can be
160 // a Smi or a heap number. 151 // a Smi or a heap number.
161 return (arg1 == 0 && !%_IsSmi(arg1) && 1 / arg1 < 0) ? arg1 : arg2; 152 return (arg1 == 0 && !%_IsSmi(arg1) && 1 / arg1 < 0) ? arg1 : arg2;
162 } 153 }
163 // All comparisons failed, one of the arguments must be NaN. 154 // All comparisons failed, one of the arguments must be NaN.
164 return NAN; 155 return NAN;
165 } 156 }
166 var r = INFINITY; 157 var r = INFINITY;
167 for (var i = 0; i < length; i++) { 158 for (var i = 0; i < length; i++) {
168 var n = %_Arguments(i); 159 var n = %_Arguments(i);
169 if (!IS_NUMBER(n)) n = NonNumberToNumber(n); 160 if (!IS_NUMBER(n)) n = NonNumberToNumber(n);
170 // Make sure -0 is considered less than +0. -0 is never a Smi, +0 can be a 161 // Make sure -0 is considered less than +0. -0 is never a Smi, +0 can be a
171 // Smi or a heap number. 162 // Smi or a heap number.
172 if (NUMBER_IS_NAN(n) || n < r || 163 if (NUMBER_IS_NAN(n) || n < r ||
173 (r == 0 && n == 0 && !%_IsSmi(n) && 1 / n < 0)) { 164 (r == 0 && n == 0 && !%_IsSmi(n) && 1 / n < 0)) {
174 r = n; 165 r = n;
175 } 166 }
176 } 167 }
177 return r; 168 return r;
178 } 169 }
179 170
180 // ECMA 262 - 15.8.2.13 171 // ECMA 262 - 15.8.2.13
181 function MathPow(x, y) { 172 function MathPow(x, y) {
182 if (!IS_NUMBER(x)) x = NonNumberToNumber(x); 173 return %_MathPow(TO_NUMBER_INLINE(x), TO_NUMBER_INLINE(y));
183 if (!IS_NUMBER(y)) y = NonNumberToNumber(y);
184 return %_MathPow(x, y);
185 } 174 }
186 175
187 // ECMA 262 - 15.8.2.14 176 // ECMA 262 - 15.8.2.14
188 function MathRandom() { 177 function MathRandom() {
189 return %_RandomHeapNumber(); 178 return %_RandomHeapNumber();
190 } 179 }
191 180
192 // ECMA 262 - 15.8.2.15 181 // ECMA 262 - 15.8.2.15
193 function MathRound(x) { 182 function MathRound(x) {
194 if (!IS_NUMBER(x)) x = NonNumberToNumber(x); 183 return %RoundNumber(TO_NUMBER_INLINE(x));
195 return %RoundNumber(x);
196 } 184 }
197 185
198 // ECMA 262 - 15.8.2.16 186 // ECMA 262 - 15.8.2.16
199 function MathSin(x) { 187 function MathSin(x) {
200 if (!IS_NUMBER(x)) x = NonNumberToNumber(x); 188 return %_MathSin(TO_NUMBER_INLINE(x));
201 return %_MathSin(x);
202 } 189 }
203 190
204 // ECMA 262 - 15.8.2.17 191 // ECMA 262 - 15.8.2.17
205 function MathSqrt(x) { 192 function MathSqrt(x) {
206 if (!IS_NUMBER(x)) x = NonNumberToNumber(x); 193 return %_MathSqrt(TO_NUMBER_INLINE(x));
207 return %_MathSqrt(x);
208 } 194 }
209 195
210 // ECMA 262 - 15.8.2.18 196 // ECMA 262 - 15.8.2.18
211 function MathTan(x) { 197 function MathTan(x) {
212 if (!IS_NUMBER(x)) x = NonNumberToNumber(x); 198 return %_MathTan(TO_NUMBER_INLINE(x));
213 return %_MathTan(x);
214 } 199 }
215 200
216 // Non-standard extension. 201 // Non-standard extension.
217 function MathImul(x, y) { 202 function MathImul(x, y) {
218 if (!IS_NUMBER(x)) x = NonNumberToNumber(x); 203 return %NumberImul(TO_NUMBER_INLINE(x), TO_NUMBER_INLINE(y));
219 if (!IS_NUMBER(y)) y = NonNumberToNumber(y);
220 return %NumberImul(x, y);
221 } 204 }
222 205
223 206
224 // ------------------------------------------------------------------- 207 // -------------------------------------------------------------------
225 208
226 function SetUpMath() { 209 function SetUpMath() {
227 %CheckIsBootstrapping(); 210 %CheckIsBootstrapping();
228 211
229 %SetPrototype($Math, $Object.prototype); 212 %SetPrototype($Math, $Object.prototype);
230 %SetProperty(global, "Math", $Math, DONT_ENUM); 213 %SetProperty(global, "Math", $Math, DONT_ENUM);
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 "tan", MathTan, 272 "tan", MathTan,
290 "atan2", MathAtan2, 273 "atan2", MathAtan2,
291 "pow", MathPow, 274 "pow", MathPow,
292 "max", MathMax, 275 "max", MathMax,
293 "min", MathMin, 276 "min", MathMin,
294 "imul", MathImul 277 "imul", MathImul
295 )); 278 ));
296 } 279 }
297 280
298 SetUpMath(); 281 SetUpMath();
OLDNEW
« no previous file with comments | « src/harmony-math.js ('k') | test/mjsunit/harmony/math-trunc.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698