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