-/*
- * Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
- * Copyright (C) 2007, 2008 Apple Inc. All Rights Reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include "config.h"
-#include "math_object.h"
-#include "math_object.lut.h"
-
-#include "operations.h"
-#include <time.h>
-#include <wtf/Assertions.h>
-#include <wtf/MathExtras.h>
-
-namespace KJS {
-
-// ------------------------------ MathObjectImp --------------------------------
-
-const ClassInfo MathObjectImp::info = { "Math", 0, &mathTable };
-
-/* Source for math_object.lut.h
-@begin mathTable 21
- E MathObjectImp::Euler DontEnum|DontDelete|ReadOnly
- LN2 MathObjectImp::Ln2 DontEnum|DontDelete|ReadOnly
- LN10 MathObjectImp::Ln10 DontEnum|DontDelete|ReadOnly
- LOG2E MathObjectImp::Log2E DontEnum|DontDelete|ReadOnly
- LOG10E MathObjectImp::Log10E DontEnum|DontDelete|ReadOnly
- PI MathObjectImp::Pi DontEnum|DontDelete|ReadOnly
- SQRT1_2 MathObjectImp::Sqrt1_2 DontEnum|DontDelete|ReadOnly
- SQRT2 MathObjectImp::Sqrt2 DontEnum|DontDelete|ReadOnly
- abs mathProtoFuncAbs DontEnum|Function 1
- acos mathProtoFuncACos DontEnum|Function 1
- asin mathProtoFuncASin DontEnum|Function 1
- atan mathProtoFuncATan DontEnum|Function 1
- atan2 mathProtoFuncATan2 DontEnum|Function 2
- ceil mathProtoFuncCeil DontEnum|Function 1
- cos mathProtoFuncCos DontEnum|Function 1
- exp mathProtoFuncExp DontEnum|Function 1
- floor mathProtoFuncFloor DontEnum|Function 1
- log mathProtoFuncLog DontEnum|Function 1
- max mathProtoFuncMax DontEnum|Function 2
- min mathProtoFuncMin DontEnum|Function 2
- pow mathProtoFuncPow DontEnum|Function 2
- random mathProtoFuncRandom DontEnum|Function 0
- round mathProtoFuncRound DontEnum|Function 1
- sin mathProtoFuncSin DontEnum|Function 1
- sqrt mathProtoFuncSqrt DontEnum|Function 1
- tan mathProtoFuncTan DontEnum|Function 1
-@end
-*/
-
-MathObjectImp::MathObjectImp(ExecState*, ObjectPrototype* objectPrototype)
- : JSObject(objectPrototype)
-{
-}
-
-// ECMA 15.8
-
-bool MathObjectImp::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot &slot)
-{
- return getStaticPropertySlot<MathObjectImp, JSObject>(exec, &mathTable, this, propertyName, slot);
-}
-
-JSValue* MathObjectImp::getValueProperty(ExecState*, int token) const
-{
- switch (token) {
- case Euler:
- return jsNumber(exp(1.0));
- case Ln2:
- return jsNumber(log(2.0));
- case Ln10:
- return jsNumber(log(10.0));
- case Log2E:
- return jsNumber(1.0 / log(2.0));
- case Log10E:
- return jsNumber(1.0 / log(10.0));
- case Pi:
- return jsNumber(piDouble);
- case Sqrt1_2:
- return jsNumber(sqrt(0.5));
- case Sqrt2:
- return jsNumber(sqrt(2.0));
- }
-
- ASSERT_NOT_REACHED();
- return 0;
-}
-
-// ------------------------------ Functions --------------------------------
-
-JSValue* mathProtoFuncAbs(ExecState* exec, JSObject*, const List& args)
-{
- double arg = args[0]->toNumber(exec);
- return signbit(arg) ? jsNumber(-arg) : jsNumber(arg);
-}
-
-JSValue* mathProtoFuncACos(ExecState* exec, JSObject*, const List& args)
-{
- return jsNumber(acos(args[0]->toNumber(exec)));
-}
-
-JSValue* mathProtoFuncASin(ExecState* exec, JSObject*, const List& args)
-{
- return jsNumber(asin(args[0]->toNumber(exec)));
-}
-
-JSValue* mathProtoFuncATan(ExecState* exec, JSObject*, const List& args)
-{
- return jsNumber(atan(args[0]->toNumber(exec)));
-}
-
-JSValue* mathProtoFuncATan2(ExecState* exec, JSObject*, const List& args)
-{
- return jsNumber(atan2(args[0]->toNumber(exec), args[1]->toNumber(exec)));
-}
-
-JSValue* mathProtoFuncCeil(ExecState* exec, JSObject*, const List& args)
-{
- double arg = args[0]->toNumber(exec);
- if (signbit(arg) && arg > -1.0)
- return jsNumber(-0.0);
- return jsNumber(ceil(arg));
-}
-
-JSValue* mathProtoFuncCos(ExecState* exec, JSObject*, const List& args)
-{
- return jsNumber(cos(args[0]->toNumber(exec)));
-}
-
-JSValue* mathProtoFuncExp(ExecState* exec, JSObject*, const List& args)
-{
- return jsNumber(exp(args[0]->toNumber(exec)));
-}
-
-JSValue* mathProtoFuncFloor(ExecState* exec, JSObject*, const List& args)
-{
- double arg = args[0]->toNumber(exec);
- if (signbit(arg) && arg == 0.0)
- return jsNumber(-0.0);
- return jsNumber(floor(arg));
-}
-
-JSValue* mathProtoFuncLog(ExecState* exec, JSObject*, const List& args)
-{
- return jsNumber(log(args[0]->toNumber(exec)));
-}
-
-JSValue* mathProtoFuncMax(ExecState* exec, JSObject*, const List& args)
-{
- unsigned argsCount = args.size();
- double result = -Inf;
- for (unsigned k = 0; k < argsCount; ++k) {
- double val = args[k]->toNumber(exec);
- if (isnan(val)) {
- result = NaN;
- break;
- }
- if (val > result || (val == 0 && result == 0 && !signbit(val)))
- result = val;
- }
- return jsNumber(result);
-}
-
-JSValue* mathProtoFuncMin(ExecState* exec, JSObject*, const List& args)
-{
- unsigned argsCount = args.size();
- double result = +Inf;
- for (unsigned k = 0; k < argsCount; ++k) {
- double val = args[k]->toNumber(exec);
- if (isnan(val)) {
- result = NaN;
- break;
- }
- if (val < result || (val == 0 && result == 0 && signbit(val)))
- result = val;
- }
- return jsNumber(result);
-}
-
-JSValue* mathProtoFuncPow(ExecState* exec, JSObject*, const List& args)
-{
- // ECMA 15.8.2.1.13
-
- double arg = args[0]->toNumber(exec);
- double arg2 = args[1]->toNumber(exec);
-
- if (isnan(arg2))
- return jsNumber(NaN);
- if (isinf(arg2) && fabs(arg) == 1)
- return jsNumber(NaN);
- return jsNumber(pow(arg, arg2));
-}
-
-static bool didInitRandom;
-
-JSValue* mathProtoFuncRandom(ExecState*, JSObject*, const List&)
-{
- if (!didInitRandom) {
- wtf_random_init();
- didInitRandom = true;
- }
- return jsNumber(wtf_random());
-}
-
-JSValue* mathProtoFuncRound(ExecState* exec, JSObject*, const List& args)
-{
- double arg = args[0]->toNumber(exec);
- if (signbit(arg) && arg >= -0.5)
- return jsNumber(-0.0);
- return jsNumber(floor(arg + 0.5));
-}
-
-JSValue* mathProtoFuncSin(ExecState* exec, JSObject*, const List& args)
-{
- return jsNumber(sin(args[0]->toNumber(exec)));
-}
-
-JSValue* mathProtoFuncSqrt(ExecState* exec, JSObject*, const List& args)
-{
- return jsNumber(sqrt(args[0]->toNumber(exec)));
-}
-
-JSValue* mathProtoFuncTan(ExecState* exec, JSObject*, const List& args)
-{
- return jsNumber(tan(args[0]->toNumber(exec)));
-}
-
-} // namespace KJS