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 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
428 if (%_IsNonNegativeSmi(this)) { | 428 if (%_IsNonNegativeSmi(this)) { |
429 if (IS_ARRAY(x) && %_HasFastPackedElements(x)) { | 429 if (IS_ARRAY(x) && %_HasFastPackedElements(x)) { |
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, %$toName(this)); | 434 return %HasProperty(x, %$toName(this)); |
435 } | 435 } |
436 | 436 |
437 | 437 |
438 // ECMA-262, section 11.8.6, page 54. To make the implementation more | |
439 // efficient, the return value should be zero if the 'this' is an | |
440 // instance of F, and non-zero if not. This makes it possible to avoid | |
441 // an expensive ToBoolean conversion in the generated code. | |
442 function INSTANCE_OF(F) { | |
443 var V = this; | |
444 if (!IS_SPEC_FUNCTION(F)) { | |
445 throw %MakeTypeError(kInstanceofFunctionExpected, F); | |
446 } | |
447 | |
448 // If V is not an object, return false. | |
449 if (!IS_SPEC_OBJECT(V)) { | |
450 return 1; | |
451 } | |
452 | |
453 // Check if function is bound, if so, get [[BoundFunction]] from it | |
454 // and use that instead of F. | |
455 var bindings = %BoundFunctionGetBindings(F); | |
456 if (bindings) { | |
457 F = bindings[kBoundFunctionIndex]; // Always a non-bound function. | |
458 } | |
459 // Get the prototype of F; if it is not an object, throw an error. | |
460 var O = F.prototype; | |
461 if (!IS_SPEC_OBJECT(O)) { | |
462 throw %MakeTypeError(kInstanceofNonobjectProto, O); | |
463 } | |
464 | |
465 // Return whether or not O is in the prototype chain of V. | |
466 return %IsInPrototypeChain(O, V) ? 0 : 1; | |
467 } | |
468 | |
469 | |
470 function CALL_NON_FUNCTION() { | 438 function CALL_NON_FUNCTION() { |
471 var delegate = %GetFunctionDelegate(this); | 439 var delegate = %GetFunctionDelegate(this); |
472 if (!IS_FUNCTION(delegate)) { | 440 if (!IS_FUNCTION(delegate)) { |
473 var callsite = %RenderCallSite(); | 441 var callsite = %RenderCallSite(); |
474 if (callsite == "") callsite = typeof this; | 442 if (callsite == "") callsite = typeof this; |
475 throw %MakeTypeError(kCalledNonCallable, callsite); | 443 throw %MakeTypeError(kCalledNonCallable, callsite); |
476 } | 444 } |
477 return %Apply(delegate, this, arguments, 0, %_ArgumentsLength()); | 445 return %Apply(delegate, this, arguments, 0, %_ArgumentsLength()); |
478 } | 446 } |
479 | 447 |
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
892 BIT_AND_STRONG, | 860 BIT_AND_STRONG, |
893 BIT_XOR, | 861 BIT_XOR, |
894 BIT_XOR_STRONG, | 862 BIT_XOR_STRONG, |
895 SHL, | 863 SHL, |
896 SHL_STRONG, | 864 SHL_STRONG, |
897 SAR, | 865 SAR, |
898 SAR_STRONG, | 866 SAR_STRONG, |
899 SHR, | 867 SHR, |
900 SHR_STRONG, | 868 SHR_STRONG, |
901 IN, | 869 IN, |
902 INSTANCE_OF, | |
903 CALL_NON_FUNCTION, | 870 CALL_NON_FUNCTION, |
904 CALL_NON_FUNCTION_AS_CONSTRUCTOR, | 871 CALL_NON_FUNCTION_AS_CONSTRUCTOR, |
905 CALL_FUNCTION_PROXY, | 872 CALL_FUNCTION_PROXY, |
906 CALL_FUNCTION_PROXY_AS_CONSTRUCTOR, | 873 CALL_FUNCTION_PROXY_AS_CONSTRUCTOR, |
907 CONCAT_ITERABLE_TO_ARRAY, | 874 CONCAT_ITERABLE_TO_ARRAY, |
908 APPLY_PREPARE, | 875 APPLY_PREPARE, |
909 REFLECT_APPLY_PREPARE, | 876 REFLECT_APPLY_PREPARE, |
910 REFLECT_CONSTRUCT_PREPARE, | 877 REFLECT_CONSTRUCT_PREPARE, |
911 STACK_OVERFLOW, | 878 STACK_OVERFLOW, |
912 TO_NUMBER, | 879 TO_NUMBER, |
913 TO_STRING, | 880 TO_STRING, |
914 TO_NAME, | 881 TO_NAME, |
915 }); | 882 }); |
916 | 883 |
917 utils.ExportToRuntime(function(to) { | 884 utils.ExportToRuntime(function(to) { |
918 to["to_integer_fun"] = ToInteger; | 885 to["to_integer_fun"] = ToInteger; |
919 to["to_length_fun"] = ToLength; | 886 to["to_length_fun"] = ToLength; |
920 to["to_number_fun"] = ToNumber; | 887 to["to_number_fun"] = ToNumber; |
921 to["to_string_fun"] = ToString; | 888 to["to_string_fun"] = ToString; |
922 }); | 889 }); |
923 | 890 |
924 utils.Export(function(to) { | 891 utils.Export(function(to) { |
925 to.ToBoolean = ToBoolean; | 892 to.ToBoolean = ToBoolean; |
926 to.ToNumber = ToNumber; | 893 to.ToNumber = ToNumber; |
927 to.ToString = ToString; | 894 to.ToString = ToString; |
928 }) | 895 }) |
929 | 896 |
930 }) | 897 }) |
OLD | NEW |