18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Copyright (C) 2007, 2008 Apple Inc. All Rights Reserved.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  This library is free software; you can redistribute it and/or
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  modify it under the terms of the GNU Lesser General Public
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  License as published by the Free Software Foundation; either
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  version 2 of the License, or (at your option) any later version.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  This library is distributed in the hope that it will be useful,
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  but WITHOUT ANY WARRANTY; without even the implied warranty of
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Lesser General Public License for more details.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  You should have received a copy of the GNU Lesser General Public
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  License along with this library; if not, write to the Free Software
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MathObject.h"
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "Lookup.h"
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ObjectPrototype.h"
26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Operations.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <time.h>
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Assertions.h>
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/MathExtras.h>
30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/RandomNumber.h>
31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/RandomNumberSeed.h>
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC {
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectASSERT_CLASS_FITS_IN_CELL(MathObject);
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL mathProtoFuncAbs(ExecState*);
38545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL mathProtoFuncACos(ExecState*);
39545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL mathProtoFuncASin(ExecState*);
40545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL mathProtoFuncATan(ExecState*);
41545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL mathProtoFuncATan2(ExecState*);
42545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL mathProtoFuncCeil(ExecState*);
43545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL mathProtoFuncCos(ExecState*);
44545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL mathProtoFuncExp(ExecState*);
45545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL mathProtoFuncFloor(ExecState*);
46545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL mathProtoFuncLog(ExecState*);
47545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL mathProtoFuncMax(ExecState*);
48545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL mathProtoFuncMin(ExecState*);
49545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL mathProtoFuncPow(ExecState*);
50545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL mathProtoFuncRandom(ExecState*);
51545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL mathProtoFuncRound(ExecState*);
52545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL mathProtoFuncSin(ExecState*);
53545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL mathProtoFuncSqrt(ExecState*);
54545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic EncodedJSValue JSC_HOST_CALL mathProtoFuncTan(ExecState*);
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MathObject.lut.h"
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC {
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ------------------------------ MathObject --------------------------------
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochconst ClassInfo MathObject::s_info = { "Math", &JSObjectWithGlobalObject::s_info, 0, ExecState::mathTable };
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* Source for MathObject.lut.h
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@begin mathTable
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  abs           mathProtoFuncAbs               DontEnum|Function 1
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  acos          mathProtoFuncACos              DontEnum|Function 1
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  asin          mathProtoFuncASin              DontEnum|Function 1
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  atan          mathProtoFuncATan              DontEnum|Function 1
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  atan2         mathProtoFuncATan2             DontEnum|Function 2
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  ceil          mathProtoFuncCeil              DontEnum|Function 1
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  cos           mathProtoFuncCos               DontEnum|Function 1
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  exp           mathProtoFuncExp               DontEnum|Function 1
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  floor         mathProtoFuncFloor             DontEnum|Function 1
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  log           mathProtoFuncLog               DontEnum|Function 1
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  max           mathProtoFuncMax               DontEnum|Function 2
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  min           mathProtoFuncMin               DontEnum|Function 2
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  pow           mathProtoFuncPow               DontEnum|Function 2
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  random        mathProtoFuncRandom            DontEnum|Function 0
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  round         mathProtoFuncRound             DontEnum|Function 1
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  sin           mathProtoFuncSin               DontEnum|Function 1
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  sqrt          mathProtoFuncSqrt              DontEnum|Function 1
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  tan           mathProtoFuncTan               DontEnum|Function 1
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochMathObject::MathObject(ExecState* exec, JSGlobalObject* globalObject, Structure* structure)
90e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    : JSObjectWithGlobalObject(globalObject, structure)
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(inherits(&s_info));
9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    putDirectWithoutTransition(exec->globalData(), Identifier(exec, "E"), jsNumber(exp(1.0)), DontDelete | DontEnum | ReadOnly);
952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    putDirectWithoutTransition(exec->globalData(), Identifier(exec, "LN2"), jsNumber(log(2.0)), DontDelete | DontEnum | ReadOnly);
962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    putDirectWithoutTransition(exec->globalData(), Identifier(exec, "LN10"), jsNumber(log(10.0)), DontDelete | DontEnum | ReadOnly);
972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    putDirectWithoutTransition(exec->globalData(), Identifier(exec, "LOG2E"), jsNumber(1.0 / log(2.0)), DontDelete | DontEnum | ReadOnly);
9881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    putDirectWithoutTransition(exec->globalData(), Identifier(exec, "LOG10E"), jsNumber(0.4342944819032518), DontDelete | DontEnum | ReadOnly); // See ECMA-262 15.8.1.5
992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    putDirectWithoutTransition(exec->globalData(), Identifier(exec, "PI"), jsNumber(piDouble), DontDelete | DontEnum | ReadOnly);
1002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    putDirectWithoutTransition(exec->globalData(), Identifier(exec, "SQRT1_2"), jsNumber(sqrt(0.5)), DontDelete | DontEnum | ReadOnly);
1012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    putDirectWithoutTransition(exec->globalData(), Identifier(exec, "SQRT2"), jsNumber(sqrt(2.0)), DontDelete | DontEnum | ReadOnly);
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ECMA 15.8
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool MathObject::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot &slot)
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
108231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return getStaticFunctionSlot<JSObject>(exec, ExecState::mathTable(exec), this, propertyName, slot);
109231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
111231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool MathObject::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor)
112231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
113231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return getStaticFunctionDescriptor<JSObject>(exec, ExecState::mathTable(exec), this, propertyName, descriptor);
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ------------------------------ Functions --------------------------------
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
118545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL mathProtoFuncAbs(ExecState* exec)
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
120e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(jsNumber(fabs(exec->argument(0).toNumber(exec))));
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
123545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL mathProtoFuncACos(ExecState* exec)
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
125e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(jsDoubleNumber(acos(exec->argument(0).toNumber(exec))));
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
128545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL mathProtoFuncASin(ExecState* exec)
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
130e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(jsDoubleNumber(asin(exec->argument(0).toNumber(exec))));
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
133545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL mathProtoFuncATan(ExecState* exec)
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
135e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(jsDoubleNumber(atan(exec->argument(0).toNumber(exec))));
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
138545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL mathProtoFuncATan2(ExecState* exec)
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
140bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    double arg0 = exec->argument(0).toNumber(exec);
141bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    double arg1 = exec->argument(1).toNumber(exec);
142e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(jsDoubleNumber(atan2(arg0, arg1)));
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
145545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL mathProtoFuncCeil(ExecState* exec)
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
147e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(jsNumber(ceil(exec->argument(0).toNumber(exec))));
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
150545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL mathProtoFuncCos(ExecState* exec)
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
152e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(jsDoubleNumber(cos(exec->argument(0).toNumber(exec))));
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
155545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL mathProtoFuncExp(ExecState* exec)
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
157e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(jsDoubleNumber(exp(exec->argument(0).toNumber(exec))));
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
160545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL mathProtoFuncFloor(ExecState* exec)
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
162e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(jsNumber(floor(exec->argument(0).toNumber(exec))));
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
165545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL mathProtoFuncLog(ExecState* exec)
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
167e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(jsDoubleNumber(log(exec->argument(0).toNumber(exec))));
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
170545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL mathProtoFuncMax(ExecState* exec)
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1725af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    unsigned argsCount = exec->argumentCount();
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    double result = -Inf;
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned k = 0; k < argsCount; ++k) {
1755af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        double val = exec->argument(k).toNumber(exec);
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isnan(val)) {
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result = NaN;
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (val > result || (val == 0 && result == 0 && !signbit(val)))
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result = val;
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
183e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(jsNumber(result));
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
186545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL mathProtoFuncMin(ExecState* exec)
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1885af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    unsigned argsCount = exec->argumentCount();
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    double result = +Inf;
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (unsigned k = 0; k < argsCount; ++k) {
1915af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        double val = exec->argument(k).toNumber(exec);
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isnan(val)) {
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result = NaN;
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (val < result || (val == 0 && result == 0 && signbit(val)))
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result = val;
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
199e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(jsNumber(result));
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
202545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL mathProtoFuncPow(ExecState* exec)
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // ECMA 15.8.2.1.13
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2065af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    double arg = exec->argument(0).toNumber(exec);
2075af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    double arg2 = exec->argument(1).toNumber(exec);
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isnan(arg2))
210e14391e94c850b8bd03680c23b38978db68687a8John Reck        return JSValue::encode(jsNaN());
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isinf(arg2) && fabs(arg) == 1)
212e14391e94c850b8bd03680c23b38978db68687a8John Reck        return JSValue::encode(jsNaN());
213e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(jsNumber(pow(arg, arg2)));
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
216545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL mathProtoFuncRandom(ExecState* exec)
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
218e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(jsDoubleNumber(exec->lexicalGlobalObject()->weakRandomNumber()));
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
221545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL mathProtoFuncRound(ExecState* exec)
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2235af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    double arg = exec->argument(0).toNumber(exec);
2245e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    double integer = ceil(arg);
225e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(jsNumber(integer - (integer - arg > 0.5)));
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
228545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL mathProtoFuncSin(ExecState* exec)
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
230e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(exec->globalData().cachedSin(exec->argument(0).toNumber(exec)));
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
233545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL mathProtoFuncSqrt(ExecState* exec)
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
235e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(jsDoubleNumber(sqrt(exec->argument(0).toNumber(exec))));
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
238545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochEncodedJSValue JSC_HOST_CALL mathProtoFuncTan(ExecState* exec)
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
240e14391e94c850b8bd03680c23b38978db68687a8John Reck    return JSValue::encode(jsDoubleNumber(tan(exec->argument(0).toNumber(exec))));
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC
244