Changeset 10084 in webkit for trunk/JavaScriptCore/kjs/number_object.cpp
- Timestamp:
- Aug 7, 2005, 9:07:46 PM (20 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/number_object.cpp
r10076 r10084 53 53 : NumberInstanceImp(objProto) 54 54 { 55 Value protect(this); 56 setInternalValue(NumberImp::zero()); 55 setInternalValue(jsZero()); 57 56 58 57 // The constructor will be added later, after NumberObjectImp has been constructed … … 73 72 : InternalFunctionImp(funcProto), id(i) 74 73 { 75 Value protect(this);76 74 putDirect(lengthPropertyName, len, DontDelete|ReadOnly|DontEnum); 77 75 } … … 128 126 129 127 // ECMA 15.7.4.2 - 15.7.4.7 130 Value NumberProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &args) 131 { 132 Value result; 133 128 ValueImp *NumberProtoFuncImp::callAsFunction(ExecState *exec, ObjectImp *thisObj, const List &args) 129 { 134 130 // no generic function. "this" has to be a Number object 135 if (!thisObj .inherits(&NumberInstanceImp::info)) {136 Object 131 if (!thisObj->inherits(&NumberInstanceImp::info)) { 132 ObjectImp *err = Error::create(exec,TypeError); 137 133 exec->setException(err); 138 134 return err; 139 135 } 140 136 141 Value v = thisObj.internalValue();137 ValueImp *v = thisObj->internalValue(); 142 138 switch (id) { 143 139 case ToString: { 144 140 double dradix = 10; 145 141 if (!args.isEmpty()) 146 dradix = args[0] .toInteger(exec);142 dradix = args[0]->toInteger(exec); 147 143 if (dradix >= 2 && dradix <= 36 && dradix != 10) { // false for NaN 148 144 int radix = static_cast<int>(dradix); 149 unsigned i = v .toUInt32(exec);145 unsigned i = v->toUInt32(exec); 150 146 char s[33]; 151 147 char *p = s + sizeof(s); … … 155 151 i /= radix; 156 152 } while (i); 157 re sult =String(p);153 return String(p); 158 154 } else 159 result = String(v.toString(exec)); 160 break; 155 return String(v->toString(exec)); 161 156 } 162 157 case ToLocaleString: /* TODO */ 163 result = String(v.toString(exec)); 164 break; 158 return String(v->toString(exec)); 165 159 case ValueOf: 166 result = Number(v.toNumber(exec)); 167 break; 160 return Number(v->toNumber(exec)); 168 161 case ToFixed: 169 162 { 170 Value 171 double df = fractionDigits .toInteger(exec);163 ValueImp *fractionDigits = args[0]; 164 double df = fractionDigits->toInteger(exec); 172 165 if (!(df >= 0 && df <= 20)) { // true for NaN 173 Object 166 ObjectImp *err = Error::create(exec, RangeError, 174 167 "toFixed() digits argument must be between 0 and 20"); 175 168 … … 179 172 int f = (int)df; 180 173 181 double x = v .toNumber(exec);174 double x = v->toNumber(exec); 182 175 if (isNaN(x)) 183 176 return String("NaN"); … … 213 206 } 214 207 case ToExponential: { 215 double x = v .toNumber(exec);208 double x = v->toNumber(exec); 216 209 217 210 if (isNaN(x) || isInf(x)) 218 211 return String(UString::from(x)); 219 212 220 Value 221 double df = fractionDigits .toInteger(exec);213 ValueImp *fractionDigits = args[0]; 214 double df = fractionDigits->toInteger(exec); 222 215 if (!(df >= 0 && df <= 20)) { // true for NaN 223 Object 216 ObjectImp *err = Error::create(exec, RangeError, 224 217 "toExponential() argument must between 0 and 20"); 225 218 exec->setException(err); … … 229 222 230 223 int decimalAdjust = 0; 231 if (!fractionDigits .isA(UndefinedType)) {224 if (!fractionDigits->isUndefined()) { 232 225 double logx = floor(log10(x)); 233 226 x /= pow(10,logx); … … 264 257 buf[i++] = result[0]; 265 258 266 if (fractionDigits .isA(UndefinedType))259 if (fractionDigits->isUndefined()) 267 260 f = length-1; 268 261 … … 311 304 UString m; 312 305 313 double dp = args[0] .toInteger(exec);314 double x = v .toNumber(exec);306 double dp = args[0]->toInteger(exec); 307 double x = v->toNumber(exec); 315 308 if (isNaN(dp) || isNaN(x) || isInf(x)) 316 return String(v .toString(exec));309 return String(v->toString(exec)); 317 310 318 311 UString s = ""; … … 323 316 324 317 if (dp < 1 || dp > 21) { 325 Object 318 ObjectImp *err = Error::create(exec, RangeError, 326 319 "toPrecision() argument must be between 1 and 21"); 327 320 exec->setException(err); … … 373 366 374 367 } 375 return result;368 return NULL; 376 369 } 377 370 … … 395 388 : InternalFunctionImp(funcProto) 396 389 { 397 Value protect(this);398 390 // Number.Prototype 399 391 putDirect(prototypePropertyName, numberProto,DontEnum|DontDelete|ReadOnly); 400 392 401 393 // no. of arguments for constructor 402 putDirect(lengthPropertyName, NumberImp::one(), ReadOnly|DontDelete|DontEnum);394 putDirect(lengthPropertyName, jsOne(), ReadOnly|DontDelete|DontEnum); 403 395 } 404 396 … … 408 400 } 409 401 410 Value 402 ValueImp *NumberObjectImp::getValueProperty(ExecState *, int token) const 411 403 { 412 404 // ECMA 15.7.3 413 405 switch(token) { 414 406 case NaNValue: 415 return Number(NaN);407 return jsNaN(); 416 408 case NegInfinity: 417 409 return Number(-Inf); … … 433 425 434 426 // ECMA 15.7.1 435 Object 436 { 437 ObjectImp *proto = exec->lexicalInterpreter()->builtinNumberPrototype() .imp();438 Object 439 440 Numbern;427 ObjectImp *NumberObjectImp::construct(ExecState *exec, const List &args) 428 { 429 ObjectImp *proto = exec->lexicalInterpreter()->builtinNumberPrototype(); 430 ObjectImp *obj(new NumberInstanceImp(proto)); 431 432 double n; 441 433 if (args.isEmpty()) 442 n = Number(0);434 n = 0; 443 435 else 444 n = args[0] .toNumber(exec);445 446 obj .setInternalValue(n);436 n = args[0]->toNumber(exec); 437 438 obj->setInternalValue(jsNumber(n)); 447 439 448 440 return obj; … … 455 447 456 448 // ECMA 15.7.2 457 Value NumberObjectImp::call(ExecState *exec, Object &/*thisObj*/, const List &args)449 ValueImp *NumberObjectImp::callAsFunction(ExecState *exec, ObjectImp */*thisObj*/, const List &args) 458 450 { 459 451 if (args.isEmpty()) 460 452 return Number(0); 461 453 else 462 return Number(args[0] .toNumber(exec));463 } 454 return Number(args[0]->toNumber(exec)); 455 }
Note:
See TracChangeset
for help on using the changeset viewer.