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
22 #include "math_object.h"
24 #include "math_object.lut.h"
25 #include "wtf/MathExtras.h"
27 #include "operations.h"
31 #if PLATFORM(SOLARIS_OS)
32 static inline int signbit(double x
)
34 return (x
<0.0) ? 1 : 0;
39 #define M_PI 3.14159265358979323846
44 // ------------------------------ MathObjectImp --------------------------------
46 const ClassInfo
MathObjectImp::info
= { "Math", 0, &mathTable
, 0 };
48 /* Source for math_object.lut.h
50 E MathObjectImp::Euler DontEnum|DontDelete|ReadOnly
51 LN2 MathObjectImp::Ln2 DontEnum|DontDelete|ReadOnly
52 LN10 MathObjectImp::Ln10 DontEnum|DontDelete|ReadOnly
53 LOG2E MathObjectImp::Log2E DontEnum|DontDelete|ReadOnly
54 LOG10E MathObjectImp::Log10E DontEnum|DontDelete|ReadOnly
55 PI MathObjectImp::Pi DontEnum|DontDelete|ReadOnly
56 SQRT1_2 MathObjectImp::Sqrt1_2 DontEnum|DontDelete|ReadOnly
57 SQRT2 MathObjectImp::Sqrt2 DontEnum|DontDelete|ReadOnly
58 abs MathObjectImp::Abs DontEnum|Function 1
59 acos MathObjectImp::ACos DontEnum|Function 1
60 asin MathObjectImp::ASin DontEnum|Function 1
61 atan MathObjectImp::ATan DontEnum|Function 1
62 atan2 MathObjectImp::ATan2 DontEnum|Function 2
63 ceil MathObjectImp::Ceil DontEnum|Function 1
64 cos MathObjectImp::Cos DontEnum|Function 1
65 exp MathObjectImp::Exp DontEnum|Function 1
66 floor MathObjectImp::Floor DontEnum|Function 1
67 log MathObjectImp::Log DontEnum|Function 1
68 max MathObjectImp::Max DontEnum|Function 2
69 min MathObjectImp::Min DontEnum|Function 2
70 pow MathObjectImp::Pow DontEnum|Function 2
71 random MathObjectImp::Random DontEnum|Function 0
72 round MathObjectImp::Round DontEnum|Function 1
73 sin MathObjectImp::Sin DontEnum|Function 1
74 sqrt MathObjectImp::Sqrt DontEnum|Function 1
75 tan MathObjectImp::Tan DontEnum|Function 1
79 MathObjectImp::MathObjectImp(ExecState
* /*exec*/,
80 ObjectPrototype
*objProto
)
87 bool MathObjectImp::getOwnPropertySlot(ExecState
*exec
, const Identifier
& propertyName
, PropertySlot
&slot
)
89 return getStaticPropertySlot
<MathFuncImp
, MathObjectImp
, JSObject
>(exec
, &mathTable
, this, propertyName
, slot
);
92 JSValue
*MathObjectImp::getValueProperty(ExecState
*, int token
) const
127 // ------------------------------ MathObjectImp --------------------------------
129 static bool randomSeeded
= false;
131 MathFuncImp::MathFuncImp(ExecState
* exec
, int i
, int l
, const Identifier
& name
)
132 : InternalFunctionImp(static_cast<FunctionPrototype
*>(exec
->lexicalInterpreter()->builtinFunctionPrototype()), name
)
135 putDirect(exec
->propertyNames().length
, l
, DontDelete
|ReadOnly
|DontEnum
);
138 JSValue
*MathFuncImp::callAsFunction(ExecState
*exec
, JSObject
* /*thisObj*/, const List
&args
)
140 double arg
= args
[0]->toNumber(exec
);
141 double arg2
= args
[1]->toNumber(exec
);
145 case MathObjectImp::Abs
:
146 result
= ( arg
< 0 || arg
== -0) ? (-arg
) : arg
;
148 case MathObjectImp::ACos
:
149 result
= ::acos(arg
);
151 case MathObjectImp::ASin
:
152 result
= ::asin(arg
);
154 case MathObjectImp::ATan
:
155 result
= ::atan(arg
);
157 case MathObjectImp::ATan2
:
158 result
= ::atan2(arg
, arg2
);
160 case MathObjectImp::Ceil
:
161 result
= ::ceil(arg
);
163 case MathObjectImp::Cos
:
166 case MathObjectImp::Exp
:
169 case MathObjectImp::Floor
:
170 result
= ::floor(arg
);
172 case MathObjectImp::Log
:
175 case MathObjectImp::Max
: {
176 unsigned int argsCount
= args
.size();
178 for ( unsigned int k
= 0 ; k
< argsCount
; ++k
) {
179 double val
= args
[k
]->toNumber(exec
);
185 if ( val
> result
|| (val
== 0 && result
== 0 && !signbit(val
)) )
190 case MathObjectImp::Min
: {
191 unsigned int argsCount
= args
.size();
193 for ( unsigned int k
= 0 ; k
< argsCount
; ++k
) {
194 double val
= args
[k
]->toNumber(exec
);
200 if ( val
< result
|| (val
== 0 && result
== 0 && signbit(val
)) )
205 case MathObjectImp::Pow
:
206 // ECMA 15.8.2.1.13 (::pow takes care of most of the critera)
209 else if (isNaN(arg
) && arg2
!= 0)
211 else if (::fabs(arg
) == 1 && isInf(arg2
))
213 else if (arg2
== 0 && arg
!= 0)
216 result
= ::pow(arg
, arg2
);
218 case MathObjectImp::Random
:
220 srand(static_cast<unsigned>(time(0)));
223 result
= (double)rand() / RAND_MAX
;
225 case MathObjectImp::Round
:
226 if (signbit(arg
) && arg
>= -0.5)
229 result
= ::floor(arg
+ 0.5);
231 case MathObjectImp::Sin
:
234 case MathObjectImp::Sqrt
:
235 result
= ::sqrt(arg
);
237 case MathObjectImp::Tan
:
246 return jsNumber(result
);