| OLD | NEW | 
|---|
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 // This files contains runtime support implemented in JavaScript. | 5 // This files contains runtime support implemented in JavaScript. | 
| 6 | 6 | 
| 7 // CAUTION: Some of the functions specified in this file are called | 7 // CAUTION: Some of the functions specified in this file are called | 
| 8 // directly from compiled code. These are the functions with names in | 8 // directly from compiled code. These are the functions with names in | 
| 9 // ALL CAPS. The compiled code passes the first argument in 'this'. | 9 // ALL CAPS. The compiled code passes the first argument in 'this'. | 
| 10 | 10 | 
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 228     return %NumberAdd(%$toNumber(a), %$toNumber(b)); | 228     return %NumberAdd(%$toNumber(a), %$toNumber(b)); | 
| 229   } | 229   } | 
| 230 } | 230 } | 
| 231 | 231 | 
| 232 | 232 | 
| 233 // Strong mode ADD throws if an implicit conversion would be performed | 233 // Strong mode ADD throws if an implicit conversion would be performed | 
| 234 ADD_STRONG = function ADD_STRONG(x) { | 234 ADD_STRONG = function ADD_STRONG(x) { | 
| 235   if (IS_NUMBER(this) && IS_NUMBER(x)) return %NumberAdd(this, x); | 235   if (IS_NUMBER(this) && IS_NUMBER(x)) return %NumberAdd(this, x); | 
| 236   if (IS_STRING(this) && IS_STRING(x)) return %_StringAdd(this, x); | 236   if (IS_STRING(this) && IS_STRING(x)) return %_StringAdd(this, x); | 
| 237 | 237 | 
| 238   throw %MakeTypeError(kStrongImplicitCast); | 238   throw %MakeTypeError('strong_implicit_cast'); | 
| 239 } | 239 } | 
| 240 | 240 | 
| 241 | 241 | 
| 242 // Left operand (this) is already a string. | 242 // Left operand (this) is already a string. | 
| 243 STRING_ADD_LEFT = function STRING_ADD_LEFT(y) { | 243 STRING_ADD_LEFT = function STRING_ADD_LEFT(y) { | 
| 244   if (!IS_STRING(y)) { | 244   if (!IS_STRING(y)) { | 
| 245     if (IS_STRING_WRAPPER(y) && %_IsStringWrapperSafeForDefaultValueOf(y)) { | 245     if (IS_STRING_WRAPPER(y) && %_IsStringWrapperSafeForDefaultValueOf(y)) { | 
| 246       y = %_ValueOf(y); | 246       y = %_ValueOf(y); | 
| 247     } else { | 247     } else { | 
| 248       y = IS_NUMBER(y) | 248       y = IS_NUMBER(y) | 
| 249           ? %_NumberToString(y) | 249           ? %_NumberToString(y) | 
| 250           : %$toString(%$toPrimitive(y, NO_HINT)); | 250           : %$toString(%$toPrimitive(y, NO_HINT)); | 
| 251     } | 251     } | 
| 252   } | 252   } | 
| 253   return %_StringAdd(this, y); | 253   return %_StringAdd(this, y); | 
| 254 } | 254 } | 
| 255 | 255 | 
| 256 | 256 | 
| 257 // Left operand (this) is already a string. | 257 // Left operand (this) is already a string. | 
| 258 STRING_ADD_LEFT_STRONG = function STRING_ADD_LEFT_STRONG(y) { | 258 STRING_ADD_LEFT_STRONG = function STRING_ADD_LEFT_STRONG(y) { | 
| 259   if (IS_STRING(y)) { | 259   if (IS_STRING(y)) { | 
| 260     return %_StringAdd(this, y); | 260     return %_StringAdd(this, y); | 
| 261   } | 261   } | 
| 262   throw %MakeTypeError(kStrongImplicitCast); | 262   throw %MakeTypeError('strong_implicit_cast'); | 
| 263 } | 263 } | 
| 264 | 264 | 
| 265 | 265 | 
| 266 // Right operand (y) is already a string. | 266 // Right operand (y) is already a string. | 
| 267 STRING_ADD_RIGHT = function STRING_ADD_RIGHT(y) { | 267 STRING_ADD_RIGHT = function STRING_ADD_RIGHT(y) { | 
| 268   var x = this; | 268   var x = this; | 
| 269   if (!IS_STRING(x)) { | 269   if (!IS_STRING(x)) { | 
| 270     if (IS_STRING_WRAPPER(x) && %_IsStringWrapperSafeForDefaultValueOf(x)) { | 270     if (IS_STRING_WRAPPER(x) && %_IsStringWrapperSafeForDefaultValueOf(x)) { | 
| 271       x = %_ValueOf(x); | 271       x = %_ValueOf(x); | 
| 272     } else { | 272     } else { | 
| 273       x = IS_NUMBER(x) | 273       x = IS_NUMBER(x) | 
| 274           ? %_NumberToString(x) | 274           ? %_NumberToString(x) | 
| 275           : %$toString(%$toPrimitive(x, NO_HINT)); | 275           : %$toString(%$toPrimitive(x, NO_HINT)); | 
| 276     } | 276     } | 
| 277   } | 277   } | 
| 278   return %_StringAdd(x, y); | 278   return %_StringAdd(x, y); | 
| 279 } | 279 } | 
| 280 | 280 | 
| 281 | 281 | 
| 282 // Right operand (y) is already a string. | 282 // Right operand (y) is already a string. | 
| 283 STRING_ADD_RIGHT_STRONG = function STRING_ADD_RIGHT_STRONG(y) { | 283 STRING_ADD_RIGHT_STRONG = function STRING_ADD_RIGHT_STRONG(y) { | 
| 284   if (IS_STRING(this)) { | 284   if (IS_STRING(this)) { | 
| 285     return %_StringAdd(this, y); | 285     return %_StringAdd(this, y); | 
| 286   } | 286   } | 
| 287   throw %MakeTypeError(kStrongImplicitCast); | 287   throw %MakeTypeError('strong_implicit_cast'); | 
| 288 } | 288 } | 
| 289 | 289 | 
| 290 | 290 | 
| 291 // ECMA-262, section 11.6.2, page 50. | 291 // ECMA-262, section 11.6.2, page 50. | 
| 292 SUB = function SUB(y) { | 292 SUB = function SUB(y) { | 
| 293   var x = IS_NUMBER(this) ? this : %$nonNumberToNumber(this); | 293   var x = IS_NUMBER(this) ? this : %$nonNumberToNumber(this); | 
| 294   if (!IS_NUMBER(y)) y = %$nonNumberToNumber(y); | 294   if (!IS_NUMBER(y)) y = %$nonNumberToNumber(y); | 
| 295   return %NumberSub(x, y); | 295   return %NumberSub(x, y); | 
| 296 } | 296 } | 
| 297 | 297 | 
| 298 | 298 | 
| 299 // Strong mode SUB throws if an implicit conversion would be performed | 299 // Strong mode SUB throws if an implicit conversion would be performed | 
| 300 SUB_STRONG = function SUB_STRONG(y) { | 300 SUB_STRONG = function SUB_STRONG(y) { | 
| 301   if (IS_NUMBER(this) && IS_NUMBER(y)) { | 301   if (IS_NUMBER(this) && IS_NUMBER(y)) { | 
| 302     return %NumberSub(this, y); | 302     return %NumberSub(this, y); | 
| 303   } | 303   } | 
| 304   throw %MakeTypeError(kStrongImplicitCast); | 304   throw %MakeTypeError('strong_implicit_cast'); | 
| 305 } | 305 } | 
| 306 | 306 | 
| 307 | 307 | 
| 308 // ECMA-262, section 11.5.1, page 48. | 308 // ECMA-262, section 11.5.1, page 48. | 
| 309 MUL = function MUL(y) { | 309 MUL = function MUL(y) { | 
| 310   var x = IS_NUMBER(this) ? this : %$nonNumberToNumber(this); | 310   var x = IS_NUMBER(this) ? this : %$nonNumberToNumber(this); | 
| 311   if (!IS_NUMBER(y)) y = %$nonNumberToNumber(y); | 311   if (!IS_NUMBER(y)) y = %$nonNumberToNumber(y); | 
| 312   return %NumberMul(x, y); | 312   return %NumberMul(x, y); | 
| 313 } | 313 } | 
| 314 | 314 | 
| 315 | 315 | 
| 316 // Strong mode MUL throws if an implicit conversion would be performed | 316 // Strong mode MUL throws if an implicit conversion would be performed | 
| 317 MUL_STRONG = function MUL_STRONG(y) { | 317 MUL_STRONG = function MUL_STRONG(y) { | 
| 318   if (IS_NUMBER(this) && IS_NUMBER(y)) { | 318   if (IS_NUMBER(this) && IS_NUMBER(y)) { | 
| 319     return %NumberMul(this, y); | 319     return %NumberMul(this, y); | 
| 320   } | 320   } | 
| 321   throw %MakeTypeError(kStrongImplicitCast); | 321   throw %MakeTypeError('strong_implicit_cast'); | 
| 322 } | 322 } | 
| 323 | 323 | 
| 324 | 324 | 
| 325 // ECMA-262, section 11.5.2, page 49. | 325 // ECMA-262, section 11.5.2, page 49. | 
| 326 DIV = function DIV(y) { | 326 DIV = function DIV(y) { | 
| 327   var x = IS_NUMBER(this) ? this : %$nonNumberToNumber(this); | 327   var x = IS_NUMBER(this) ? this : %$nonNumberToNumber(this); | 
| 328   if (!IS_NUMBER(y)) y = %$nonNumberToNumber(y); | 328   if (!IS_NUMBER(y)) y = %$nonNumberToNumber(y); | 
| 329   return %NumberDiv(x, y); | 329   return %NumberDiv(x, y); | 
| 330 } | 330 } | 
| 331 | 331 | 
| 332 | 332 | 
| 333 // Strong mode DIV throws if an implicit conversion would be performed | 333 // Strong mode DIV throws if an implicit conversion would be performed | 
| 334 DIV_STRONG = function DIV_STRONG(y) { | 334 DIV_STRONG = function DIV_STRONG(y) { | 
| 335   if (IS_NUMBER(this) && IS_NUMBER(y)) { | 335   if (IS_NUMBER(this) && IS_NUMBER(y)) { | 
| 336     return %NumberDiv(this, y); | 336     return %NumberDiv(this, y); | 
| 337   } | 337   } | 
| 338   throw %MakeTypeError(kStrongImplicitCast); | 338   throw %MakeTypeError('strong_implicit_cast'); | 
| 339 } | 339 } | 
| 340 | 340 | 
| 341 | 341 | 
| 342 // ECMA-262, section 11.5.3, page 49. | 342 // ECMA-262, section 11.5.3, page 49. | 
| 343 MOD = function MOD(y) { | 343 MOD = function MOD(y) { | 
| 344   var x = IS_NUMBER(this) ? this : %$nonNumberToNumber(this); | 344   var x = IS_NUMBER(this) ? this : %$nonNumberToNumber(this); | 
| 345   if (!IS_NUMBER(y)) y = %$nonNumberToNumber(y); | 345   if (!IS_NUMBER(y)) y = %$nonNumberToNumber(y); | 
| 346   return %NumberMod(x, y); | 346   return %NumberMod(x, y); | 
| 347 } | 347 } | 
| 348 | 348 | 
| 349 | 349 | 
| 350 // Strong mode MOD throws if an implicit conversion would be performed | 350 // Strong mode MOD throws if an implicit conversion would be performed | 
| 351 MOD_STRONG = function MOD_STRONG(y) { | 351 MOD_STRONG = function MOD_STRONG(y) { | 
| 352   if (IS_NUMBER(this) && IS_NUMBER(y)) { | 352   if (IS_NUMBER(this) && IS_NUMBER(y)) { | 
| 353     return %NumberMod(this, y); | 353     return %NumberMod(this, y); | 
| 354   } | 354   } | 
| 355   throw %MakeTypeError(kStrongImplicitCast); | 355   throw %MakeTypeError('strong_implicit_cast'); | 
| 356 } | 356 } | 
| 357 | 357 | 
| 358 | 358 | 
| 359 /* ------------------------------------------- | 359 /* ------------------------------------------- | 
| 360    - - -   B i t   o p e r a t i o n s   - - - | 360    - - -   B i t   o p e r a t i o n s   - - - | 
| 361    ------------------------------------------- | 361    ------------------------------------------- | 
| 362 */ | 362 */ | 
| 363 | 363 | 
| 364 // ECMA-262, section 11.10, page 57. | 364 // ECMA-262, section 11.10, page 57. | 
| 365 BIT_OR = function BIT_OR(y) { | 365 BIT_OR = function BIT_OR(y) { | 
| 366   var x = IS_NUMBER(this) ? this : %$nonNumberToNumber(this); | 366   var x = IS_NUMBER(this) ? this : %$nonNumberToNumber(this); | 
| 367   if (!IS_NUMBER(y)) y = %$nonNumberToNumber(y); | 367   if (!IS_NUMBER(y)) y = %$nonNumberToNumber(y); | 
| 368   return %NumberOr(x, y); | 368   return %NumberOr(x, y); | 
| 369 } | 369 } | 
| 370 | 370 | 
| 371 | 371 | 
| 372 // Strong mode BIT_OR throws if an implicit conversion would be performed | 372 // Strong mode BIT_OR throws if an implicit conversion would be performed | 
| 373 BIT_OR_STRONG = function BIT_OR_STRONG(y) { | 373 BIT_OR_STRONG = function BIT_OR_STRONG(y) { | 
| 374   if (IS_NUMBER(this) && IS_NUMBER(y)) { | 374   if (IS_NUMBER(this) && IS_NUMBER(y)) { | 
| 375     return %NumberOr(this, y); | 375     return %NumberOr(this, y); | 
| 376   } | 376   } | 
| 377   throw %MakeTypeError(kStrongImplicitCast); | 377   throw %MakeTypeError('strong_implicit_cast'); | 
| 378 } | 378 } | 
| 379 | 379 | 
| 380 | 380 | 
| 381 // ECMA-262, section 11.10, page 57. | 381 // ECMA-262, section 11.10, page 57. | 
| 382 BIT_AND = function BIT_AND(y) { | 382 BIT_AND = function BIT_AND(y) { | 
| 383   var x; | 383   var x; | 
| 384   if (IS_NUMBER(this)) { | 384   if (IS_NUMBER(this)) { | 
| 385     x = this; | 385     x = this; | 
| 386     if (!IS_NUMBER(y)) y = %$nonNumberToNumber(y); | 386     if (!IS_NUMBER(y)) y = %$nonNumberToNumber(y); | 
| 387   } else { | 387   } else { | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 398   } | 398   } | 
| 399   return %NumberAnd(x, y); | 399   return %NumberAnd(x, y); | 
| 400 } | 400 } | 
| 401 | 401 | 
| 402 | 402 | 
| 403 // Strong mode BIT_AND throws if an implicit conversion would be performed | 403 // Strong mode BIT_AND throws if an implicit conversion would be performed | 
| 404 BIT_AND_STRONG = function BIT_AND_STRONG(y) { | 404 BIT_AND_STRONG = function BIT_AND_STRONG(y) { | 
| 405   if (IS_NUMBER(this) && IS_NUMBER(y)) { | 405   if (IS_NUMBER(this) && IS_NUMBER(y)) { | 
| 406     return %NumberAnd(this, y); | 406     return %NumberAnd(this, y); | 
| 407   } | 407   } | 
| 408   throw %MakeTypeError(kStrongImplicitCast); | 408   throw %MakeTypeError('strong_implicit_cast'); | 
| 409 } | 409 } | 
| 410 | 410 | 
| 411 | 411 | 
| 412 // ECMA-262, section 11.10, page 57. | 412 // ECMA-262, section 11.10, page 57. | 
| 413 BIT_XOR = function BIT_XOR(y) { | 413 BIT_XOR = function BIT_XOR(y) { | 
| 414   var x = IS_NUMBER(this) ? this : %$nonNumberToNumber(this); | 414   var x = IS_NUMBER(this) ? this : %$nonNumberToNumber(this); | 
| 415   if (!IS_NUMBER(y)) y = %$nonNumberToNumber(y); | 415   if (!IS_NUMBER(y)) y = %$nonNumberToNumber(y); | 
| 416   return %NumberXor(x, y); | 416   return %NumberXor(x, y); | 
| 417 } | 417 } | 
| 418 | 418 | 
| 419 | 419 | 
| 420 // Strong mode BIT_XOR throws if an implicit conversion would be performed | 420 // Strong mode BIT_XOR throws if an implicit conversion would be performed | 
| 421 BIT_XOR_STRONG = function BIT_XOR_STRONG(y) { | 421 BIT_XOR_STRONG = function BIT_XOR_STRONG(y) { | 
| 422   if (IS_NUMBER(this) && IS_NUMBER(y)) { | 422   if (IS_NUMBER(this) && IS_NUMBER(y)) { | 
| 423     return %NumberXor(this, y); | 423     return %NumberXor(this, y); | 
| 424   } | 424   } | 
| 425   throw %MakeTypeError(kStrongImplicitCast); | 425   throw %MakeTypeError('strong_implicit_cast'); | 
| 426 } | 426 } | 
| 427 | 427 | 
| 428 | 428 | 
| 429 // ECMA-262, section 11.7.1, page 51. | 429 // ECMA-262, section 11.7.1, page 51. | 
| 430 SHL = function SHL(y) { | 430 SHL = function SHL(y) { | 
| 431   var x = IS_NUMBER(this) ? this : %$nonNumberToNumber(this); | 431   var x = IS_NUMBER(this) ? this : %$nonNumberToNumber(this); | 
| 432   if (!IS_NUMBER(y)) y = %$nonNumberToNumber(y); | 432   if (!IS_NUMBER(y)) y = %$nonNumberToNumber(y); | 
| 433   return %NumberShl(x, y); | 433   return %NumberShl(x, y); | 
| 434 } | 434 } | 
| 435 | 435 | 
| 436 | 436 | 
| 437 // Strong mode SHL throws if an implicit conversion would be performed | 437 // Strong mode SHL throws if an implicit conversion would be performed | 
| 438 SHL_STRONG = function SHL_STRONG(y) { | 438 SHL_STRONG = function SHL_STRONG(y) { | 
| 439   if (IS_NUMBER(this) && IS_NUMBER(y)) { | 439   if (IS_NUMBER(this) && IS_NUMBER(y)) { | 
| 440     return %NumberShl(this, y); | 440     return %NumberShl(this, y); | 
| 441   } | 441   } | 
| 442   throw %MakeTypeError(kStrongImplicitCast); | 442   throw %MakeTypeError('strong_implicit_cast'); | 
| 443 } | 443 } | 
| 444 | 444 | 
| 445 | 445 | 
| 446 // ECMA-262, section 11.7.2, page 51. | 446 // ECMA-262, section 11.7.2, page 51. | 
| 447 SAR = function SAR(y) { | 447 SAR = function SAR(y) { | 
| 448   var x; | 448   var x; | 
| 449   if (IS_NUMBER(this)) { | 449   if (IS_NUMBER(this)) { | 
| 450     x = this; | 450     x = this; | 
| 451     if (!IS_NUMBER(y)) y = %$nonNumberToNumber(y); | 451     if (!IS_NUMBER(y)) y = %$nonNumberToNumber(y); | 
| 452   } else { | 452   } else { | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 463   } | 463   } | 
| 464   return %NumberSar(x, y); | 464   return %NumberSar(x, y); | 
| 465 } | 465 } | 
| 466 | 466 | 
| 467 | 467 | 
| 468 // Strong mode SAR throws if an implicit conversion would be performed | 468 // Strong mode SAR throws if an implicit conversion would be performed | 
| 469 SAR_STRONG = function SAR_STRONG(y) { | 469 SAR_STRONG = function SAR_STRONG(y) { | 
| 470   if (IS_NUMBER(this) && IS_NUMBER(y)) { | 470   if (IS_NUMBER(this) && IS_NUMBER(y)) { | 
| 471     return %NumberSar(this, y); | 471     return %NumberSar(this, y); | 
| 472   } | 472   } | 
| 473   throw %MakeTypeError(kStrongImplicitCast); | 473   throw %MakeTypeError('strong_implicit_cast'); | 
| 474 } | 474 } | 
| 475 | 475 | 
| 476 | 476 | 
| 477 // ECMA-262, section 11.7.3, page 52. | 477 // ECMA-262, section 11.7.3, page 52. | 
| 478 SHR = function SHR(y) { | 478 SHR = function SHR(y) { | 
| 479   var x = IS_NUMBER(this) ? this : %$nonNumberToNumber(this); | 479   var x = IS_NUMBER(this) ? this : %$nonNumberToNumber(this); | 
| 480   if (!IS_NUMBER(y)) y = %$nonNumberToNumber(y); | 480   if (!IS_NUMBER(y)) y = %$nonNumberToNumber(y); | 
| 481   return %NumberShr(x, y); | 481   return %NumberShr(x, y); | 
| 482 } | 482 } | 
| 483 | 483 | 
| 484 | 484 | 
| 485 // Strong mode SHR throws if an implicit conversion would be performed | 485 // Strong mode SHR throws if an implicit conversion would be performed | 
| 486 SHR_STRONG = function SHR_STRONG(y) { | 486 SHR_STRONG = function SHR_STRONG(y) { | 
| 487   if (IS_NUMBER(this) && IS_NUMBER(y)) { | 487   if (IS_NUMBER(this) && IS_NUMBER(y)) { | 
| 488     return %NumberShr(this, y); | 488     return %NumberShr(this, y); | 
| 489   } | 489   } | 
| 490   throw %MakeTypeError(kStrongImplicitCast); | 490   throw %MakeTypeError('strong_implicit_cast'); | 
| 491 } | 491 } | 
| 492 | 492 | 
| 493 | 493 | 
| 494 /* ----------------------------- | 494 /* ----------------------------- | 
| 495    - - -   H e l p e r s   - - - | 495    - - -   H e l p e r s   - - - | 
| 496    ----------------------------- | 496    ----------------------------- | 
| 497 */ | 497 */ | 
| 498 | 498 | 
| 499 // ECMA-262, section 11.4.1, page 46. | 499 // ECMA-262, section 11.4.1, page 46. | 
| 500 DELETE = function DELETE(key, language_mode) { | 500 DELETE = function DELETE(key, language_mode) { | 
| (...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 991 $toLength = ToLength; | 991 $toLength = ToLength; | 
| 992 $toName = ToName; | 992 $toName = ToName; | 
| 993 $toNumber = ToNumber; | 993 $toNumber = ToNumber; | 
| 994 $toObject = ToObject; | 994 $toObject = ToObject; | 
| 995 $toPositiveInteger = ToPositiveInteger; | 995 $toPositiveInteger = ToPositiveInteger; | 
| 996 $toPrimitive = ToPrimitive; | 996 $toPrimitive = ToPrimitive; | 
| 997 $toString = ToString; | 997 $toString = ToString; | 
| 998 $toUint32 = ToUint32; | 998 $toUint32 = ToUint32; | 
| 999 | 999 | 
| 1000 })(); | 1000 })(); | 
| OLD | NEW | 
|---|