Changeset 27608 in webkit for trunk/JavaScriptCore/kjs/math_object.cpp
- Timestamp:
- Nov 8, 2007, 12:31:26 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/math_object.cpp
r27413 r27608 29 29 #include <wtf/MathExtras.h> 30 30 31 using namespace KJS; 31 namespace KJS { 32 32 33 33 // ------------------------------ MathObjectImp -------------------------------- … … 37 37 /* Source for math_object.lut.h 38 38 @begin mathTable 21 39 E MathObjectImp::Euler DontEnum|DontDelete|ReadOnly40 LN2 MathObjectImp::Ln2 DontEnum|DontDelete|ReadOnly41 LN10 MathObjectImp::Ln10 DontEnum|DontDelete|ReadOnly42 LOG2E MathObjectImp::Log2E DontEnum|DontDelete|ReadOnly43 LOG10E MathObjectImp::Log10E DontEnum|DontDelete|ReadOnly44 PI MathObjectImp::Pi DontEnum|DontDelete|ReadOnly45 SQRT1_2 MathObjectImp::Sqrt1_2 DontEnum|DontDelete|ReadOnly46 SQRT2 MathObjectImp::Sqrt2 DontEnum|DontDelete|ReadOnly47 abs MathObjectImp::AbsDontEnum|Function 148 acos MathObjectImp::ACosDontEnum|Function 149 asin MathObjectImp::ASinDontEnum|Function 150 atan MathObjectImp::ATanDontEnum|Function 151 atan2 MathObjectImp::ATan2DontEnum|Function 252 ceil MathObjectImp::CeilDontEnum|Function 153 cos MathObjectImp::CosDontEnum|Function 154 exp MathObjectImp::ExpDontEnum|Function 155 floor MathObjectImp::FloorDontEnum|Function 156 log MathObjectImp::LogDontEnum|Function 157 max MathObjectImp::MaxDontEnum|Function 258 min MathObjectImp::MinDontEnum|Function 259 pow MathObjectImp::PowDontEnum|Function 260 random MathObjectImp::Random DontEnum|Function 061 round MathObjectImp::RoundDontEnum|Function 162 sin MathObjectImp::SinDontEnum|Function 163 sqrt MathObjectImp::SqrtDontEnum|Function 164 tan MathObjectImp::TanDontEnum|Function 139 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 &MathProtoFuncAbs::create DontEnum|Function 1 48 acos &MathProtoFuncACos::create DontEnum|Function 1 49 asin &MathProtoFuncASin::create DontEnum|Function 1 50 atan &MathProtoFuncATan::create DontEnum|Function 1 51 atan2 &MathProtoFuncATan2::create DontEnum|Function 2 52 ceil &MathProtoFuncCeil::create DontEnum|Function 1 53 cos &MathProtoFuncCos::create DontEnum|Function 1 54 exp &MathProtoFuncExp::create DontEnum|Function 1 55 floor &MathProtoFuncFloor::create DontEnum|Function 1 56 log &MathProtoFuncLog::create DontEnum|Function 1 57 max &MathProtoFuncMax::create DontEnum|Function 2 58 min &MathProtoFuncMin::create DontEnum|Function 2 59 pow &MathProtoFuncPow::create DontEnum|Function 2 60 random &MathProtoFuncRandom::create DontEnum|Function 0 61 round &MathProtoFuncRound::create DontEnum|Function 1 62 sin &MathProtoFuncSin::create DontEnum|Function 1 63 sqrt &MathProtoFuncSqrt::create DontEnum|Function 1 64 tan &MathProtoFuncTan::create DontEnum|Function 1 65 65 @end 66 66 */ … … 76 76 bool MathObjectImp::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot &slot) 77 77 { 78 return getStaticPropertySlot<Math FuncImp, MathObjectImp, JSObject>(exec, &mathTable, this, propertyName, slot);78 return getStaticPropertySlot<MathObjectImp, JSObject>(exec, &mathTable, this, propertyName, slot); 79 79 } 80 80 … … 114 114 } 115 115 116 // ------------------------------ MathObjectImp -------------------------------- 116 // ------------------------------ Functions -------------------------------- 117 118 JSValue* MathProtoFuncAbs::callAsFunction(ExecState* exec, JSObject*, const List& args) 119 { 120 double arg = args[0]->toNumber(exec); 121 return signbit(arg) ? jsNumber(-arg) : jsNumber(arg); 122 } 123 124 JSValue* MathProtoFuncACos::callAsFunction(ExecState* exec, JSObject*, const List& args) 125 { 126 double arg = args[0]->toNumber(exec); 127 return jsNumber(acos(arg)); 128 } 129 130 JSValue* MathProtoFuncASin::callAsFunction(ExecState* exec, JSObject*, const List& args) 131 { 132 double arg = args[0]->toNumber(exec); 133 return jsNumber(asin(arg)); 134 } 135 136 JSValue* MathProtoFuncATan::callAsFunction(ExecState* exec, JSObject*, const List& args) 137 { 138 double arg = args[0]->toNumber(exec); 139 return jsNumber(atan(arg)); 140 } 141 142 JSValue* MathProtoFuncATan2::callAsFunction(ExecState* exec, JSObject*, const List& args) 143 { 144 double arg = args[0]->toNumber(exec); 145 double arg2 = args[1]->toNumber(exec); 146 return jsNumber(atan2(arg, arg2)); 147 } 148 149 JSValue* MathProtoFuncCeil::callAsFunction(ExecState* exec, JSObject*, const List& args) 150 { 151 double arg = args[0]->toNumber(exec); 152 if (signbit(arg) && arg > -1.0) 153 return jsNumber(-0.0); 154 return jsNumber(ceil(arg)); 155 } 156 157 JSValue* MathProtoFuncCos::callAsFunction(ExecState* exec, JSObject*, const List& args) 158 { 159 double arg = args[0]->toNumber(exec); 160 return jsNumber(cos(arg)); 161 } 162 163 JSValue* MathProtoFuncExp::callAsFunction(ExecState* exec, JSObject*, const List& args) 164 { 165 double arg = args[0]->toNumber(exec); 166 return jsNumber(exp(arg)); 167 } 168 169 JSValue* MathProtoFuncFloor::callAsFunction(ExecState* exec, JSObject*, const List& args) 170 { 171 double arg = args[0]->toNumber(exec); 172 if (signbit(arg) && arg == 0.0) 173 return jsNumber(-0.0); 174 return jsNumber(floor(arg)); 175 } 176 177 JSValue* MathProtoFuncLog::callAsFunction(ExecState* exec, JSObject*, const List& args) 178 { 179 double arg = args[0]->toNumber(exec); 180 return jsNumber(log(arg)); 181 } 182 183 JSValue* MathProtoFuncMax::callAsFunction(ExecState* exec, JSObject*, const List& args) 184 { 185 unsigned argsCount = args.size(); 186 double result = -Inf; 187 for (unsigned k = 0; k < argsCount; ++k) { 188 double val = args[k]->toNumber(exec); 189 if (isnan(val)) { 190 result = NaN; 191 break; 192 } 193 if (val > result || (val == 0 && result == 0 && !signbit(val))) 194 result = val; 195 } 196 return jsNumber(result); 197 } 198 199 JSValue* MathProtoFuncMin::callAsFunction(ExecState* exec, JSObject*, const List& args) 200 { 201 unsigned argsCount = args.size(); 202 double result = +Inf; 203 for (unsigned k = 0; k < argsCount; ++k) { 204 double val = args[k]->toNumber(exec); 205 if (isnan(val)) { 206 result = NaN; 207 break; 208 } 209 if (val < result || (val == 0 && result == 0 && signbit(val))) 210 result = val; 211 } 212 return jsNumber(result); 213 } 214 215 JSValue* MathProtoFuncPow::callAsFunction(ExecState* exec, JSObject*, const List& args) 216 { 217 // ECMA 15.8.2.1.13 218 219 double arg = args[0]->toNumber(exec); 220 double arg2 = args[1]->toNumber(exec); 221 222 if (isnan(arg2)) 223 return jsNumber(NaN); 224 if (isinf(arg2) && fabs(arg) == 1) 225 return jsNumber(NaN); 226 return jsNumber(pow(arg, arg2)); 227 } 117 228 118 229 static bool didInitRandom; 119 230 120 MathFuncImp::MathFuncImp(ExecState* exec, int i, int l, const Identifier& name) 121 : InternalFunctionImp(static_cast<FunctionPrototype*>(exec->lexicalInterpreter()->builtinFunctionPrototype()), name) 122 , id(i) 123 { 124 putDirect(exec->propertyNames().length, l, DontDelete|ReadOnly|DontEnum); 125 } 126 127 JSValue *MathFuncImp::callAsFunction(ExecState *exec, JSObject* /*thisObj*/, const List &args) 128 { 129 double arg = args[0]->toNumber(exec); 130 double arg2 = args[1]->toNumber(exec); 131 double result; 132 133 switch (id) { 134 case MathObjectImp::Abs: 135 result = signbit(arg) ? -arg : arg; 136 break; 137 case MathObjectImp::ACos: 138 result = acos(arg); 139 break; 140 case MathObjectImp::ASin: 141 result = asin(arg); 142 break; 143 case MathObjectImp::ATan: 144 result = atan(arg); 145 break; 146 case MathObjectImp::ATan2: 147 result = atan2(arg, arg2); 148 break; 149 case MathObjectImp::Ceil: 150 if (signbit(arg) && arg > -1.0) 151 result = -0.0; 152 else 153 result = ceil(arg); 154 break; 155 case MathObjectImp::Cos: 156 result = cos(arg); 157 break; 158 case MathObjectImp::Exp: 159 result = exp(arg); 160 break; 161 case MathObjectImp::Floor: 162 if (signbit(arg) && arg == 0.0) 163 result = -0.0; 164 else 165 result = floor(arg); 166 break; 167 case MathObjectImp::Log: 168 result = log(arg); 169 break; 170 case MathObjectImp::Max: { 171 unsigned int argsCount = args.size(); 172 result = -Inf; 173 for ( unsigned int k = 0 ; k < argsCount ; ++k ) { 174 double val = args[k]->toNumber(exec); 175 if ( isnan( val ) ) 176 { 177 result = NaN; 178 break; 179 } 180 if ( val > result || (val == 0 && result == 0 && !signbit(val)) ) 181 result = val; 231 JSValue* MathProtoFuncRandom::callAsFunction(ExecState*, JSObject*, const List&) 232 { 233 if (!didInitRandom) { 234 wtf_random_init(); 235 didInitRandom = true; 182 236 } 183 break; 184 } 185 case MathObjectImp::Min: { 186 unsigned int argsCount = args.size(); 187 result = +Inf; 188 for ( unsigned int k = 0 ; k < argsCount ; ++k ) { 189 double val = args[k]->toNumber(exec); 190 if ( isnan( val ) ) 191 { 192 result = NaN; 193 break; 194 } 195 if ( val < result || (val == 0 && result == 0 && signbit(val)) ) 196 result = val; 197 } 198 break; 199 } 200 case MathObjectImp::Pow: 201 // ECMA 15.8.2.1.13 202 if (isnan(arg2)) 203 result = NaN; 204 else if (isinf(arg2) && fabs(arg) == 1) 205 result = NaN; 206 else 207 result = pow(arg, arg2); 208 break; 209 case MathObjectImp::Random: 210 if (!didInitRandom) { 211 wtf_random_init(); 212 didInitRandom = true; 213 } 214 result = wtf_random(); 215 break; 216 case MathObjectImp::Round: 237 return jsNumber(wtf_random()); 238 } 239 240 JSValue* MathProtoFuncRound::callAsFunction(ExecState* exec, JSObject*, const List& args) 241 { 242 double arg = args[0]->toNumber(exec); 217 243 if (signbit(arg) && arg >= -0.5) 218 result = -0.0; 219 else 220 result = floor(arg + 0.5); 221 break; 222 case MathObjectImp::Sin: 223 result = sin(arg); 224 break; 225 case MathObjectImp::Sqrt: 226 result = sqrt(arg); 227 break; 228 case MathObjectImp::Tan: 229 result = tan(arg); 230 break; 231 232 default: 233 result = 0.0; 234 ASSERT(0); 235 } 236 237 return jsNumber(result); 238 } 244 return jsNumber(-0.0); 245 return jsNumber(floor(arg + 0.5)); 246 } 247 248 JSValue* MathProtoFuncSin::callAsFunction(ExecState* exec, JSObject*, const List& args) 249 { 250 double arg = args[0]->toNumber(exec); 251 return jsNumber(sin(arg)); 252 } 253 254 JSValue* MathProtoFuncSqrt::callAsFunction(ExecState* exec, JSObject*, const List& args) 255 { 256 double arg = args[0]->toNumber(exec); 257 return jsNumber(sqrt(arg)); 258 } 259 260 JSValue* MathProtoFuncTan::callAsFunction(ExecState* exec, JSObject*, const List& args) 261 { 262 double arg = args[0]->toNumber(exec); 263 return jsNumber(tan(arg)); 264 } 265 266 } // namespace KJS
Note:
See TracChangeset
for help on using the changeset viewer.