13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Keep reference to original values of some global properties.  This
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// has the added benefit that the code in this file is isolated from
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// changes to these properties.
323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar $floor = MathFloor;
333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar $random = MathRandom;
343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar $abs = MathAbs;
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Instance class name can only be set on functions. That is the only
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// purpose for MathConstructor.
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MathConstructor() {}
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block%FunctionSetInstanceClassName(MathConstructor, 'Math');
403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvar $Math = new MathConstructor();
41589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch$Math.__proto__ = $Object.prototype;
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block%SetProperty(global, "Math", $Math, DONT_ENUM);
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ECMA 262 - 15.8.2.1
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MathAbs(x) {
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (%_IsSmi(x)) return x >= 0 ? x : -x;
47086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  if (x === 0) return 0;  // To handle -0.
496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return x > 0 ? x : -x;
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ECMA 262 - 15.8.2.2
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MathAcos(x) {
54086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return %Math_acos(x);
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ECMA 262 - 15.8.2.3
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MathAsin(x) {
60086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return %Math_asin(x);
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ECMA 262 - 15.8.2.4
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MathAtan(x) {
66086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return %Math_atan(x);
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ECMA 262 - 15.8.2.5
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The naming of y and x matches the spec, as does the order in which
72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ToNumber (valueOf) is called.
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MathAtan2(y, x) {
74086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!IS_NUMBER(y)) y = NonNumberToNumber(y);
75086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return %Math_atan2(y, x);
77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ECMA 262 - 15.8.2.6
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MathCeil(x) {
81086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return %Math_ceil(x);
83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ECMA 262 - 15.8.2.7
86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MathCos(x) {
87086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return %_MathCos(x);
89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ECMA 262 - 15.8.2.8
92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MathExp(x) {
93086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return %Math_exp(x);
95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ECMA 262 - 15.8.2.9
98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MathFloor(x) {
99086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // It's more common to call this with a positive number that's out
101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // of range than negative numbers; check the upper bound first.
102e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  if (x < 0x80000000 && x > 0) {
103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // Numbers in the range [0, 2^31) can be floored by converting
104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // them to an unsigned 32-bit value using the shift operator.
105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // We avoid doing so for -0, because the result of Math.floor(-0)
106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    // has to be -0, which wouldn't be the case with the shift.
107e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke    return TO_UINT32(x);
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return %Math_floor(x);
110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ECMA 262 - 15.8.2.10
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MathLog(x) {
115086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return %_MathLog(x);
117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ECMA 262 - 15.8.2.11
120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MathMax(arg1, arg2) {  // length == 2
121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var length = %_ArgumentsLength();
1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (length == 2) {
1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!IS_NUMBER(arg1)) arg1 = NonNumberToNumber(arg1);
1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!IS_NUMBER(arg2)) arg2 = NonNumberToNumber(arg2);
1253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (arg2 > arg1) return arg2;
1263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (arg1 > arg2) return arg1;
1273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (arg1 == arg2) {
1283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      // Make sure -0 is considered less than +0.  -0 is never a Smi, +0 can be
1293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      // a Smi or a heap number.
1303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return (arg1 == 0 && !%_IsSmi(arg1) && 1 / arg1 < 0) ? arg2 : arg1;
1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // All comparisons failed, one of the arguments must be NaN.
1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return 0/0;  // Compiler constant-folds this to NaN.
1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
135d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  if (length == 0) {
136d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    return -1/0;  // Compiler constant-folds this to -Infinity.
137d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  }
138d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  var r = arg1;
139086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!IS_NUMBER(r)) r = NonNumberToNumber(r);
140d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  if (NUMBER_IS_NAN(r)) return r;
141d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  for (var i = 1; i < length; i++) {
142d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    var n = %_Arguments(i);
143086aeeaae12517475c22695a200be45495516549Ben Murdoch    if (!IS_NUMBER(n)) n = NonNumberToNumber(n);
144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (NUMBER_IS_NAN(n)) return n;
145e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke    // Make sure +0 is considered greater than -0.  -0 is never a Smi, +0 can be
146e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke    // a Smi or heap number.
1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (n > r || (r == 0 && n == 0 && !%_IsSmi(r) && 1 / r < 0)) r = n;
148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return r;
150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ECMA 262 - 15.8.2.12
153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MathMin(arg1, arg2) {  // length == 2
154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  var length = %_ArgumentsLength();
1553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (length == 2) {
1563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!IS_NUMBER(arg1)) arg1 = NonNumberToNumber(arg1);
1573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!IS_NUMBER(arg2)) arg2 = NonNumberToNumber(arg2);
1583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (arg2 > arg1) return arg1;
1593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (arg1 > arg2) return arg2;
1603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (arg1 == arg2) {
1613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      // Make sure -0 is considered less than +0.  -0 is never a Smi, +0 can be
1623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      // a Smi or a heap number.
1633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return (arg1 == 0 && !%_IsSmi(arg1) && 1 / arg1 < 0) ? arg1 : arg2;
1643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
1653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // All comparisons failed, one of the arguments must be NaN.
1663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return 0/0;  // Compiler constant-folds this to NaN.
1673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
168d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  if (length == 0) {
169d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    return 1/0;  // Compiler constant-folds this to Infinity.
170d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  }
171d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  var r = arg1;
172086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!IS_NUMBER(r)) r = NonNumberToNumber(r);
173d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  if (NUMBER_IS_NAN(r)) return r;
174d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  for (var i = 1; i < length; i++) {
175d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    var n = %_Arguments(i);
176086aeeaae12517475c22695a200be45495516549Ben Murdoch    if (!IS_NUMBER(n)) n = NonNumberToNumber(n);
177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (NUMBER_IS_NAN(n)) return n;
1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Make sure -0 is considered less than +0.  -0 is never a Smi, +0 can be a
179e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke    // Smi or a heap number.
1803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (n < r || (r == 0 && n == 0 && !%_IsSmi(n) && 1 / n < 0)) r = n;
181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return r;
183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ECMA 262 - 15.8.2.13
186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MathPow(x, y) {
187086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
188086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!IS_NUMBER(y)) y = NonNumberToNumber(y);
1896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return %_MathPow(x, y);
190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ECMA 262 - 15.8.2.14
193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MathRandom() {
1946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return %_RandomHeapNumber();
195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ECMA 262 - 15.8.2.15
198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MathRound(x) {
199086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
2006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return %RoundNumber(x);
201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ECMA 262 - 15.8.2.16
204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MathSin(x) {
205086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
2066ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return %_MathSin(x);
207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ECMA 262 - 15.8.2.17
210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MathSqrt(x) {
211086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
2126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return %_MathSqrt(x);
213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ECMA 262 - 15.8.2.18
216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction MathTan(x) {
217086aeeaae12517475c22695a200be45495516549Ben Murdoch  if (!IS_NUMBER(x)) x = NonNumberToNumber(x);
2183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return %_MathTan(x);
219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// -------------------------------------------------------------------
223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
224589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochfunction SetUpMath() {
225589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  %CheckIsBootstrapping();
226589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  // Set up math constants.
227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // ECMA-262, section 15.8.1.1.
228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  %OptimizeObjectForAddingMultipleProperties($Math, 8);
229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  %SetProperty($Math,
230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               "E",
231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               2.7182818284590452354,
232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               DONT_ENUM |  DONT_DELETE | READ_ONLY);
233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // ECMA-262, section 15.8.1.2.
234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  %SetProperty($Math,
235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               "LN10",
236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               2.302585092994046,
237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               DONT_ENUM |  DONT_DELETE | READ_ONLY);
238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // ECMA-262, section 15.8.1.3.
239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  %SetProperty($Math,
240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               "LN2",
241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               0.6931471805599453,
242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               DONT_ENUM |  DONT_DELETE | READ_ONLY);
243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // ECMA-262, section 15.8.1.4.
244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  %SetProperty($Math,
245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               "LOG2E",
246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               1.4426950408889634,
247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               DONT_ENUM |  DONT_DELETE | READ_ONLY);
248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  %SetProperty($Math,
249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               "LOG10E",
2501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block               0.4342944819032518,
251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               DONT_ENUM |  DONT_DELETE | READ_ONLY);
252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  %SetProperty($Math,
253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               "PI",
254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               3.1415926535897932,
255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               DONT_ENUM |  DONT_DELETE | READ_ONLY);
256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  %SetProperty($Math,
257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               "SQRT1_2",
258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               0.7071067811865476,
259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               DONT_ENUM |  DONT_DELETE | READ_ONLY);
260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  %SetProperty($Math,
261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               "SQRT2",
262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               1.4142135623730951,
263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               DONT_ENUM |  DONT_DELETE | READ_ONLY);
264402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  %ToFastProperties($Math);
265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
266589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  // Set up non-enumerable functions of the Math object and
267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // set their names.
2683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InstallFunctions($Math, DONT_ENUM, $Array(
269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    "random", MathRandom,
270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    "abs", MathAbs,
271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    "acos", MathAcos,
272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    "asin", MathAsin,
273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    "atan", MathAtan,
274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    "ceil", MathCeil,
275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    "cos", MathCos,
276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    "exp", MathExp,
277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    "floor", MathFloor,
278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    "log", MathLog,
279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    "round", MathRound,
280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    "sin", MathSin,
281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    "sqrt", MathSqrt,
282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    "tan", MathTan,
283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    "atan2", MathAtan2,
284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    "pow", MathPow,
285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    "max", MathMax,
286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    "min", MathMin
287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ));
288589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
290589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochSetUpMath();
291