| 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 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 return this < x.length; | 430 return this < x.length; |
| 431 } | 431 } |
| 432 return %HasElement(x, this); | 432 return %HasElement(x, this); |
| 433 } | 433 } |
| 434 return %HasProperty(x, %to_name(this)); | 434 return %HasProperty(x, %to_name(this)); |
| 435 } | 435 } |
| 436 | 436 |
| 437 | 437 |
| 438 function CALL_NON_FUNCTION() { | 438 function CALL_NON_FUNCTION() { |
| 439 var delegate = %GetFunctionDelegate(this); | 439 var delegate = %GetFunctionDelegate(this); |
| 440 if (!IS_FUNCTION(delegate)) { | |
| 441 var callsite = %RenderCallSite(); | |
| 442 if (callsite == "") callsite = typeof this; | |
| 443 throw %make_type_error(kCalledNonCallable, callsite); | |
| 444 } | |
| 445 return %Apply(delegate, this, arguments, 0, %_ArgumentsLength()); | 440 return %Apply(delegate, this, arguments, 0, %_ArgumentsLength()); |
| 446 } | 441 } |
| 447 | 442 |
| 448 | 443 |
| 449 function CALL_NON_FUNCTION_AS_CONSTRUCTOR() { | 444 function CALL_NON_FUNCTION_AS_CONSTRUCTOR() { |
| 450 var delegate = %GetConstructorDelegate(this); | 445 var delegate = %GetConstructorDelegate(this); |
| 451 if (!IS_FUNCTION(delegate)) { | |
| 452 var callsite = %RenderCallSite(); | |
| 453 if (callsite == "") callsite = typeof this; | |
| 454 throw %make_type_error(kCalledNonCallable, callsite); | |
| 455 } | |
| 456 return %Apply(delegate, this, arguments, 0, %_ArgumentsLength()); | 446 return %Apply(delegate, this, arguments, 0, %_ArgumentsLength()); |
| 457 } | 447 } |
| 458 | 448 |
| 459 | 449 |
| 460 function CALL_FUNCTION_PROXY() { | 450 function CALL_FUNCTION_PROXY() { |
| 461 var arity = %_ArgumentsLength() - 1; | 451 var arity = %_ArgumentsLength() - 1; |
| 462 var proxy = %_Arguments(arity); // The proxy comes in as an additional arg. | 452 var proxy = %_Arguments(arity); // The proxy comes in as an additional arg. |
| 463 var trap = %GetCallTrap(proxy); | 453 var trap = %GetCallTrap(proxy); |
| 464 return %Apply(trap, this, arguments, 0, arity); | 454 return %Apply(trap, this, arguments, 0, arity); |
| 465 } | 455 } |
| 466 | 456 |
| 467 | 457 |
| 468 function CALL_FUNCTION_PROXY_AS_CONSTRUCTOR () { | 458 function CALL_FUNCTION_PROXY_AS_CONSTRUCTOR () { |
| 469 var proxy = this; | 459 var proxy = this; |
| 470 var trap = %GetConstructTrap(proxy); | 460 var trap = %GetConstructTrap(proxy); |
| 471 return %Apply(trap, this, arguments, 0, %_ArgumentsLength()); | 461 return %Apply(trap, this, arguments, 0, %_ArgumentsLength()); |
| 472 } | 462 } |
| 473 | 463 |
| 474 | 464 |
| 475 function APPLY_PREPARE(args) { | 465 function APPLY_PREPARE(args) { |
| 476 var length; | 466 var length; |
| 477 // First check whether length is a positive Smi and args is an | 467 // First check whether length is a positive Smi and args is an |
| 478 // array. This is the fast case. If this fails, we do the slow case | 468 // array. This is the fast case. If this fails, we do the slow case |
| 479 // that takes care of more eventualities. | 469 // that takes care of more eventualities. |
| 480 if (IS_ARRAY(args)) { | 470 if (IS_ARRAY(args)) { |
| 481 length = args.length; | 471 length = args.length; |
| 482 if (%_IsSmi(length) && length >= 0 && length < kSafeArgumentsLength && | 472 if (%_IsSmi(length) && length >= 0 && length < kSafeArgumentsLength && |
| 483 IS_SPEC_FUNCTION(this)) { | 473 IS_CALLABLE(this)) { |
| 484 return length; | 474 return length; |
| 485 } | 475 } |
| 486 } | 476 } |
| 487 | 477 |
| 488 length = (args == null) ? 0 : TO_UINT32(args.length); | 478 length = (args == null) ? 0 : TO_UINT32(args.length); |
| 489 | 479 |
| 490 // We can handle any number of apply arguments if the stack is | 480 // We can handle any number of apply arguments if the stack is |
| 491 // big enough, but sanity check the value to avoid overflow when | 481 // big enough, but sanity check the value to avoid overflow when |
| 492 // multiplying with pointer size. | 482 // multiplying with pointer size. |
| 493 if (length > kSafeArgumentsLength) throw %make_range_error(kStackOverflow); | 483 if (length > kSafeArgumentsLength) throw %make_range_error(kStackOverflow); |
| 494 | 484 |
| 495 if (!IS_SPEC_FUNCTION(this)) { | 485 if (!IS_CALLABLE(this)) { |
| 496 throw %make_type_error(kApplyNonFunction, %to_string_fun(this), typeof this)
; | 486 throw %make_type_error(kApplyNonFunction, %to_string_fun(this), |
| 487 typeof this); |
| 497 } | 488 } |
| 498 | 489 |
| 499 // Make sure the arguments list has the right type. | 490 // Make sure the arguments list has the right type. |
| 500 if (args != null && !IS_SPEC_OBJECT(args)) { | 491 if (args != null && !IS_SPEC_OBJECT(args)) { |
| 501 throw %make_type_error(kWrongArgs, "Function.prototype.apply"); | 492 throw %make_type_error(kWrongArgs, "Function.prototype.apply"); |
| 502 } | 493 } |
| 503 | 494 |
| 504 // Return the length which is the number of arguments to copy to the | 495 // Return the length which is the number of arguments to copy to the |
| 505 // stack. It is guaranteed to be a small integer at this point. | 496 // stack. It is guaranteed to be a small integer at this point. |
| 506 return length; | 497 return length; |
| 507 } | 498 } |
| 508 | 499 |
| 509 | 500 |
| 510 function REFLECT_APPLY_PREPARE(args) { | 501 function REFLECT_APPLY_PREPARE(args) { |
| 511 var length; | 502 var length; |
| 512 // First check whether length is a positive Smi and args is an | 503 // First check whether length is a positive Smi and args is an |
| 513 // array. This is the fast case. If this fails, we do the slow case | 504 // array. This is the fast case. If this fails, we do the slow case |
| 514 // that takes care of more eventualities. | 505 // that takes care of more eventualities. |
| 515 if (IS_ARRAY(args)) { | 506 if (IS_ARRAY(args)) { |
| 516 length = args.length; | 507 length = args.length; |
| 517 if (%_IsSmi(length) && length >= 0 && length < kSafeArgumentsLength && | 508 if (%_IsSmi(length) && length >= 0 && length < kSafeArgumentsLength && |
| 518 IS_SPEC_FUNCTION(this)) { | 509 IS_CALLABLE(this)) { |
| 519 return length; | 510 return length; |
| 520 } | 511 } |
| 521 } | 512 } |
| 522 | 513 |
| 523 if (!IS_SPEC_FUNCTION(this)) { | 514 if (!IS_CALLABLE(this)) { |
| 524 throw %make_type_error(kCalledNonCallable, %to_string_fun(this)); | 515 throw %make_type_error(kCalledNonCallable, %to_string_fun(this)); |
| 525 } | 516 } |
| 526 | 517 |
| 527 if (!IS_SPEC_OBJECT(args)) { | 518 if (!IS_SPEC_OBJECT(args)) { |
| 528 throw %make_type_error(kWrongArgs, "Reflect.apply"); | 519 throw %make_type_error(kWrongArgs, "Reflect.apply"); |
| 529 } | 520 } |
| 530 | 521 |
| 531 length = %to_length_fun(args.length); | 522 length = %to_length_fun(args.length); |
| 532 | 523 |
| 533 // We can handle any number of apply arguments if the stack is | 524 // We can handle any number of apply arguments if the stack is |
| 534 // big enough, but sanity check the value to avoid overflow when | 525 // big enough, but sanity check the value to avoid overflow when |
| 535 // multiplying with pointer size. | 526 // multiplying with pointer size. |
| 536 if (length > kSafeArgumentsLength) throw %make_range_error(kStackOverflow); | 527 if (length > kSafeArgumentsLength) throw %make_range_error(kStackOverflow); |
| 537 | 528 |
| 538 // Return the length which is the number of arguments to copy to the | 529 // Return the length which is the number of arguments to copy to the |
| 539 // stack. It is guaranteed to be a small integer at this point. | 530 // stack. It is guaranteed to be a small integer at this point. |
| 540 return length; | 531 return length; |
| 541 } | 532 } |
| 542 | 533 |
| 543 | 534 |
| 544 function REFLECT_CONSTRUCT_PREPARE( | 535 function REFLECT_CONSTRUCT_PREPARE( |
| 545 args, newTarget) { | 536 args, newTarget) { |
| 546 var length; | 537 var length; |
| 547 var ctorOk = IS_SPEC_FUNCTION(this) && %IsConstructor(this); | 538 var ctorOk = IS_CALLABLE(this) && %IsConstructor(this); |
| 548 var newTargetOk = IS_SPEC_FUNCTION(newTarget) && %IsConstructor(newTarget); | 539 var newTargetOk = IS_CALLABLE(newTarget) && %IsConstructor(newTarget); |
| 549 | 540 |
| 550 // First check whether length is a positive Smi and args is an | 541 // First check whether length is a positive Smi and args is an |
| 551 // array. This is the fast case. If this fails, we do the slow case | 542 // array. This is the fast case. If this fails, we do the slow case |
| 552 // that takes care of more eventualities. | 543 // that takes care of more eventualities. |
| 553 if (IS_ARRAY(args)) { | 544 if (IS_ARRAY(args)) { |
| 554 length = args.length; | 545 length = args.length; |
| 555 if (%_IsSmi(length) && length >= 0 && length < kSafeArgumentsLength && | 546 if (%_IsSmi(length) && length >= 0 && length < kSafeArgumentsLength && |
| 556 ctorOk && newTargetOk) { | 547 ctorOk && newTargetOk) { |
| 557 return length; | 548 return length; |
| 558 } | 549 } |
| 559 } | 550 } |
| 560 | 551 |
| 561 if (!ctorOk) { | 552 if (!ctorOk) { |
| 562 if (!IS_SPEC_FUNCTION(this)) { | 553 if (!IS_CALLABLE(this)) { |
| 563 throw %make_type_error(kCalledNonCallable, %to_string_fun(this)); | 554 throw %make_type_error(kCalledNonCallable, %to_string_fun(this)); |
| 564 } else { | 555 } else { |
| 565 throw %make_type_error(kNotConstructor, %to_string_fun(this)); | 556 throw %make_type_error(kNotConstructor, %to_string_fun(this)); |
| 566 } | 557 } |
| 567 } | 558 } |
| 568 | 559 |
| 569 if (!newTargetOk) { | 560 if (!newTargetOk) { |
| 570 if (!IS_SPEC_FUNCTION(newTarget)) { | 561 if (!IS_CALLABLE(newTarget)) { |
| 571 throw %make_type_error(kCalledNonCallable, %to_string_fun(newTarget)); | 562 throw %make_type_error(kCalledNonCallable, %to_string_fun(newTarget)); |
| 572 } else { | 563 } else { |
| 573 throw %make_type_error(kNotConstructor, %to_string_fun(newTarget)); | 564 throw %make_type_error(kNotConstructor, %to_string_fun(newTarget)); |
| 574 } | 565 } |
| 575 } | 566 } |
| 576 | 567 |
| 577 if (!IS_SPEC_OBJECT(args)) { | 568 if (!IS_SPEC_OBJECT(args)) { |
| 578 throw %make_type_error(kWrongArgs, "Reflect.construct"); | 569 throw %make_type_error(kWrongArgs, "Reflect.construct"); |
| 579 } | 570 } |
| 580 | 571 |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 764 if (!IS_SPEC_OBJECT(O)) return false; | 755 if (!IS_SPEC_OBJECT(O)) return false; |
| 765 var spreadable = O[symbolIsConcatSpreadable]; | 756 var spreadable = O[symbolIsConcatSpreadable]; |
| 766 if (IS_UNDEFINED(spreadable)) return IS_ARRAY(O); | 757 if (IS_UNDEFINED(spreadable)) return IS_ARRAY(O); |
| 767 return ToBoolean(spreadable); | 758 return ToBoolean(spreadable); |
| 768 } | 759 } |
| 769 | 760 |
| 770 | 761 |
| 771 // ECMA-262, section 8.6.2.6, page 28. | 762 // ECMA-262, section 8.6.2.6, page 28. |
| 772 function DefaultNumber(x) { | 763 function DefaultNumber(x) { |
| 773 var valueOf = x.valueOf; | 764 var valueOf = x.valueOf; |
| 774 if (IS_SPEC_FUNCTION(valueOf)) { | 765 if (IS_CALLABLE(valueOf)) { |
| 775 var v = %_CallFunction(x, valueOf); | 766 var v = %_CallFunction(x, valueOf); |
| 776 if (IS_SYMBOL(v)) throw MakeTypeError(kSymbolToNumber); | 767 if (IS_SYMBOL(v)) throw MakeTypeError(kSymbolToNumber); |
| 777 if (IS_SIMD_VALUE(x)) throw MakeTypeError(kSimdToNumber); | 768 if (IS_SIMD_VALUE(x)) throw MakeTypeError(kSimdToNumber); |
| 778 if (IsPrimitive(v)) return v; | 769 if (IsPrimitive(v)) return v; |
| 779 } | 770 } |
| 780 var toString = x.toString; | 771 var toString = x.toString; |
| 781 if (IS_SPEC_FUNCTION(toString)) { | 772 if (IS_CALLABLE(toString)) { |
| 782 var s = %_CallFunction(x, toString); | 773 var s = %_CallFunction(x, toString); |
| 783 if (IsPrimitive(s)) return s; | 774 if (IsPrimitive(s)) return s; |
| 784 } | 775 } |
| 785 throw MakeTypeError(kCannotConvertToPrimitive); | 776 throw MakeTypeError(kCannotConvertToPrimitive); |
| 786 } | 777 } |
| 787 | 778 |
| 788 // ECMA-262, section 8.6.2.6, page 28. | 779 // ECMA-262, section 8.6.2.6, page 28. |
| 789 function DefaultString(x) { | 780 function DefaultString(x) { |
| 790 if (!IS_SYMBOL_WRAPPER(x)) { | 781 if (!IS_SYMBOL_WRAPPER(x)) { |
| 791 if (IS_SYMBOL(x)) throw MakeTypeError(kSymbolToString); | 782 if (IS_SYMBOL(x)) throw MakeTypeError(kSymbolToString); |
| 792 var toString = x.toString; | 783 var toString = x.toString; |
| 793 if (IS_SPEC_FUNCTION(toString)) { | 784 if (IS_CALLABLE(toString)) { |
| 794 var s = %_CallFunction(x, toString); | 785 var s = %_CallFunction(x, toString); |
| 795 if (IsPrimitive(s)) return s; | 786 if (IsPrimitive(s)) return s; |
| 796 } | 787 } |
| 797 | 788 |
| 798 var valueOf = x.valueOf; | 789 var valueOf = x.valueOf; |
| 799 if (IS_SPEC_FUNCTION(valueOf)) { | 790 if (IS_CALLABLE(valueOf)) { |
| 800 var v = %_CallFunction(x, valueOf); | 791 var v = %_CallFunction(x, valueOf); |
| 801 if (IsPrimitive(v)) return v; | 792 if (IsPrimitive(v)) return v; |
| 802 } | 793 } |
| 803 } | 794 } |
| 804 throw MakeTypeError(kCannotConvertToPrimitive); | 795 throw MakeTypeError(kCannotConvertToPrimitive); |
| 805 } | 796 } |
| 806 | 797 |
| 807 function ToPositiveInteger(x, rangeErrorIndex) { | 798 function ToPositiveInteger(x, rangeErrorIndex) { |
| 808 var i = TO_INTEGER_MAP_MINUS_ZERO(x); | 799 var i = TO_INTEGER_MAP_MINUS_ZERO(x); |
| 809 if (i < 0) throw MakeRangeError(rangeErrorIndex); | 800 if (i < 0) throw MakeRangeError(rangeErrorIndex); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 895 utils.Export(function(to) { | 886 utils.Export(function(to) { |
| 896 to.ToBoolean = ToBoolean; | 887 to.ToBoolean = ToBoolean; |
| 897 to.ToLength = ToLength; | 888 to.ToLength = ToLength; |
| 898 to.ToName = ToName; | 889 to.ToName = ToName; |
| 899 to.ToNumber = ToNumber; | 890 to.ToNumber = ToNumber; |
| 900 to.ToPrimitive = ToPrimitive; | 891 to.ToPrimitive = ToPrimitive; |
| 901 to.ToString = ToString; | 892 to.ToString = ToString; |
| 902 }); | 893 }); |
| 903 | 894 |
| 904 }) | 895 }) |
| OLD | NEW |