OLD | NEW |
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 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 | 110 |
111 // ECMA 262 - 15.8.2.11 | 111 // ECMA 262 - 15.8.2.11 |
112 function MathMax(arg1, arg2) { // length == 2 | 112 function MathMax(arg1, arg2) { // length == 2 |
113 var length = %_ArgumentsLength(); | 113 var length = %_ArgumentsLength(); |
114 if (length == 2) { | 114 if (length == 2) { |
115 arg1 = TO_NUMBER_INLINE(arg1); | 115 arg1 = TO_NUMBER_INLINE(arg1); |
116 arg2 = TO_NUMBER_INLINE(arg2); | 116 arg2 = TO_NUMBER_INLINE(arg2); |
117 if (arg2 > arg1) return arg2; | 117 if (arg2 > arg1) return arg2; |
118 if (arg1 > arg2) return arg1; | 118 if (arg1 > arg2) return arg1; |
119 if (arg1 == arg2) { | 119 if (arg1 == arg2) { |
120 // 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. |
121 // a Smi or a heap number. | 121 return (arg1 === 0 && %_IsMinusZero(arg1)) ? arg2 : arg1; |
122 return (arg1 == 0 && !%_IsSmi(arg1) && 1 / arg1 < 0) ? arg2 : arg1; | |
123 } | 122 } |
124 // All comparisons failed, one of the arguments must be NaN. | 123 // All comparisons failed, one of the arguments must be NaN. |
125 return NAN; | 124 return NAN; |
126 } | 125 } |
127 var r = -INFINITY; | 126 var r = -INFINITY; |
128 for (var i = 0; i < length; i++) { | 127 for (var i = 0; i < length; i++) { |
129 var n = %_Arguments(i); | 128 var n = %_Arguments(i); |
130 if (!IS_NUMBER(n)) n = NonNumberToNumber(n); | 129 if (!IS_NUMBER(n)) n = NonNumberToNumber(n); |
131 // Make sure +0 is considered greater than -0. -0 is never a Smi, +0 can be | 130 // Make sure +0 is considered greater than -0. |
132 // a Smi or heap number. | 131 if (NUMBER_IS_NAN(n) || n > r || (r === 0 && n === 0 && %_IsMinusZero(r))) { |
133 if (NUMBER_IS_NAN(n) || n > r || | |
134 (r == 0 && n == 0 && !%_IsSmi(r) && 1 / r < 0)) { | |
135 r = n; | 132 r = n; |
136 } | 133 } |
137 } | 134 } |
138 return r; | 135 return r; |
139 } | 136 } |
140 | 137 |
141 // ECMA 262 - 15.8.2.12 | 138 // ECMA 262 - 15.8.2.12 |
142 function MathMin(arg1, arg2) { // length == 2 | 139 function MathMin(arg1, arg2) { // length == 2 |
143 var length = %_ArgumentsLength(); | 140 var length = %_ArgumentsLength(); |
144 if (length == 2) { | 141 if (length == 2) { |
145 arg1 = TO_NUMBER_INLINE(arg1); | 142 arg1 = TO_NUMBER_INLINE(arg1); |
146 arg2 = TO_NUMBER_INLINE(arg2); | 143 arg2 = TO_NUMBER_INLINE(arg2); |
147 if (arg2 > arg1) return arg1; | 144 if (arg2 > arg1) return arg1; |
148 if (arg1 > arg2) return arg2; | 145 if (arg1 > arg2) return arg2; |
149 if (arg1 == arg2) { | 146 if (arg1 == arg2) { |
150 // Make sure -0 is considered less than +0. -0 is never a Smi, +0 can be | 147 // Make sure -0 is considered less than +0. |
151 // a Smi or a heap number. | 148 return (arg1 === 0 && %_IsMinusZero(arg1)) ? arg1 : arg2; |
152 return (arg1 == 0 && !%_IsSmi(arg1) && 1 / arg1 < 0) ? arg1 : arg2; | |
153 } | 149 } |
154 // All comparisons failed, one of the arguments must be NaN. | 150 // All comparisons failed, one of the arguments must be NaN. |
155 return NAN; | 151 return NAN; |
156 } | 152 } |
157 var r = INFINITY; | 153 var r = INFINITY; |
158 for (var i = 0; i < length; i++) { | 154 for (var i = 0; i < length; i++) { |
159 var n = %_Arguments(i); | 155 var n = %_Arguments(i); |
160 if (!IS_NUMBER(n)) n = NonNumberToNumber(n); | 156 if (!IS_NUMBER(n)) n = NonNumberToNumber(n); |
161 // Make sure -0 is considered less than +0. -0 is never a Smi, +0 can be a | 157 // Make sure -0 is considered less than +0. |
162 // Smi or a heap number. | 158 if (NUMBER_IS_NAN(n) || n < r || (r === 0 && n === 0 && %_IsMinusZero(n))) { |
163 if (NUMBER_IS_NAN(n) || n < r || | |
164 (r == 0 && n == 0 && !%_IsSmi(n) && 1 / n < 0)) { | |
165 r = n; | 159 r = n; |
166 } | 160 } |
167 } | 161 } |
168 return r; | 162 return r; |
169 } | 163 } |
170 | 164 |
171 // ECMA 262 - 15.8.2.13 | 165 // ECMA 262 - 15.8.2.13 |
172 function MathPow(x, y) { | 166 function MathPow(x, y) { |
173 return %_MathPow(TO_NUMBER_INLINE(x), TO_NUMBER_INLINE(y)); | 167 return %_MathPow(TO_NUMBER_INLINE(x), TO_NUMBER_INLINE(y)); |
174 } | 168 } |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 "tan", MathTan, | 266 "tan", MathTan, |
273 "atan2", MathAtan2, | 267 "atan2", MathAtan2, |
274 "pow", MathPow, | 268 "pow", MathPow, |
275 "max", MathMax, | 269 "max", MathMax, |
276 "min", MathMin, | 270 "min", MathMin, |
277 "imul", MathImul | 271 "imul", MathImul |
278 )); | 272 )); |
279 } | 273 } |
280 | 274 |
281 SetUpMath(); | 275 SetUpMath(); |
OLD | NEW |