1
// -*- c-basic-offset: 2 -*-
3
* This file is part of the KDE libraries
4
* Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
6
* This library is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2 of the License, or (at your option) any later version.
11
* This library is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with this library; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23
#include "math_object.h"
24
#include "math_object.lut.h"
25
#include "wtf/MathExtras.h"
27
#include "operations.h"
33
// ------------------------------ MathObjectImp --------------------------------
35
const ClassInfo MathObjectImp::info = { "Math", 0, &mathTable, 0 };
37
/* Source for math_object.lut.h
39
E MathObjectImp::Euler DontEnum|DontDelete|ReadOnly
40
LN2 MathObjectImp::Ln2 DontEnum|DontDelete|ReadOnly
41
LN10 MathObjectImp::Ln10 DontEnum|DontDelete|ReadOnly
42
LOG2E MathObjectImp::Log2E DontEnum|DontDelete|ReadOnly
43
LOG10E MathObjectImp::Log10E DontEnum|DontDelete|ReadOnly
44
PI MathObjectImp::Pi DontEnum|DontDelete|ReadOnly
45
SQRT1_2 MathObjectImp::Sqrt1_2 DontEnum|DontDelete|ReadOnly
46
SQRT2 MathObjectImp::Sqrt2 DontEnum|DontDelete|ReadOnly
47
abs MathObjectImp::Abs DontEnum|Function 1
48
acos MathObjectImp::ACos DontEnum|Function 1
49
asin MathObjectImp::ASin DontEnum|Function 1
50
atan MathObjectImp::ATan DontEnum|Function 1
51
atan2 MathObjectImp::ATan2 DontEnum|Function 2
52
ceil MathObjectImp::Ceil DontEnum|Function 1
53
cos MathObjectImp::Cos DontEnum|Function 1
54
exp MathObjectImp::Exp DontEnum|Function 1
55
floor MathObjectImp::Floor DontEnum|Function 1
56
log MathObjectImp::Log DontEnum|Function 1
57
max MathObjectImp::Max DontEnum|Function 2
58
min MathObjectImp::Min DontEnum|Function 2
59
pow MathObjectImp::Pow DontEnum|Function 2
60
random MathObjectImp::Random DontEnum|Function 0
61
round MathObjectImp::Round DontEnum|Function 1
62
sin MathObjectImp::Sin DontEnum|Function 1
63
sqrt MathObjectImp::Sqrt DontEnum|Function 1
64
tan MathObjectImp::Tan DontEnum|Function 1
68
MathObjectImp::MathObjectImp(ExecState * /*exec*/,
69
ObjectPrototype *objProto)
76
bool MathObjectImp::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot &slot)
78
return getStaticPropertySlot<MathFuncImp, MathObjectImp, JSObject>(exec, &mathTable, this, propertyName, slot);
81
JSValue *MathObjectImp::getValueProperty(ExecState *, int token) const
116
// ------------------------------ MathObjectImp --------------------------------
118
static bool randomSeeded = false;
120
MathFuncImp::MathFuncImp(ExecState* exec, int i, int l, const Identifier& name)
121
: InternalFunctionImp(static_cast<FunctionPrototype*>(exec->lexicalInterpreter()->builtinFunctionPrototype()), name)
124
putDirect(exec->propertyNames().length, l, DontDelete|ReadOnly|DontEnum);
127
JSValue *MathFuncImp::callAsFunction(ExecState *exec, JSObject* /*thisObj*/, const List &args)
129
double arg = args[0]->toNumber(exec);
130
double arg2 = args[1]->toNumber(exec);
134
case MathObjectImp::Abs:
135
result = ( arg < 0 || arg == -0) ? (-arg) : arg;
137
case MathObjectImp::ACos:
140
case MathObjectImp::ASin:
143
case MathObjectImp::ATan:
146
case MathObjectImp::ATan2:
147
result = atan2(arg, arg2);
149
case MathObjectImp::Ceil:
152
case MathObjectImp::Cos:
155
case MathObjectImp::Exp:
158
case MathObjectImp::Floor:
161
case MathObjectImp::Log:
164
case MathObjectImp::Max: {
165
unsigned int argsCount = args.size();
167
for ( unsigned int k = 0 ; k < argsCount ; ++k ) {
168
double val = args[k]->toNumber(exec);
174
if ( val > result || (val == 0 && result == 0 && !signbit(val)) )
179
case MathObjectImp::Min: {
180
unsigned int argsCount = args.size();
182
for ( unsigned int k = 0 ; k < argsCount ; ++k ) {
183
double val = args[k]->toNumber(exec);
189
if ( val < result || (val == 0 && result == 0 && signbit(val)) )
194
case MathObjectImp::Pow:
195
// ECMA 15.8.2.1.13 (::pow takes care of most of the critera)
198
else if (isNaN(arg) && arg2 != 0)
200
else if (fabs(arg) == 1 && isInf(arg2))
202
else if (arg2 == 0 && arg != 0)
205
result = ::pow(arg, arg2);
207
case MathObjectImp::Random:
209
srand(static_cast<unsigned>(time(0)));
212
result = (double)rand() / RAND_MAX;
214
case MathObjectImp::Round:
215
if (signbit(arg) && arg >= -0.5)
218
result = floor(arg + 0.5);
220
case MathObjectImp::Sin:
223
case MathObjectImp::Sqrt:
226
case MathObjectImp::Tan:
235
return jsNumber(result);