OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 namespace v8 { | 62 namespace v8 { |
63 namespace internal { | 63 namespace internal { |
64 | 64 |
65 | 65 |
66 #define RUNTIME_ASSERT(value) \ | 66 #define RUNTIME_ASSERT(value) \ |
67 if (!(value)) return isolate->ThrowIllegalOperation(); | 67 if (!(value)) return isolate->ThrowIllegalOperation(); |
68 | 68 |
69 // Cast the given object to a value of the specified type and store | 69 // Cast the given object to a value of the specified type and store |
70 // it in a variable with the given name. If the object is not of the | 70 // it in a variable with the given name. If the object is not of the |
71 // expected type call IllegalOperation and return. | 71 // expected type call IllegalOperation and return. |
72 #define CONVERT_CHECKED(Type, name, obj) \ | 72 #define CONVERT_ARG_CHECKED(Type, name, index) \ |
73 RUNTIME_ASSERT(obj->Is##Type()); \ | 73 RUNTIME_ASSERT(args[index]->Is##Type()); \ |
74 Type* name = Type::cast(obj); | 74 Type* name = Type::cast(args[index]); |
75 | 75 |
76 #define CONVERT_ARG_CHECKED(Type, name, index) \ | 76 #define CONVERT_ARG_HANDLE_CHECKED(Type, name, index) \ |
77 RUNTIME_ASSERT(args[index]->Is##Type()); \ | 77 RUNTIME_ASSERT(args[index]->Is##Type()); \ |
78 Handle<Type> name = args.at<Type>(index); | 78 Handle<Type> name = args.at<Type>(index); |
79 | 79 |
80 // Cast the given object to a boolean and store it in a variable with | 80 // Cast the given object to a boolean and store it in a variable with |
81 // the given name. If the object is not a boolean call IllegalOperation | 81 // the given name. If the object is not a boolean call IllegalOperation |
82 // and return. | 82 // and return. |
83 #define CONVERT_BOOLEAN_CHECKED(name, obj) \ | 83 #define CONVERT_BOOLEAN_ARG_CHECKED(name, index) \ |
84 RUNTIME_ASSERT(obj->IsBoolean()); \ | 84 RUNTIME_ASSERT(args[index]->IsBoolean()); \ |
85 bool name = (obj)->IsTrue(); | 85 bool name = args[index]->IsTrue(); |
86 | 86 |
87 // Cast the given argument to a Smi and store its value in an int variable | 87 // Cast the given argument to a Smi and store its value in an int variable |
88 // with the given name. If the argument is not a Smi call IllegalOperation | 88 // with the given name. If the argument is not a Smi call IllegalOperation |
89 // and return. | 89 // and return. |
90 #define CONVERT_SMI_ARG_CHECKED(name, index) \ | 90 #define CONVERT_SMI_ARG_CHECKED(name, index) \ |
91 RUNTIME_ASSERT(args[index]->IsSmi()); \ | 91 RUNTIME_ASSERT(args[index]->IsSmi()); \ |
92 int name = args.smi_at(index); | 92 int name = args.smi_at(index); |
93 | 93 |
94 // Cast the given argument to a double and store it in a variable with | 94 // Cast the given argument to a double and store it in a variable with |
95 // the given name. If the argument is not a number (as opposed to | 95 // the given name. If the argument is not a number (as opposed to |
96 // the number not-a-number) call IllegalOperation and return. | 96 // the number not-a-number) call IllegalOperation and return. |
97 #define CONVERT_DOUBLE_ARG_CHECKED(name, index) \ | 97 #define CONVERT_DOUBLE_ARG_CHECKED(name, index) \ |
98 RUNTIME_ASSERT(args[index]->IsNumber()); \ | 98 RUNTIME_ASSERT(args[index]->IsNumber()); \ |
99 double name = args.number_at(index); | 99 double name = args.number_at(index); |
100 | 100 |
101 // Call the specified converter on the object *comand store the result in | 101 // Call the specified converter on the object *comand store the result in |
102 // a variable of the specified type with the given name. If the | 102 // a variable of the specified type with the given name. If the |
103 // object is not a Number call IllegalOperation and return. | 103 // object is not a Number call IllegalOperation and return. |
104 #define CONVERT_NUMBER_CHECKED(type, name, Type, obj) \ | 104 #define CONVERT_NUMBER_CHECKED(type, name, Type, obj) \ |
105 RUNTIME_ASSERT(obj->IsNumber()); \ | 105 RUNTIME_ASSERT(obj->IsNumber()); \ |
106 type name = NumberTo##Type(obj); | 106 type name = NumberTo##Type(obj); |
107 | 107 |
108 | 108 |
| 109 // Cast the given argument to PropertyDetails and store its value in a |
| 110 // variable with the given name. If the argument is not a Smi call |
| 111 // IllegalOperation and return. |
| 112 #define CONVERT_PROPERTY_DETAILS_CHECKED(name, index) \ |
| 113 RUNTIME_ASSERT(args[index]->IsSmi()); \ |
| 114 PropertyDetails name = PropertyDetails(Smi::cast(args[index])); |
| 115 |
| 116 |
109 // Assert that the given argument has a valid value for a StrictModeFlag | 117 // Assert that the given argument has a valid value for a StrictModeFlag |
110 // and store it in a StrictModeFlag variable with the given name. | 118 // and store it in a StrictModeFlag variable with the given name. |
111 #define CONVERT_STRICT_MODE_ARG(name, index) \ | 119 #define CONVERT_STRICT_MODE_ARG_CHECKED(name, index) \ |
112 ASSERT(args[index]->IsSmi()); \ | 120 RUNTIME_ASSERT(args[index]->IsSmi()); \ |
113 ASSERT(args.smi_at(index) == kStrictMode || \ | 121 RUNTIME_ASSERT(args.smi_at(index) == kStrictMode || \ |
114 args.smi_at(index) == kNonStrictMode); \ | 122 args.smi_at(index) == kNonStrictMode); \ |
115 StrictModeFlag name = \ | 123 StrictModeFlag name = \ |
116 static_cast<StrictModeFlag>(args.smi_at(index)); | 124 static_cast<StrictModeFlag>(args.smi_at(index)); |
117 | 125 |
118 | 126 |
119 // Assert that the given argument has a valid value for a LanguageMode | 127 // Assert that the given argument has a valid value for a LanguageMode |
120 // and store it in a LanguageMode variable with the given name. | 128 // and store it in a LanguageMode variable with the given name. |
121 #define CONVERT_LANGUAGE_MODE_ARG(name, index) \ | 129 #define CONVERT_LANGUAGE_MODE_ARG(name, index) \ |
122 ASSERT(args[index]->IsSmi()); \ | 130 ASSERT(args[index]->IsSmi()); \ |
123 ASSERT(args.smi_at(index) == CLASSIC_MODE || \ | 131 ASSERT(args.smi_at(index) == CLASSIC_MODE || \ |
124 args.smi_at(index) == STRICT_MODE || \ | 132 args.smi_at(index) == STRICT_MODE || \ |
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
551 default: | 559 default: |
552 UNREACHABLE(); | 560 UNREACHABLE(); |
553 return Handle<Object>::null(); | 561 return Handle<Object>::null(); |
554 } | 562 } |
555 } | 563 } |
556 | 564 |
557 | 565 |
558 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateObjectLiteral) { | 566 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateObjectLiteral) { |
559 HandleScope scope(isolate); | 567 HandleScope scope(isolate); |
560 ASSERT(args.length() == 4); | 568 ASSERT(args.length() == 4); |
561 CONVERT_ARG_CHECKED(FixedArray, literals, 0); | 569 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0); |
562 CONVERT_SMI_ARG_CHECKED(literals_index, 1); | 570 CONVERT_SMI_ARG_CHECKED(literals_index, 1); |
563 CONVERT_ARG_CHECKED(FixedArray, constant_properties, 2); | 571 CONVERT_ARG_HANDLE_CHECKED(FixedArray, constant_properties, 2); |
564 CONVERT_SMI_ARG_CHECKED(flags, 3); | 572 CONVERT_SMI_ARG_CHECKED(flags, 3); |
565 bool should_have_fast_elements = (flags & ObjectLiteral::kFastElements) != 0; | 573 bool should_have_fast_elements = (flags & ObjectLiteral::kFastElements) != 0; |
566 bool has_function_literal = (flags & ObjectLiteral::kHasFunction) != 0; | 574 bool has_function_literal = (flags & ObjectLiteral::kHasFunction) != 0; |
567 | 575 |
568 // Check if boilerplate exists. If not, create it first. | 576 // Check if boilerplate exists. If not, create it first. |
569 Handle<Object> boilerplate(literals->get(literals_index), isolate); | 577 Handle<Object> boilerplate(literals->get(literals_index), isolate); |
570 if (*boilerplate == isolate->heap()->undefined_value()) { | 578 if (*boilerplate == isolate->heap()->undefined_value()) { |
571 boilerplate = CreateObjectLiteralBoilerplate(isolate, | 579 boilerplate = CreateObjectLiteralBoilerplate(isolate, |
572 literals, | 580 literals, |
573 constant_properties, | 581 constant_properties, |
574 should_have_fast_elements, | 582 should_have_fast_elements, |
575 has_function_literal); | 583 has_function_literal); |
576 if (boilerplate.is_null()) return Failure::Exception(); | 584 if (boilerplate.is_null()) return Failure::Exception(); |
577 // Update the functions literal and return the boilerplate. | 585 // Update the functions literal and return the boilerplate. |
578 literals->set(literals_index, *boilerplate); | 586 literals->set(literals_index, *boilerplate); |
579 } | 587 } |
580 return DeepCopyBoilerplate(isolate, JSObject::cast(*boilerplate)); | 588 return DeepCopyBoilerplate(isolate, JSObject::cast(*boilerplate)); |
581 } | 589 } |
582 | 590 |
583 | 591 |
584 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateObjectLiteralShallow) { | 592 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateObjectLiteralShallow) { |
585 HandleScope scope(isolate); | 593 HandleScope scope(isolate); |
586 ASSERT(args.length() == 4); | 594 ASSERT(args.length() == 4); |
587 CONVERT_ARG_CHECKED(FixedArray, literals, 0); | 595 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0); |
588 CONVERT_SMI_ARG_CHECKED(literals_index, 1); | 596 CONVERT_SMI_ARG_CHECKED(literals_index, 1); |
589 CONVERT_ARG_CHECKED(FixedArray, constant_properties, 2); | 597 CONVERT_ARG_HANDLE_CHECKED(FixedArray, constant_properties, 2); |
590 CONVERT_SMI_ARG_CHECKED(flags, 3); | 598 CONVERT_SMI_ARG_CHECKED(flags, 3); |
591 bool should_have_fast_elements = (flags & ObjectLiteral::kFastElements) != 0; | 599 bool should_have_fast_elements = (flags & ObjectLiteral::kFastElements) != 0; |
592 bool has_function_literal = (flags & ObjectLiteral::kHasFunction) != 0; | 600 bool has_function_literal = (flags & ObjectLiteral::kHasFunction) != 0; |
593 | 601 |
594 // Check if boilerplate exists. If not, create it first. | 602 // Check if boilerplate exists. If not, create it first. |
595 Handle<Object> boilerplate(literals->get(literals_index), isolate); | 603 Handle<Object> boilerplate(literals->get(literals_index), isolate); |
596 if (*boilerplate == isolate->heap()->undefined_value()) { | 604 if (*boilerplate == isolate->heap()->undefined_value()) { |
597 boilerplate = CreateObjectLiteralBoilerplate(isolate, | 605 boilerplate = CreateObjectLiteralBoilerplate(isolate, |
598 literals, | 606 literals, |
599 constant_properties, | 607 constant_properties, |
600 should_have_fast_elements, | 608 should_have_fast_elements, |
601 has_function_literal); | 609 has_function_literal); |
602 if (boilerplate.is_null()) return Failure::Exception(); | 610 if (boilerplate.is_null()) return Failure::Exception(); |
603 // Update the functions literal and return the boilerplate. | 611 // Update the functions literal and return the boilerplate. |
604 literals->set(literals_index, *boilerplate); | 612 literals->set(literals_index, *boilerplate); |
605 } | 613 } |
606 return isolate->heap()->CopyJSObject(JSObject::cast(*boilerplate)); | 614 return isolate->heap()->CopyJSObject(JSObject::cast(*boilerplate)); |
607 } | 615 } |
608 | 616 |
609 | 617 |
610 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteral) { | 618 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteral) { |
611 HandleScope scope(isolate); | 619 HandleScope scope(isolate); |
612 ASSERT(args.length() == 3); | 620 ASSERT(args.length() == 3); |
613 CONVERT_ARG_CHECKED(FixedArray, literals, 0); | 621 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0); |
614 CONVERT_SMI_ARG_CHECKED(literals_index, 1); | 622 CONVERT_SMI_ARG_CHECKED(literals_index, 1); |
615 CONVERT_ARG_CHECKED(FixedArray, elements, 2); | 623 CONVERT_ARG_HANDLE_CHECKED(FixedArray, elements, 2); |
616 | 624 |
617 // Check if boilerplate exists. If not, create it first. | 625 // Check if boilerplate exists. If not, create it first. |
618 Handle<Object> boilerplate(literals->get(literals_index), isolate); | 626 Handle<Object> boilerplate(literals->get(literals_index), isolate); |
619 if (*boilerplate == isolate->heap()->undefined_value()) { | 627 if (*boilerplate == isolate->heap()->undefined_value()) { |
620 boilerplate = | 628 boilerplate = |
621 Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements); | 629 Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements); |
622 if (boilerplate.is_null()) return Failure::Exception(); | 630 if (boilerplate.is_null()) return Failure::Exception(); |
623 // Update the functions literal and return the boilerplate. | 631 // Update the functions literal and return the boilerplate. |
624 literals->set(literals_index, *boilerplate); | 632 literals->set(literals_index, *boilerplate); |
625 } | 633 } |
626 return DeepCopyBoilerplate(isolate, JSObject::cast(*boilerplate)); | 634 return DeepCopyBoilerplate(isolate, JSObject::cast(*boilerplate)); |
627 } | 635 } |
628 | 636 |
629 | 637 |
630 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteralShallow) { | 638 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteralShallow) { |
631 HandleScope scope(isolate); | 639 HandleScope scope(isolate); |
632 ASSERT(args.length() == 3); | 640 ASSERT(args.length() == 3); |
633 CONVERT_ARG_CHECKED(FixedArray, literals, 0); | 641 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0); |
634 CONVERT_SMI_ARG_CHECKED(literals_index, 1); | 642 CONVERT_SMI_ARG_CHECKED(literals_index, 1); |
635 CONVERT_ARG_CHECKED(FixedArray, elements, 2); | 643 CONVERT_ARG_HANDLE_CHECKED(FixedArray, elements, 2); |
636 | 644 |
637 // Check if boilerplate exists. If not, create it first. | 645 // Check if boilerplate exists. If not, create it first. |
638 Handle<Object> boilerplate(literals->get(literals_index), isolate); | 646 Handle<Object> boilerplate(literals->get(literals_index), isolate); |
639 if (*boilerplate == isolate->heap()->undefined_value()) { | 647 if (*boilerplate == isolate->heap()->undefined_value()) { |
640 ASSERT(*elements != isolate->heap()->empty_fixed_array()); | 648 ASSERT(*elements != isolate->heap()->empty_fixed_array()); |
641 boilerplate = | 649 boilerplate = |
642 Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements); | 650 Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements); |
643 if (boilerplate.is_null()) return Failure::Exception(); | 651 if (boilerplate.is_null()) return Failure::Exception(); |
644 // Update the functions literal and return the boilerplate. | 652 // Update the functions literal and return the boilerplate. |
645 literals->set(literals_index, *boilerplate); | 653 literals->set(literals_index, *boilerplate); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
684 | 692 |
685 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsJSFunctionProxy) { | 693 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsJSFunctionProxy) { |
686 ASSERT(args.length() == 1); | 694 ASSERT(args.length() == 1); |
687 Object* obj = args[0]; | 695 Object* obj = args[0]; |
688 return isolate->heap()->ToBoolean(obj->IsJSFunctionProxy()); | 696 return isolate->heap()->ToBoolean(obj->IsJSFunctionProxy()); |
689 } | 697 } |
690 | 698 |
691 | 699 |
692 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetHandler) { | 700 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetHandler) { |
693 ASSERT(args.length() == 1); | 701 ASSERT(args.length() == 1); |
694 CONVERT_CHECKED(JSProxy, proxy, args[0]); | 702 CONVERT_ARG_CHECKED(JSProxy, proxy, 0); |
695 return proxy->handler(); | 703 return proxy->handler(); |
696 } | 704 } |
697 | 705 |
698 | 706 |
699 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetCallTrap) { | 707 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetCallTrap) { |
700 ASSERT(args.length() == 1); | 708 ASSERT(args.length() == 1); |
701 CONVERT_CHECKED(JSFunctionProxy, proxy, args[0]); | 709 CONVERT_ARG_CHECKED(JSFunctionProxy, proxy, 0); |
702 return proxy->call_trap(); | 710 return proxy->call_trap(); |
703 } | 711 } |
704 | 712 |
705 | 713 |
706 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetConstructTrap) { | 714 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetConstructTrap) { |
707 ASSERT(args.length() == 1); | 715 ASSERT(args.length() == 1); |
708 CONVERT_CHECKED(JSFunctionProxy, proxy, args[0]); | 716 CONVERT_ARG_CHECKED(JSFunctionProxy, proxy, 0); |
709 return proxy->construct_trap(); | 717 return proxy->construct_trap(); |
710 } | 718 } |
711 | 719 |
712 | 720 |
713 RUNTIME_FUNCTION(MaybeObject*, Runtime_Fix) { | 721 RUNTIME_FUNCTION(MaybeObject*, Runtime_Fix) { |
714 ASSERT(args.length() == 1); | 722 ASSERT(args.length() == 1); |
715 CONVERT_CHECKED(JSProxy, proxy, args[0]); | 723 CONVERT_ARG_CHECKED(JSProxy, proxy, 0); |
716 proxy->Fix(); | 724 proxy->Fix(); |
717 return isolate->heap()->undefined_value(); | 725 return isolate->heap()->undefined_value(); |
718 } | 726 } |
719 | 727 |
720 | 728 |
721 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetInitialize) { | 729 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetInitialize) { |
722 HandleScope scope(isolate); | 730 HandleScope scope(isolate); |
723 ASSERT(args.length() == 1); | 731 ASSERT(args.length() == 1); |
724 CONVERT_ARG_CHECKED(JSSet, holder, 0); | 732 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); |
725 Handle<ObjectHashSet> table = isolate->factory()->NewObjectHashSet(0); | 733 Handle<ObjectHashSet> table = isolate->factory()->NewObjectHashSet(0); |
726 holder->set_table(*table); | 734 holder->set_table(*table); |
727 return *holder; | 735 return *holder; |
728 } | 736 } |
729 | 737 |
730 | 738 |
731 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetAdd) { | 739 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetAdd) { |
732 HandleScope scope(isolate); | 740 HandleScope scope(isolate); |
733 ASSERT(args.length() == 2); | 741 ASSERT(args.length() == 2); |
734 CONVERT_ARG_CHECKED(JSSet, holder, 0); | 742 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); |
735 Handle<Object> key(args[1]); | 743 Handle<Object> key(args[1]); |
736 Handle<ObjectHashSet> table(ObjectHashSet::cast(holder->table())); | 744 Handle<ObjectHashSet> table(ObjectHashSet::cast(holder->table())); |
737 table = ObjectHashSetAdd(table, key); | 745 table = ObjectHashSetAdd(table, key); |
738 holder->set_table(*table); | 746 holder->set_table(*table); |
739 return isolate->heap()->undefined_symbol(); | 747 return isolate->heap()->undefined_symbol(); |
740 } | 748 } |
741 | 749 |
742 | 750 |
743 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetHas) { | 751 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetHas) { |
744 HandleScope scope(isolate); | 752 HandleScope scope(isolate); |
745 ASSERT(args.length() == 2); | 753 ASSERT(args.length() == 2); |
746 CONVERT_ARG_CHECKED(JSSet, holder, 0); | 754 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); |
747 Handle<Object> key(args[1]); | 755 Handle<Object> key(args[1]); |
748 Handle<ObjectHashSet> table(ObjectHashSet::cast(holder->table())); | 756 Handle<ObjectHashSet> table(ObjectHashSet::cast(holder->table())); |
749 return isolate->heap()->ToBoolean(table->Contains(*key)); | 757 return isolate->heap()->ToBoolean(table->Contains(*key)); |
750 } | 758 } |
751 | 759 |
752 | 760 |
753 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetDelete) { | 761 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetDelete) { |
754 HandleScope scope(isolate); | 762 HandleScope scope(isolate); |
755 ASSERT(args.length() == 2); | 763 ASSERT(args.length() == 2); |
756 CONVERT_ARG_CHECKED(JSSet, holder, 0); | 764 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); |
757 Handle<Object> key(args[1]); | 765 Handle<Object> key(args[1]); |
758 Handle<ObjectHashSet> table(ObjectHashSet::cast(holder->table())); | 766 Handle<ObjectHashSet> table(ObjectHashSet::cast(holder->table())); |
759 table = ObjectHashSetRemove(table, key); | 767 table = ObjectHashSetRemove(table, key); |
760 holder->set_table(*table); | 768 holder->set_table(*table); |
761 return isolate->heap()->undefined_symbol(); | 769 return isolate->heap()->undefined_symbol(); |
762 } | 770 } |
763 | 771 |
764 | 772 |
765 RUNTIME_FUNCTION(MaybeObject*, Runtime_MapInitialize) { | 773 RUNTIME_FUNCTION(MaybeObject*, Runtime_MapInitialize) { |
766 HandleScope scope(isolate); | 774 HandleScope scope(isolate); |
767 ASSERT(args.length() == 1); | 775 ASSERT(args.length() == 1); |
768 CONVERT_ARG_CHECKED(JSMap, holder, 0); | 776 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); |
769 Handle<ObjectHashTable> table = isolate->factory()->NewObjectHashTable(0); | 777 Handle<ObjectHashTable> table = isolate->factory()->NewObjectHashTable(0); |
770 holder->set_table(*table); | 778 holder->set_table(*table); |
771 return *holder; | 779 return *holder; |
772 } | 780 } |
773 | 781 |
774 | 782 |
775 RUNTIME_FUNCTION(MaybeObject*, Runtime_MapGet) { | 783 RUNTIME_FUNCTION(MaybeObject*, Runtime_MapGet) { |
776 HandleScope scope(isolate); | 784 HandleScope scope(isolate); |
777 ASSERT(args.length() == 2); | 785 ASSERT(args.length() == 2); |
778 CONVERT_ARG_CHECKED(JSMap, holder, 0); | 786 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); |
779 Handle<Object> key(args[1]); | 787 Handle<Object> key(args[1]); |
780 return ObjectHashTable::cast(holder->table())->Lookup(*key); | 788 return ObjectHashTable::cast(holder->table())->Lookup(*key); |
781 } | 789 } |
782 | 790 |
783 | 791 |
784 RUNTIME_FUNCTION(MaybeObject*, Runtime_MapSet) { | 792 RUNTIME_FUNCTION(MaybeObject*, Runtime_MapSet) { |
785 HandleScope scope(isolate); | 793 HandleScope scope(isolate); |
786 ASSERT(args.length() == 3); | 794 ASSERT(args.length() == 3); |
787 CONVERT_ARG_CHECKED(JSMap, holder, 0); | 795 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); |
788 Handle<Object> key(args[1]); | 796 Handle<Object> key(args[1]); |
789 Handle<Object> value(args[2]); | 797 Handle<Object> value(args[2]); |
790 Handle<ObjectHashTable> table(ObjectHashTable::cast(holder->table())); | 798 Handle<ObjectHashTable> table(ObjectHashTable::cast(holder->table())); |
791 Handle<ObjectHashTable> new_table = PutIntoObjectHashTable(table, key, value); | 799 Handle<ObjectHashTable> new_table = PutIntoObjectHashTable(table, key, value); |
792 holder->set_table(*new_table); | 800 holder->set_table(*new_table); |
793 return *value; | 801 return *value; |
794 } | 802 } |
795 | 803 |
796 | 804 |
797 RUNTIME_FUNCTION(MaybeObject*, Runtime_WeakMapInitialize) { | 805 RUNTIME_FUNCTION(MaybeObject*, Runtime_WeakMapInitialize) { |
798 HandleScope scope(isolate); | 806 HandleScope scope(isolate); |
799 ASSERT(args.length() == 1); | 807 ASSERT(args.length() == 1); |
800 CONVERT_ARG_CHECKED(JSWeakMap, weakmap, 0); | 808 CONVERT_ARG_HANDLE_CHECKED(JSWeakMap, weakmap, 0); |
801 ASSERT(weakmap->map()->inobject_properties() == 0); | 809 ASSERT(weakmap->map()->inobject_properties() == 0); |
802 Handle<ObjectHashTable> table = isolate->factory()->NewObjectHashTable(0); | 810 Handle<ObjectHashTable> table = isolate->factory()->NewObjectHashTable(0); |
803 weakmap->set_table(*table); | 811 weakmap->set_table(*table); |
804 weakmap->set_next(Smi::FromInt(0)); | 812 weakmap->set_next(Smi::FromInt(0)); |
805 return *weakmap; | 813 return *weakmap; |
806 } | 814 } |
807 | 815 |
808 | 816 |
809 RUNTIME_FUNCTION(MaybeObject*, Runtime_WeakMapGet) { | 817 RUNTIME_FUNCTION(MaybeObject*, Runtime_WeakMapGet) { |
810 NoHandleAllocation ha; | 818 NoHandleAllocation ha; |
811 ASSERT(args.length() == 2); | 819 ASSERT(args.length() == 2); |
812 CONVERT_ARG_CHECKED(JSWeakMap, weakmap, 0); | 820 CONVERT_ARG_HANDLE_CHECKED(JSWeakMap, weakmap, 0); |
813 CONVERT_ARG_CHECKED(JSReceiver, key, 1); | 821 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, key, 1); |
814 return ObjectHashTable::cast(weakmap->table())->Lookup(*key); | 822 return ObjectHashTable::cast(weakmap->table())->Lookup(*key); |
815 } | 823 } |
816 | 824 |
817 | 825 |
818 RUNTIME_FUNCTION(MaybeObject*, Runtime_WeakMapSet) { | 826 RUNTIME_FUNCTION(MaybeObject*, Runtime_WeakMapSet) { |
819 HandleScope scope(isolate); | 827 HandleScope scope(isolate); |
820 ASSERT(args.length() == 3); | 828 ASSERT(args.length() == 3); |
821 CONVERT_ARG_CHECKED(JSWeakMap, weakmap, 0); | 829 CONVERT_ARG_HANDLE_CHECKED(JSWeakMap, weakmap, 0); |
822 CONVERT_ARG_CHECKED(JSReceiver, key, 1); | 830 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, key, 1); |
823 Handle<Object> value(args[2]); | 831 Handle<Object> value(args[2]); |
824 Handle<ObjectHashTable> table(ObjectHashTable::cast(weakmap->table())); | 832 Handle<ObjectHashTable> table(ObjectHashTable::cast(weakmap->table())); |
825 Handle<ObjectHashTable> new_table = PutIntoObjectHashTable(table, key, value); | 833 Handle<ObjectHashTable> new_table = PutIntoObjectHashTable(table, key, value); |
826 weakmap->set_table(*new_table); | 834 weakmap->set_table(*new_table); |
827 return *value; | 835 return *value; |
828 } | 836 } |
829 | 837 |
830 | 838 |
831 RUNTIME_FUNCTION(MaybeObject*, Runtime_ClassOf) { | 839 RUNTIME_FUNCTION(MaybeObject*, Runtime_ClassOf) { |
832 NoHandleAllocation ha; | 840 NoHandleAllocation ha; |
833 ASSERT(args.length() == 1); | 841 ASSERT(args.length() == 1); |
834 Object* obj = args[0]; | 842 Object* obj = args[0]; |
835 if (!obj->IsJSObject()) return isolate->heap()->null_value(); | 843 if (!obj->IsJSObject()) return isolate->heap()->null_value(); |
836 return JSObject::cast(obj)->class_name(); | 844 return JSObject::cast(obj)->class_name(); |
837 } | 845 } |
838 | 846 |
839 | 847 |
840 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPrototype) { | 848 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPrototype) { |
841 NoHandleAllocation ha; | 849 NoHandleAllocation ha; |
842 ASSERT(args.length() == 1); | 850 ASSERT(args.length() == 1); |
843 CONVERT_CHECKED(JSReceiver, input_obj, args[0]); | 851 CONVERT_ARG_CHECKED(JSReceiver, input_obj, 0); |
844 Object* obj = input_obj; | 852 Object* obj = input_obj; |
845 // We don't expect access checks to be needed on JSProxy objects. | 853 // We don't expect access checks to be needed on JSProxy objects. |
846 ASSERT(!obj->IsAccessCheckNeeded() || obj->IsJSObject()); | 854 ASSERT(!obj->IsAccessCheckNeeded() || obj->IsJSObject()); |
847 do { | 855 do { |
848 if (obj->IsAccessCheckNeeded() && | 856 if (obj->IsAccessCheckNeeded() && |
849 !isolate->MayNamedAccess(JSObject::cast(obj), | 857 !isolate->MayNamedAccess(JSObject::cast(obj), |
850 isolate->heap()->Proto_symbol(), | 858 isolate->heap()->Proto_symbol(), |
851 v8::ACCESS_GET)) { | 859 v8::ACCESS_GET)) { |
852 isolate->ReportFailedAccessCheck(JSObject::cast(obj), v8::ACCESS_GET); | 860 isolate->ReportFailedAccessCheck(JSObject::cast(obj), v8::ACCESS_GET); |
853 return isolate->heap()->undefined_value(); | 861 return isolate->heap()->undefined_value(); |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1002 // [false, value, Writeable, Enumerable, Configurable] | 1010 // [false, value, Writeable, Enumerable, Configurable] |
1003 // if args[1] is an accessor on args[0] | 1011 // if args[1] is an accessor on args[0] |
1004 // [true, GetFunction, SetFunction, Enumerable, Configurable] | 1012 // [true, GetFunction, SetFunction, Enumerable, Configurable] |
1005 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOwnProperty) { | 1013 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOwnProperty) { |
1006 ASSERT(args.length() == 2); | 1014 ASSERT(args.length() == 2); |
1007 Heap* heap = isolate->heap(); | 1015 Heap* heap = isolate->heap(); |
1008 HandleScope scope(isolate); | 1016 HandleScope scope(isolate); |
1009 Handle<FixedArray> elms = isolate->factory()->NewFixedArray(DESCRIPTOR_SIZE); | 1017 Handle<FixedArray> elms = isolate->factory()->NewFixedArray(DESCRIPTOR_SIZE); |
1010 Handle<JSArray> desc = isolate->factory()->NewJSArrayWithElements(elms); | 1018 Handle<JSArray> desc = isolate->factory()->NewJSArrayWithElements(elms); |
1011 LookupResult result(isolate); | 1019 LookupResult result(isolate); |
1012 CONVERT_ARG_CHECKED(JSObject, obj, 0); | 1020 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
1013 CONVERT_ARG_CHECKED(String, name, 1); | 1021 CONVERT_ARG_HANDLE_CHECKED(String, name, 1); |
1014 | 1022 |
1015 // This could be an element. | 1023 // This could be an element. |
1016 uint32_t index; | 1024 uint32_t index; |
1017 if (name->AsArrayIndex(&index)) { | 1025 if (name->AsArrayIndex(&index)) { |
1018 switch (obj->HasLocalElement(index)) { | 1026 switch (obj->HasLocalElement(index)) { |
1019 case JSObject::UNDEFINED_ELEMENT: | 1027 case JSObject::UNDEFINED_ELEMENT: |
1020 return heap->undefined_value(); | 1028 return heap->undefined_value(); |
1021 | 1029 |
1022 case JSObject::STRING_CHARACTER_ELEMENT: { | 1030 case JSObject::STRING_CHARACTER_ELEMENT: { |
1023 // Special handling of string objects according to ECMAScript 5 | 1031 // Special handling of string objects according to ECMAScript 5 |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1140 } | 1148 } |
1141 elms->set(VALUE_INDEX, value); | 1149 elms->set(VALUE_INDEX, value); |
1142 } | 1150 } |
1143 | 1151 |
1144 return *desc; | 1152 return *desc; |
1145 } | 1153 } |
1146 | 1154 |
1147 | 1155 |
1148 RUNTIME_FUNCTION(MaybeObject*, Runtime_PreventExtensions) { | 1156 RUNTIME_FUNCTION(MaybeObject*, Runtime_PreventExtensions) { |
1149 ASSERT(args.length() == 1); | 1157 ASSERT(args.length() == 1); |
1150 CONVERT_CHECKED(JSObject, obj, args[0]); | 1158 CONVERT_ARG_CHECKED(JSObject, obj, 0); |
1151 return obj->PreventExtensions(); | 1159 return obj->PreventExtensions(); |
1152 } | 1160 } |
1153 | 1161 |
1154 | 1162 |
1155 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsExtensible) { | 1163 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsExtensible) { |
1156 ASSERT(args.length() == 1); | 1164 ASSERT(args.length() == 1); |
1157 CONVERT_CHECKED(JSObject, obj, args[0]); | 1165 CONVERT_ARG_CHECKED(JSObject, obj, 0); |
1158 if (obj->IsJSGlobalProxy()) { | 1166 if (obj->IsJSGlobalProxy()) { |
1159 Object* proto = obj->GetPrototype(); | 1167 Object* proto = obj->GetPrototype(); |
1160 if (proto->IsNull()) return isolate->heap()->false_value(); | 1168 if (proto->IsNull()) return isolate->heap()->false_value(); |
1161 ASSERT(proto->IsJSGlobalObject()); | 1169 ASSERT(proto->IsJSGlobalObject()); |
1162 obj = JSObject::cast(proto); | 1170 obj = JSObject::cast(proto); |
1163 } | 1171 } |
1164 return isolate->heap()->ToBoolean(obj->map()->is_extensible()); | 1172 return isolate->heap()->ToBoolean(obj->map()->is_extensible()); |
1165 } | 1173 } |
1166 | 1174 |
1167 | 1175 |
1168 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpCompile) { | 1176 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpCompile) { |
1169 HandleScope scope(isolate); | 1177 HandleScope scope(isolate); |
1170 ASSERT(args.length() == 3); | 1178 ASSERT(args.length() == 3); |
1171 CONVERT_ARG_CHECKED(JSRegExp, re, 0); | 1179 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, re, 0); |
1172 CONVERT_ARG_CHECKED(String, pattern, 1); | 1180 CONVERT_ARG_HANDLE_CHECKED(String, pattern, 1); |
1173 CONVERT_ARG_CHECKED(String, flags, 2); | 1181 CONVERT_ARG_HANDLE_CHECKED(String, flags, 2); |
1174 Handle<Object> result = RegExpImpl::Compile(re, pattern, flags); | 1182 Handle<Object> result = RegExpImpl::Compile(re, pattern, flags); |
1175 if (result.is_null()) return Failure::Exception(); | 1183 if (result.is_null()) return Failure::Exception(); |
1176 return *result; | 1184 return *result; |
1177 } | 1185 } |
1178 | 1186 |
1179 | 1187 |
1180 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateApiFunction) { | 1188 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateApiFunction) { |
1181 HandleScope scope(isolate); | 1189 HandleScope scope(isolate); |
1182 ASSERT(args.length() == 1); | 1190 ASSERT(args.length() == 1); |
1183 CONVERT_ARG_CHECKED(FunctionTemplateInfo, data, 0); | 1191 CONVERT_ARG_HANDLE_CHECKED(FunctionTemplateInfo, data, 0); |
1184 return *isolate->factory()->CreateApiFunction(data); | 1192 return *isolate->factory()->CreateApiFunction(data); |
1185 } | 1193 } |
1186 | 1194 |
1187 | 1195 |
1188 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsTemplate) { | 1196 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsTemplate) { |
1189 ASSERT(args.length() == 1); | 1197 ASSERT(args.length() == 1); |
1190 Object* arg = args[0]; | 1198 Object* arg = args[0]; |
1191 bool result = arg->IsObjectTemplateInfo() || arg->IsFunctionTemplateInfo(); | 1199 bool result = arg->IsObjectTemplateInfo() || arg->IsFunctionTemplateInfo(); |
1192 return isolate->heap()->ToBoolean(result); | 1200 return isolate->heap()->ToBoolean(result); |
1193 } | 1201 } |
1194 | 1202 |
1195 | 1203 |
1196 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetTemplateField) { | 1204 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetTemplateField) { |
1197 ASSERT(args.length() == 2); | 1205 ASSERT(args.length() == 2); |
1198 CONVERT_CHECKED(HeapObject, templ, args[0]); | 1206 CONVERT_ARG_CHECKED(HeapObject, templ, 0); |
1199 CONVERT_CHECKED(Smi, field, args[1]); | 1207 CONVERT_SMI_ARG_CHECKED(index, 1) |
1200 int index = field->value(); | |
1201 int offset = index * kPointerSize + HeapObject::kHeaderSize; | 1208 int offset = index * kPointerSize + HeapObject::kHeaderSize; |
1202 InstanceType type = templ->map()->instance_type(); | 1209 InstanceType type = templ->map()->instance_type(); |
1203 RUNTIME_ASSERT(type == FUNCTION_TEMPLATE_INFO_TYPE || | 1210 RUNTIME_ASSERT(type == FUNCTION_TEMPLATE_INFO_TYPE || |
1204 type == OBJECT_TEMPLATE_INFO_TYPE); | 1211 type == OBJECT_TEMPLATE_INFO_TYPE); |
1205 RUNTIME_ASSERT(offset > 0); | 1212 RUNTIME_ASSERT(offset > 0); |
1206 if (type == FUNCTION_TEMPLATE_INFO_TYPE) { | 1213 if (type == FUNCTION_TEMPLATE_INFO_TYPE) { |
1207 RUNTIME_ASSERT(offset < FunctionTemplateInfo::kSize); | 1214 RUNTIME_ASSERT(offset < FunctionTemplateInfo::kSize); |
1208 } else { | 1215 } else { |
1209 RUNTIME_ASSERT(offset < ObjectTemplateInfo::kSize); | 1216 RUNTIME_ASSERT(offset < ObjectTemplateInfo::kSize); |
1210 } | 1217 } |
1211 return *HeapObject::RawField(templ, offset); | 1218 return *HeapObject::RawField(templ, offset); |
1212 } | 1219 } |
1213 | 1220 |
1214 | 1221 |
1215 RUNTIME_FUNCTION(MaybeObject*, Runtime_DisableAccessChecks) { | 1222 RUNTIME_FUNCTION(MaybeObject*, Runtime_DisableAccessChecks) { |
1216 ASSERT(args.length() == 1); | 1223 ASSERT(args.length() == 1); |
1217 CONVERT_CHECKED(HeapObject, object, args[0]); | 1224 CONVERT_ARG_CHECKED(HeapObject, object, 0); |
1218 Map* old_map = object->map(); | 1225 Map* old_map = object->map(); |
1219 bool needs_access_checks = old_map->is_access_check_needed(); | 1226 bool needs_access_checks = old_map->is_access_check_needed(); |
1220 if (needs_access_checks) { | 1227 if (needs_access_checks) { |
1221 // Copy map so it won't interfere constructor's initial map. | 1228 // Copy map so it won't interfere constructor's initial map. |
1222 Object* new_map; | 1229 Object* new_map; |
1223 { MaybeObject* maybe_new_map = old_map->CopyDropTransitions(); | 1230 { MaybeObject* maybe_new_map = old_map->CopyDropTransitions(); |
1224 if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map; | 1231 if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map; |
1225 } | 1232 } |
1226 | 1233 |
1227 Map::cast(new_map)->set_is_access_check_needed(false); | 1234 Map::cast(new_map)->set_is_access_check_needed(false); |
1228 object->set_map(Map::cast(new_map)); | 1235 object->set_map(Map::cast(new_map)); |
1229 } | 1236 } |
1230 return isolate->heap()->ToBoolean(needs_access_checks); | 1237 return isolate->heap()->ToBoolean(needs_access_checks); |
1231 } | 1238 } |
1232 | 1239 |
1233 | 1240 |
1234 RUNTIME_FUNCTION(MaybeObject*, Runtime_EnableAccessChecks) { | 1241 RUNTIME_FUNCTION(MaybeObject*, Runtime_EnableAccessChecks) { |
1235 ASSERT(args.length() == 1); | 1242 ASSERT(args.length() == 1); |
1236 CONVERT_CHECKED(HeapObject, object, args[0]); | 1243 CONVERT_ARG_CHECKED(HeapObject, object, 0); |
1237 Map* old_map = object->map(); | 1244 Map* old_map = object->map(); |
1238 if (!old_map->is_access_check_needed()) { | 1245 if (!old_map->is_access_check_needed()) { |
1239 // Copy map so it won't interfere constructor's initial map. | 1246 // Copy map so it won't interfere constructor's initial map. |
1240 Object* new_map; | 1247 Object* new_map; |
1241 { MaybeObject* maybe_new_map = old_map->CopyDropTransitions(); | 1248 { MaybeObject* maybe_new_map = old_map->CopyDropTransitions(); |
1242 if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map; | 1249 if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map; |
1243 } | 1250 } |
1244 | 1251 |
1245 Map::cast(new_map)->set_is_access_check_needed(true); | 1252 Map::cast(new_map)->set_is_access_check_needed(true); |
1246 object->set_map(Map::cast(new_map)); | 1253 object->set_map(Map::cast(new_map)); |
(...skipping 15 matching lines...) Expand all Loading... |
1262 } | 1269 } |
1263 | 1270 |
1264 | 1271 |
1265 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareGlobals) { | 1272 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareGlobals) { |
1266 ASSERT(args.length() == 3); | 1273 ASSERT(args.length() == 3); |
1267 HandleScope scope(isolate); | 1274 HandleScope scope(isolate); |
1268 Handle<GlobalObject> global = Handle<GlobalObject>( | 1275 Handle<GlobalObject> global = Handle<GlobalObject>( |
1269 isolate->context()->global()); | 1276 isolate->context()->global()); |
1270 | 1277 |
1271 Handle<Context> context = args.at<Context>(0); | 1278 Handle<Context> context = args.at<Context>(0); |
1272 CONVERT_ARG_CHECKED(FixedArray, pairs, 1); | 1279 CONVERT_ARG_HANDLE_CHECKED(FixedArray, pairs, 1); |
1273 CONVERT_SMI_ARG_CHECKED(flags, 2); | 1280 CONVERT_SMI_ARG_CHECKED(flags, 2); |
1274 | 1281 |
1275 // Traverse the name/value pairs and set the properties. | 1282 // Traverse the name/value pairs and set the properties. |
1276 int length = pairs->length(); | 1283 int length = pairs->length(); |
1277 for (int i = 0; i < length; i += 2) { | 1284 for (int i = 0; i < length; i += 2) { |
1278 HandleScope scope(isolate); | 1285 HandleScope scope(isolate); |
1279 Handle<String> name(String::cast(pairs->get(i))); | 1286 Handle<String> name(String::cast(pairs->get(i))); |
1280 Handle<Object> value(pairs->get(i + 1), isolate); | 1287 Handle<Object> value(pairs->get(i + 1), isolate); |
1281 | 1288 |
1282 // We have to declare a global const property. To capture we only | 1289 // We have to declare a global const property. To capture we only |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1464 NoHandleAllocation nha; | 1471 NoHandleAllocation nha; |
1465 // args[0] == name | 1472 // args[0] == name |
1466 // args[1] == language_mode | 1473 // args[1] == language_mode |
1467 // args[2] == value (optional) | 1474 // args[2] == value (optional) |
1468 | 1475 |
1469 // Determine if we need to assign to the variable if it already | 1476 // Determine if we need to assign to the variable if it already |
1470 // exists (based on the number of arguments). | 1477 // exists (based on the number of arguments). |
1471 RUNTIME_ASSERT(args.length() == 2 || args.length() == 3); | 1478 RUNTIME_ASSERT(args.length() == 2 || args.length() == 3); |
1472 bool assign = args.length() == 3; | 1479 bool assign = args.length() == 3; |
1473 | 1480 |
1474 CONVERT_ARG_CHECKED(String, name, 0); | 1481 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); |
1475 GlobalObject* global = isolate->context()->global(); | 1482 GlobalObject* global = isolate->context()->global(); |
1476 RUNTIME_ASSERT(args[1]->IsSmi()); | 1483 RUNTIME_ASSERT(args[1]->IsSmi()); |
1477 CONVERT_LANGUAGE_MODE_ARG(language_mode, 1); | 1484 CONVERT_LANGUAGE_MODE_ARG(language_mode, 1); |
1478 StrictModeFlag strict_mode_flag = (language_mode == CLASSIC_MODE) | 1485 StrictModeFlag strict_mode_flag = (language_mode == CLASSIC_MODE) |
1479 ? kNonStrictMode : kStrictMode; | 1486 ? kNonStrictMode : kStrictMode; |
1480 | 1487 |
1481 // According to ECMA-262, section 12.2, page 62, the property must | 1488 // According to ECMA-262, section 12.2, page 62, the property must |
1482 // not be deletable. | 1489 // not be deletable. |
1483 PropertyAttributes attributes = DONT_DELETE; | 1490 PropertyAttributes attributes = DONT_DELETE; |
1484 | 1491 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1521 } | 1528 } |
1522 return isolate->heap()->undefined_value(); | 1529 return isolate->heap()->undefined_value(); |
1523 } | 1530 } |
1524 | 1531 |
1525 | 1532 |
1526 RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeConstGlobal) { | 1533 RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeConstGlobal) { |
1527 // All constants are declared with an initial value. The name | 1534 // All constants are declared with an initial value. The name |
1528 // of the constant is the first argument and the initial value | 1535 // of the constant is the first argument and the initial value |
1529 // is the second. | 1536 // is the second. |
1530 RUNTIME_ASSERT(args.length() == 2); | 1537 RUNTIME_ASSERT(args.length() == 2); |
1531 CONVERT_ARG_CHECKED(String, name, 0); | 1538 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); |
1532 Handle<Object> value = args.at<Object>(1); | 1539 Handle<Object> value = args.at<Object>(1); |
1533 | 1540 |
1534 // Get the current global object from top. | 1541 // Get the current global object from top. |
1535 GlobalObject* global = isolate->context()->global(); | 1542 GlobalObject* global = isolate->context()->global(); |
1536 | 1543 |
1537 // According to ECMA-262, section 12.2, page 62, the property must | 1544 // According to ECMA-262, section 12.2, page 62, the property must |
1538 // not be deletable. Since it's a const, it must be READ_ONLY too. | 1545 // not be deletable. Since it's a const, it must be READ_ONLY too. |
1539 PropertyAttributes attributes = | 1546 PropertyAttributes attributes = |
1540 static_cast<PropertyAttributes>(DONT_DELETE | READ_ONLY); | 1547 static_cast<PropertyAttributes>(DONT_DELETE | READ_ONLY); |
1541 | 1548 |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1693 } | 1700 } |
1694 | 1701 |
1695 return *value; | 1702 return *value; |
1696 } | 1703 } |
1697 | 1704 |
1698 | 1705 |
1699 RUNTIME_FUNCTION(MaybeObject*, | 1706 RUNTIME_FUNCTION(MaybeObject*, |
1700 Runtime_OptimizeObjectForAddingMultipleProperties) { | 1707 Runtime_OptimizeObjectForAddingMultipleProperties) { |
1701 HandleScope scope(isolate); | 1708 HandleScope scope(isolate); |
1702 ASSERT(args.length() == 2); | 1709 ASSERT(args.length() == 2); |
1703 CONVERT_ARG_CHECKED(JSObject, object, 0); | 1710 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
1704 CONVERT_SMI_ARG_CHECKED(properties, 1); | 1711 CONVERT_SMI_ARG_CHECKED(properties, 1); |
1705 if (object->HasFastProperties()) { | 1712 if (object->HasFastProperties()) { |
1706 JSObject::NormalizeProperties(object, KEEP_INOBJECT_PROPERTIES, properties); | 1713 JSObject::NormalizeProperties(object, KEEP_INOBJECT_PROPERTIES, properties); |
1707 } | 1714 } |
1708 return *object; | 1715 return *object; |
1709 } | 1716 } |
1710 | 1717 |
1711 | 1718 |
1712 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpExec) { | 1719 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpExec) { |
1713 HandleScope scope(isolate); | 1720 HandleScope scope(isolate); |
1714 ASSERT(args.length() == 4); | 1721 ASSERT(args.length() == 4); |
1715 CONVERT_ARG_CHECKED(JSRegExp, regexp, 0); | 1722 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 0); |
1716 CONVERT_ARG_CHECKED(String, subject, 1); | 1723 CONVERT_ARG_HANDLE_CHECKED(String, subject, 1); |
1717 // Due to the way the JS calls are constructed this must be less than the | 1724 // Due to the way the JS calls are constructed this must be less than the |
1718 // length of a string, i.e. it is always a Smi. We check anyway for security. | 1725 // length of a string, i.e. it is always a Smi. We check anyway for security. |
1719 CONVERT_SMI_ARG_CHECKED(index, 2); | 1726 CONVERT_SMI_ARG_CHECKED(index, 2); |
1720 CONVERT_ARG_CHECKED(JSArray, last_match_info, 3); | 1727 CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 3); |
1721 RUNTIME_ASSERT(last_match_info->HasFastElements()); | 1728 RUNTIME_ASSERT(last_match_info->HasFastElements()); |
1722 RUNTIME_ASSERT(index >= 0); | 1729 RUNTIME_ASSERT(index >= 0); |
1723 RUNTIME_ASSERT(index <= subject->length()); | 1730 RUNTIME_ASSERT(index <= subject->length()); |
1724 isolate->counters()->regexp_entry_runtime()->Increment(); | 1731 isolate->counters()->regexp_entry_runtime()->Increment(); |
1725 Handle<Object> result = RegExpImpl::Exec(regexp, | 1732 Handle<Object> result = RegExpImpl::Exec(regexp, |
1726 subject, | 1733 subject, |
1727 index, | 1734 index, |
1728 last_match_info); | 1735 last_match_info); |
1729 if (result.is_null()) return Failure::Exception(); | 1736 if (result.is_null()) return Failure::Exception(); |
1730 return *result; | 1737 return *result; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1762 // Write in-object properties after the length of the array. | 1769 // Write in-object properties after the length of the array. |
1763 array->InObjectPropertyAtPut(JSRegExpResult::kIndexIndex, args[1]); | 1770 array->InObjectPropertyAtPut(JSRegExpResult::kIndexIndex, args[1]); |
1764 array->InObjectPropertyAtPut(JSRegExpResult::kInputIndex, args[2]); | 1771 array->InObjectPropertyAtPut(JSRegExpResult::kInputIndex, args[2]); |
1765 return array; | 1772 return array; |
1766 } | 1773 } |
1767 | 1774 |
1768 | 1775 |
1769 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpInitializeObject) { | 1776 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpInitializeObject) { |
1770 AssertNoAllocation no_alloc; | 1777 AssertNoAllocation no_alloc; |
1771 ASSERT(args.length() == 5); | 1778 ASSERT(args.length() == 5); |
1772 CONVERT_CHECKED(JSRegExp, regexp, args[0]); | 1779 CONVERT_ARG_CHECKED(JSRegExp, regexp, 0); |
1773 CONVERT_CHECKED(String, source, args[1]); | 1780 CONVERT_ARG_CHECKED(String, source, 1); |
1774 | 1781 |
1775 Object* global = args[2]; | 1782 Object* global = args[2]; |
1776 if (!global->IsTrue()) global = isolate->heap()->false_value(); | 1783 if (!global->IsTrue()) global = isolate->heap()->false_value(); |
1777 | 1784 |
1778 Object* ignoreCase = args[3]; | 1785 Object* ignoreCase = args[3]; |
1779 if (!ignoreCase->IsTrue()) ignoreCase = isolate->heap()->false_value(); | 1786 if (!ignoreCase->IsTrue()) ignoreCase = isolate->heap()->false_value(); |
1780 | 1787 |
1781 Object* multiline = args[4]; | 1788 Object* multiline = args[4]; |
1782 if (!multiline->IsTrue()) multiline = isolate->heap()->false_value(); | 1789 if (!multiline->IsTrue()) multiline = isolate->heap()->false_value(); |
1783 | 1790 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1831 writable); | 1838 writable); |
1832 ASSERT(!result->IsFailure()); | 1839 ASSERT(!result->IsFailure()); |
1833 USE(result); | 1840 USE(result); |
1834 return regexp; | 1841 return regexp; |
1835 } | 1842 } |
1836 | 1843 |
1837 | 1844 |
1838 RUNTIME_FUNCTION(MaybeObject*, Runtime_FinishArrayPrototypeSetup) { | 1845 RUNTIME_FUNCTION(MaybeObject*, Runtime_FinishArrayPrototypeSetup) { |
1839 HandleScope scope(isolate); | 1846 HandleScope scope(isolate); |
1840 ASSERT(args.length() == 1); | 1847 ASSERT(args.length() == 1); |
1841 CONVERT_ARG_CHECKED(JSArray, prototype, 0); | 1848 CONVERT_ARG_HANDLE_CHECKED(JSArray, prototype, 0); |
1842 // This is necessary to enable fast checks for absence of elements | 1849 // This is necessary to enable fast checks for absence of elements |
1843 // on Array.prototype and below. | 1850 // on Array.prototype and below. |
1844 prototype->set_elements(isolate->heap()->empty_fixed_array()); | 1851 prototype->set_elements(isolate->heap()->empty_fixed_array()); |
1845 return Smi::FromInt(0); | 1852 return Smi::FromInt(0); |
1846 } | 1853 } |
1847 | 1854 |
1848 | 1855 |
1849 static Handle<JSFunction> InstallBuiltin(Isolate* isolate, | 1856 static Handle<JSFunction> InstallBuiltin(Isolate* isolate, |
1850 Handle<JSObject> holder, | 1857 Handle<JSObject> holder, |
1851 const char* name, | 1858 const char* name, |
1852 Builtins::Name builtin_name) { | 1859 Builtins::Name builtin_name) { |
1853 Handle<String> key = isolate->factory()->LookupAsciiSymbol(name); | 1860 Handle<String> key = isolate->factory()->LookupAsciiSymbol(name); |
1854 Handle<Code> code(isolate->builtins()->builtin(builtin_name)); | 1861 Handle<Code> code(isolate->builtins()->builtin(builtin_name)); |
1855 Handle<JSFunction> optimized = | 1862 Handle<JSFunction> optimized = |
1856 isolate->factory()->NewFunction(key, | 1863 isolate->factory()->NewFunction(key, |
1857 JS_OBJECT_TYPE, | 1864 JS_OBJECT_TYPE, |
1858 JSObject::kHeaderSize, | 1865 JSObject::kHeaderSize, |
1859 code, | 1866 code, |
1860 false); | 1867 false); |
1861 optimized->shared()->DontAdaptArguments(); | 1868 optimized->shared()->DontAdaptArguments(); |
1862 JSReceiver::SetProperty(holder, key, optimized, NONE, kStrictMode); | 1869 JSReceiver::SetProperty(holder, key, optimized, NONE, kStrictMode); |
1863 return optimized; | 1870 return optimized; |
1864 } | 1871 } |
1865 | 1872 |
1866 | 1873 |
1867 RUNTIME_FUNCTION(MaybeObject*, Runtime_SpecialArrayFunctions) { | 1874 RUNTIME_FUNCTION(MaybeObject*, Runtime_SpecialArrayFunctions) { |
1868 HandleScope scope(isolate); | 1875 HandleScope scope(isolate); |
1869 ASSERT(args.length() == 1); | 1876 ASSERT(args.length() == 1); |
1870 CONVERT_ARG_CHECKED(JSObject, holder, 0); | 1877 CONVERT_ARG_HANDLE_CHECKED(JSObject, holder, 0); |
1871 | 1878 |
1872 InstallBuiltin(isolate, holder, "pop", Builtins::kArrayPop); | 1879 InstallBuiltin(isolate, holder, "pop", Builtins::kArrayPop); |
1873 InstallBuiltin(isolate, holder, "push", Builtins::kArrayPush); | 1880 InstallBuiltin(isolate, holder, "push", Builtins::kArrayPush); |
1874 InstallBuiltin(isolate, holder, "shift", Builtins::kArrayShift); | 1881 InstallBuiltin(isolate, holder, "shift", Builtins::kArrayShift); |
1875 InstallBuiltin(isolate, holder, "unshift", Builtins::kArrayUnshift); | 1882 InstallBuiltin(isolate, holder, "unshift", Builtins::kArrayUnshift); |
1876 InstallBuiltin(isolate, holder, "slice", Builtins::kArraySlice); | 1883 InstallBuiltin(isolate, holder, "slice", Builtins::kArraySlice); |
1877 InstallBuiltin(isolate, holder, "splice", Builtins::kArraySplice); | 1884 InstallBuiltin(isolate, holder, "splice", Builtins::kArraySplice); |
1878 InstallBuiltin(isolate, holder, "concat", Builtins::kArrayConcat); | 1885 InstallBuiltin(isolate, holder, "concat", Builtins::kArrayConcat); |
1879 | 1886 |
1880 return *holder; | 1887 return *holder; |
1881 } | 1888 } |
1882 | 1889 |
1883 | 1890 |
1884 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetDefaultReceiver) { | 1891 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetDefaultReceiver) { |
1885 ASSERT(args.length() == 1); | 1892 ASSERT(args.length() == 1); |
1886 CONVERT_CHECKED(JSReceiver, callable, args[0]); | 1893 CONVERT_ARG_CHECKED(JSReceiver, callable, 0); |
1887 | 1894 |
1888 if (!callable->IsJSFunction()) { | 1895 if (!callable->IsJSFunction()) { |
1889 HandleScope scope(isolate); | 1896 HandleScope scope(isolate); |
1890 bool threw = false; | 1897 bool threw = false; |
1891 Handle<Object> delegate = | 1898 Handle<Object> delegate = |
1892 Execution::TryGetFunctionDelegate(Handle<JSReceiver>(callable), &threw); | 1899 Execution::TryGetFunctionDelegate(Handle<JSReceiver>(callable), &threw); |
1893 if (threw) return Failure::Exception(); | 1900 if (threw) return Failure::Exception(); |
1894 callable = JSFunction::cast(*delegate); | 1901 callable = JSFunction::cast(*delegate); |
1895 } | 1902 } |
1896 JSFunction* function = JSFunction::cast(callable); | 1903 JSFunction* function = JSFunction::cast(callable); |
1897 | 1904 |
1898 SharedFunctionInfo* shared = function->shared(); | 1905 SharedFunctionInfo* shared = function->shared(); |
1899 if (shared->native() || !shared->is_classic_mode()) { | 1906 if (shared->native() || !shared->is_classic_mode()) { |
1900 return isolate->heap()->undefined_value(); | 1907 return isolate->heap()->undefined_value(); |
1901 } | 1908 } |
1902 // Returns undefined for strict or native functions, or | 1909 // Returns undefined for strict or native functions, or |
1903 // the associated global receiver for "normal" functions. | 1910 // the associated global receiver for "normal" functions. |
1904 | 1911 |
1905 Context* global_context = | 1912 Context* global_context = |
1906 function->context()->global()->global_context(); | 1913 function->context()->global()->global_context(); |
1907 return global_context->global()->global_receiver(); | 1914 return global_context->global()->global_receiver(); |
1908 } | 1915 } |
1909 | 1916 |
1910 | 1917 |
1911 RUNTIME_FUNCTION(MaybeObject*, Runtime_MaterializeRegExpLiteral) { | 1918 RUNTIME_FUNCTION(MaybeObject*, Runtime_MaterializeRegExpLiteral) { |
1912 HandleScope scope(isolate); | 1919 HandleScope scope(isolate); |
1913 ASSERT(args.length() == 4); | 1920 ASSERT(args.length() == 4); |
1914 CONVERT_ARG_CHECKED(FixedArray, literals, 0); | 1921 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0); |
1915 int index = args.smi_at(1); | 1922 int index = args.smi_at(1); |
1916 Handle<String> pattern = args.at<String>(2); | 1923 Handle<String> pattern = args.at<String>(2); |
1917 Handle<String> flags = args.at<String>(3); | 1924 Handle<String> flags = args.at<String>(3); |
1918 | 1925 |
1919 // Get the RegExp function from the context in the literals array. | 1926 // Get the RegExp function from the context in the literals array. |
1920 // This is the RegExp function from the context in which the | 1927 // This is the RegExp function from the context in which the |
1921 // function was created. We do not use the RegExp function from the | 1928 // function was created. We do not use the RegExp function from the |
1922 // current global context because this might be the RegExp function | 1929 // current global context because this might be the RegExp function |
1923 // from another context which we should not have access to. | 1930 // from another context which we should not have access to. |
1924 Handle<JSFunction> constructor = | 1931 Handle<JSFunction> constructor = |
(...skipping 10 matching lines...) Expand all Loading... |
1935 } | 1942 } |
1936 literals->set(index, *regexp); | 1943 literals->set(index, *regexp); |
1937 return *regexp; | 1944 return *regexp; |
1938 } | 1945 } |
1939 | 1946 |
1940 | 1947 |
1941 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetName) { | 1948 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetName) { |
1942 NoHandleAllocation ha; | 1949 NoHandleAllocation ha; |
1943 ASSERT(args.length() == 1); | 1950 ASSERT(args.length() == 1); |
1944 | 1951 |
1945 CONVERT_CHECKED(JSFunction, f, args[0]); | 1952 CONVERT_ARG_CHECKED(JSFunction, f, 0); |
1946 return f->shared()->name(); | 1953 return f->shared()->name(); |
1947 } | 1954 } |
1948 | 1955 |
1949 | 1956 |
1950 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetName) { | 1957 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetName) { |
1951 NoHandleAllocation ha; | 1958 NoHandleAllocation ha; |
1952 ASSERT(args.length() == 2); | 1959 ASSERT(args.length() == 2); |
1953 | 1960 |
1954 CONVERT_CHECKED(JSFunction, f, args[0]); | 1961 CONVERT_ARG_CHECKED(JSFunction, f, 0); |
1955 CONVERT_CHECKED(String, name, args[1]); | 1962 CONVERT_ARG_CHECKED(String, name, 1); |
1956 f->shared()->set_name(name); | 1963 f->shared()->set_name(name); |
1957 return isolate->heap()->undefined_value(); | 1964 return isolate->heap()->undefined_value(); |
1958 } | 1965 } |
1959 | 1966 |
1960 | 1967 |
1961 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionNameShouldPrintAsAnonymous) { | 1968 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionNameShouldPrintAsAnonymous) { |
1962 NoHandleAllocation ha; | 1969 NoHandleAllocation ha; |
1963 ASSERT(args.length() == 1); | 1970 ASSERT(args.length() == 1); |
1964 CONVERT_CHECKED(JSFunction, f, args[0]); | 1971 CONVERT_ARG_CHECKED(JSFunction, f, 0); |
1965 return isolate->heap()->ToBoolean( | 1972 return isolate->heap()->ToBoolean( |
1966 f->shared()->name_should_print_as_anonymous()); | 1973 f->shared()->name_should_print_as_anonymous()); |
1967 } | 1974 } |
1968 | 1975 |
1969 | 1976 |
1970 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionMarkNameShouldPrintAsAnonymous) { | 1977 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionMarkNameShouldPrintAsAnonymous) { |
1971 NoHandleAllocation ha; | 1978 NoHandleAllocation ha; |
1972 ASSERT(args.length() == 1); | 1979 ASSERT(args.length() == 1); |
1973 CONVERT_CHECKED(JSFunction, f, args[0]); | 1980 CONVERT_ARG_CHECKED(JSFunction, f, 0); |
1974 f->shared()->set_name_should_print_as_anonymous(true); | 1981 f->shared()->set_name_should_print_as_anonymous(true); |
1975 return isolate->heap()->undefined_value(); | 1982 return isolate->heap()->undefined_value(); |
1976 } | 1983 } |
1977 | 1984 |
1978 | 1985 |
1979 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionRemovePrototype) { | 1986 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionRemovePrototype) { |
1980 NoHandleAllocation ha; | 1987 NoHandleAllocation ha; |
1981 ASSERT(args.length() == 1); | 1988 ASSERT(args.length() == 1); |
1982 | 1989 |
1983 CONVERT_CHECKED(JSFunction, f, args[0]); | 1990 CONVERT_ARG_CHECKED(JSFunction, f, 0); |
1984 Object* obj = f->RemovePrototype(); | 1991 Object* obj = f->RemovePrototype(); |
1985 if (obj->IsFailure()) return obj; | 1992 if (obj->IsFailure()) return obj; |
1986 | 1993 |
1987 return isolate->heap()->undefined_value(); | 1994 return isolate->heap()->undefined_value(); |
1988 } | 1995 } |
1989 | 1996 |
1990 | 1997 |
1991 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetScript) { | 1998 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetScript) { |
1992 HandleScope scope(isolate); | 1999 HandleScope scope(isolate); |
1993 ASSERT(args.length() == 1); | 2000 ASSERT(args.length() == 1); |
1994 | 2001 |
1995 CONVERT_CHECKED(JSFunction, fun, args[0]); | 2002 CONVERT_ARG_CHECKED(JSFunction, fun, 0); |
1996 Handle<Object> script = Handle<Object>(fun->shared()->script(), isolate); | 2003 Handle<Object> script = Handle<Object>(fun->shared()->script(), isolate); |
1997 if (!script->IsScript()) return isolate->heap()->undefined_value(); | 2004 if (!script->IsScript()) return isolate->heap()->undefined_value(); |
1998 | 2005 |
1999 return *GetScriptWrapper(Handle<Script>::cast(script)); | 2006 return *GetScriptWrapper(Handle<Script>::cast(script)); |
2000 } | 2007 } |
2001 | 2008 |
2002 | 2009 |
2003 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetSourceCode) { | 2010 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetSourceCode) { |
2004 HandleScope scope(isolate); | 2011 HandleScope scope(isolate); |
2005 ASSERT(args.length() == 1); | 2012 ASSERT(args.length() == 1); |
2006 | 2013 |
2007 CONVERT_ARG_CHECKED(JSFunction, f, 0); | 2014 CONVERT_ARG_HANDLE_CHECKED(JSFunction, f, 0); |
2008 Handle<SharedFunctionInfo> shared(f->shared()); | 2015 Handle<SharedFunctionInfo> shared(f->shared()); |
2009 return *shared->GetSourceCode(); | 2016 return *shared->GetSourceCode(); |
2010 } | 2017 } |
2011 | 2018 |
2012 | 2019 |
2013 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetScriptSourcePosition) { | 2020 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetScriptSourcePosition) { |
2014 NoHandleAllocation ha; | 2021 NoHandleAllocation ha; |
2015 ASSERT(args.length() == 1); | 2022 ASSERT(args.length() == 1); |
2016 | 2023 |
2017 CONVERT_CHECKED(JSFunction, fun, args[0]); | 2024 CONVERT_ARG_CHECKED(JSFunction, fun, 0); |
2018 int pos = fun->shared()->start_position(); | 2025 int pos = fun->shared()->start_position(); |
2019 return Smi::FromInt(pos); | 2026 return Smi::FromInt(pos); |
2020 } | 2027 } |
2021 | 2028 |
2022 | 2029 |
2023 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetPositionForOffset) { | 2030 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetPositionForOffset) { |
2024 ASSERT(args.length() == 2); | 2031 ASSERT(args.length() == 2); |
2025 | 2032 |
2026 CONVERT_CHECKED(Code, code, args[0]); | 2033 CONVERT_ARG_CHECKED(Code, code, 0); |
2027 CONVERT_NUMBER_CHECKED(int, offset, Int32, args[1]); | 2034 CONVERT_NUMBER_CHECKED(int, offset, Int32, args[1]); |
2028 | 2035 |
2029 RUNTIME_ASSERT(0 <= offset && offset < code->Size()); | 2036 RUNTIME_ASSERT(0 <= offset && offset < code->Size()); |
2030 | 2037 |
2031 Address pc = code->address() + offset; | 2038 Address pc = code->address() + offset; |
2032 return Smi::FromInt(code->SourcePosition(pc)); | 2039 return Smi::FromInt(code->SourcePosition(pc)); |
2033 } | 2040 } |
2034 | 2041 |
2035 | 2042 |
2036 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetInstanceClassName) { | 2043 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetInstanceClassName) { |
2037 NoHandleAllocation ha; | 2044 NoHandleAllocation ha; |
2038 ASSERT(args.length() == 2); | 2045 ASSERT(args.length() == 2); |
2039 | 2046 |
2040 CONVERT_CHECKED(JSFunction, fun, args[0]); | 2047 CONVERT_ARG_CHECKED(JSFunction, fun, 0); |
2041 CONVERT_CHECKED(String, name, args[1]); | 2048 CONVERT_ARG_CHECKED(String, name, 1); |
2042 fun->SetInstanceClassName(name); | 2049 fun->SetInstanceClassName(name); |
2043 return isolate->heap()->undefined_value(); | 2050 return isolate->heap()->undefined_value(); |
2044 } | 2051 } |
2045 | 2052 |
2046 | 2053 |
2047 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetLength) { | 2054 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetLength) { |
2048 NoHandleAllocation ha; | 2055 NoHandleAllocation ha; |
2049 ASSERT(args.length() == 2); | 2056 ASSERT(args.length() == 2); |
2050 | 2057 |
2051 CONVERT_CHECKED(JSFunction, fun, args[0]); | 2058 CONVERT_ARG_CHECKED(JSFunction, fun, 0); |
2052 CONVERT_CHECKED(Smi, length, args[1]); | 2059 CONVERT_SMI_ARG_CHECKED(length, 1); |
2053 fun->shared()->set_length(length->value()); | 2060 fun->shared()->set_length(length); |
2054 return length; | 2061 return isolate->heap()->undefined_value(); |
2055 } | 2062 } |
2056 | 2063 |
2057 | 2064 |
2058 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetPrototype) { | 2065 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetPrototype) { |
2059 NoHandleAllocation ha; | 2066 NoHandleAllocation ha; |
2060 ASSERT(args.length() == 2); | 2067 ASSERT(args.length() == 2); |
2061 | 2068 |
2062 CONVERT_CHECKED(JSFunction, fun, args[0]); | 2069 CONVERT_ARG_CHECKED(JSFunction, fun, 0); |
2063 ASSERT(fun->should_have_prototype()); | 2070 ASSERT(fun->should_have_prototype()); |
2064 Object* obj; | 2071 Object* obj; |
2065 { MaybeObject* maybe_obj = | 2072 { MaybeObject* maybe_obj = |
2066 Accessors::FunctionSetPrototype(fun, args[1], NULL); | 2073 Accessors::FunctionSetPrototype(fun, args[1], NULL); |
2067 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 2074 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
2068 } | 2075 } |
2069 return args[0]; // return TOS | 2076 return args[0]; // return TOS |
2070 } | 2077 } |
2071 | 2078 |
2072 | 2079 |
2073 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetReadOnlyPrototype) { | 2080 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetReadOnlyPrototype) { |
2074 NoHandleAllocation ha; | 2081 NoHandleAllocation ha; |
2075 RUNTIME_ASSERT(args.length() == 1); | 2082 RUNTIME_ASSERT(args.length() == 1); |
2076 CONVERT_CHECKED(JSFunction, function, args[0]); | 2083 CONVERT_ARG_CHECKED(JSFunction, function, 0); |
2077 | 2084 |
2078 MaybeObject* maybe_name = | 2085 MaybeObject* maybe_name = |
2079 isolate->heap()->AllocateStringFromAscii(CStrVector("prototype")); | 2086 isolate->heap()->AllocateStringFromAscii(CStrVector("prototype")); |
2080 String* name; | 2087 String* name; |
2081 if (!maybe_name->To(&name)) return maybe_name; | 2088 if (!maybe_name->To(&name)) return maybe_name; |
2082 | 2089 |
2083 if (function->HasFastProperties()) { | 2090 if (function->HasFastProperties()) { |
2084 // Construct a new field descriptor with updated attributes. | 2091 // Construct a new field descriptor with updated attributes. |
2085 DescriptorArray* instance_desc = function->map()->instance_descriptors(); | 2092 DescriptorArray* instance_desc = function->map()->instance_descriptors(); |
2086 int index = instance_desc->Search(name); | 2093 int index = instance_desc->Search(name); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2122 function->property_dictionary()->DetailsAtPut(entry, new_details); | 2129 function->property_dictionary()->DetailsAtPut(entry, new_details); |
2123 } | 2130 } |
2124 return function; | 2131 return function; |
2125 } | 2132 } |
2126 | 2133 |
2127 | 2134 |
2128 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionIsAPIFunction) { | 2135 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionIsAPIFunction) { |
2129 NoHandleAllocation ha; | 2136 NoHandleAllocation ha; |
2130 ASSERT(args.length() == 1); | 2137 ASSERT(args.length() == 1); |
2131 | 2138 |
2132 CONVERT_CHECKED(JSFunction, f, args[0]); | 2139 CONVERT_ARG_CHECKED(JSFunction, f, 0); |
2133 return isolate->heap()->ToBoolean(f->shared()->IsApiFunction()); | 2140 return isolate->heap()->ToBoolean(f->shared()->IsApiFunction()); |
2134 } | 2141 } |
2135 | 2142 |
2136 | 2143 |
2137 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionIsBuiltin) { | 2144 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionIsBuiltin) { |
2138 NoHandleAllocation ha; | 2145 NoHandleAllocation ha; |
2139 ASSERT(args.length() == 1); | 2146 ASSERT(args.length() == 1); |
2140 | 2147 |
2141 CONVERT_CHECKED(JSFunction, f, args[0]); | 2148 CONVERT_ARG_CHECKED(JSFunction, f, 0); |
2142 return isolate->heap()->ToBoolean(f->IsBuiltin()); | 2149 return isolate->heap()->ToBoolean(f->IsBuiltin()); |
2143 } | 2150 } |
2144 | 2151 |
2145 | 2152 |
2146 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetCode) { | 2153 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetCode) { |
2147 HandleScope scope(isolate); | 2154 HandleScope scope(isolate); |
2148 ASSERT(args.length() == 2); | 2155 ASSERT(args.length() == 2); |
2149 | 2156 |
2150 CONVERT_ARG_CHECKED(JSFunction, target, 0); | 2157 CONVERT_ARG_HANDLE_CHECKED(JSFunction, target, 0); |
2151 Handle<Object> code = args.at<Object>(1); | 2158 Handle<Object> code = args.at<Object>(1); |
2152 | 2159 |
2153 Handle<Context> context(target->context()); | 2160 Handle<Context> context(target->context()); |
2154 | 2161 |
2155 if (!code->IsNull()) { | 2162 if (!code->IsNull()) { |
2156 RUNTIME_ASSERT(code->IsJSFunction()); | 2163 RUNTIME_ASSERT(code->IsJSFunction()); |
2157 Handle<JSFunction> fun = Handle<JSFunction>::cast(code); | 2164 Handle<JSFunction> fun = Handle<JSFunction>::cast(code); |
2158 Handle<SharedFunctionInfo> shared(fun->shared()); | 2165 Handle<SharedFunctionInfo> shared(fun->shared()); |
2159 | 2166 |
2160 if (!SharedFunctionInfo::EnsureCompiled(shared, KEEP_EXCEPTION)) { | 2167 if (!SharedFunctionInfo::EnsureCompiled(shared, KEEP_EXCEPTION)) { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2204 } | 2211 } |
2205 | 2212 |
2206 target->set_context(*context); | 2213 target->set_context(*context); |
2207 return *target; | 2214 return *target; |
2208 } | 2215 } |
2209 | 2216 |
2210 | 2217 |
2211 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetExpectedNumberOfProperties) { | 2218 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetExpectedNumberOfProperties) { |
2212 HandleScope scope(isolate); | 2219 HandleScope scope(isolate); |
2213 ASSERT(args.length() == 2); | 2220 ASSERT(args.length() == 2); |
2214 CONVERT_ARG_CHECKED(JSFunction, function, 0); | 2221 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
2215 CONVERT_SMI_ARG_CHECKED(num, 1); | 2222 CONVERT_SMI_ARG_CHECKED(num, 1); |
2216 RUNTIME_ASSERT(num >= 0); | 2223 RUNTIME_ASSERT(num >= 0); |
2217 SetExpectedNofProperties(function, num); | 2224 SetExpectedNofProperties(function, num); |
2218 return isolate->heap()->undefined_value(); | 2225 return isolate->heap()->undefined_value(); |
2219 } | 2226 } |
2220 | 2227 |
2221 | 2228 |
2222 MUST_USE_RESULT static MaybeObject* CharFromCode(Isolate* isolate, | 2229 MUST_USE_RESULT static MaybeObject* CharFromCode(Isolate* isolate, |
2223 Object* char_code) { | 2230 Object* char_code) { |
2224 uint32_t code; | 2231 uint32_t code; |
2225 if (char_code->ToArrayIndex(&code)) { | 2232 if (char_code->ToArrayIndex(&code)) { |
2226 if (code <= 0xffff) { | 2233 if (code <= 0xffff) { |
2227 return isolate->heap()->LookupSingleCharacterStringFromCode(code); | 2234 return isolate->heap()->LookupSingleCharacterStringFromCode(code); |
2228 } | 2235 } |
2229 } | 2236 } |
2230 return isolate->heap()->empty_string(); | 2237 return isolate->heap()->empty_string(); |
2231 } | 2238 } |
2232 | 2239 |
2233 | 2240 |
2234 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringCharCodeAt) { | 2241 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringCharCodeAt) { |
2235 NoHandleAllocation ha; | 2242 NoHandleAllocation ha; |
2236 ASSERT(args.length() == 2); | 2243 ASSERT(args.length() == 2); |
2237 | 2244 |
2238 CONVERT_CHECKED(String, subject, args[0]); | 2245 CONVERT_ARG_CHECKED(String, subject, 0); |
2239 Object* index = args[1]; | 2246 Object* index = args[1]; |
2240 RUNTIME_ASSERT(index->IsNumber()); | 2247 RUNTIME_ASSERT(index->IsNumber()); |
2241 | 2248 |
2242 uint32_t i = 0; | 2249 uint32_t i = 0; |
2243 if (index->IsSmi()) { | 2250 if (index->IsSmi()) { |
2244 int value = Smi::cast(index)->value(); | 2251 int value = Smi::cast(index)->value(); |
2245 if (value < 0) return isolate->heap()->nan_value(); | 2252 if (value < 0) return isolate->heap()->nan_value(); |
2246 i = value; | 2253 i = value; |
2247 } else { | 2254 } else { |
2248 ASSERT(index->IsHeapNumber()); | 2255 ASSERT(index->IsHeapNumber()); |
(...skipping 956 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3205 MemoryChunk::IncrementLiveBytesFromMutator(answer->address(), -delta); | 3212 MemoryChunk::IncrementLiveBytesFromMutator(answer->address(), -delta); |
3206 } | 3213 } |
3207 | 3214 |
3208 return *answer; | 3215 return *answer; |
3209 } | 3216 } |
3210 | 3217 |
3211 | 3218 |
3212 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringReplaceRegExpWithString) { | 3219 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringReplaceRegExpWithString) { |
3213 ASSERT(args.length() == 4); | 3220 ASSERT(args.length() == 4); |
3214 | 3221 |
3215 CONVERT_CHECKED(String, subject, args[0]); | 3222 CONVERT_ARG_CHECKED(String, subject, 0); |
3216 if (!subject->IsFlat()) { | 3223 if (!subject->IsFlat()) { |
3217 Object* flat_subject; | 3224 Object* flat_subject; |
3218 { MaybeObject* maybe_flat_subject = subject->TryFlatten(); | 3225 { MaybeObject* maybe_flat_subject = subject->TryFlatten(); |
3219 if (!maybe_flat_subject->ToObject(&flat_subject)) { | 3226 if (!maybe_flat_subject->ToObject(&flat_subject)) { |
3220 return maybe_flat_subject; | 3227 return maybe_flat_subject; |
3221 } | 3228 } |
3222 } | 3229 } |
3223 subject = String::cast(flat_subject); | 3230 subject = String::cast(flat_subject); |
3224 } | 3231 } |
3225 | 3232 |
3226 CONVERT_CHECKED(String, replacement, args[2]); | 3233 CONVERT_ARG_CHECKED(String, replacement, 2); |
3227 if (!replacement->IsFlat()) { | 3234 if (!replacement->IsFlat()) { |
3228 Object* flat_replacement; | 3235 Object* flat_replacement; |
3229 { MaybeObject* maybe_flat_replacement = replacement->TryFlatten(); | 3236 { MaybeObject* maybe_flat_replacement = replacement->TryFlatten(); |
3230 if (!maybe_flat_replacement->ToObject(&flat_replacement)) { | 3237 if (!maybe_flat_replacement->ToObject(&flat_replacement)) { |
3231 return maybe_flat_replacement; | 3238 return maybe_flat_replacement; |
3232 } | 3239 } |
3233 } | 3240 } |
3234 replacement = String::cast(flat_replacement); | 3241 replacement = String::cast(flat_replacement); |
3235 } | 3242 } |
3236 | 3243 |
3237 CONVERT_CHECKED(JSRegExp, regexp, args[1]); | 3244 CONVERT_ARG_CHECKED(JSRegExp, regexp, 1); |
3238 CONVERT_CHECKED(JSArray, last_match_info, args[3]); | 3245 CONVERT_ARG_CHECKED(JSArray, last_match_info, 3); |
3239 | 3246 |
3240 ASSERT(last_match_info->HasFastElements()); | 3247 ASSERT(last_match_info->HasFastElements()); |
3241 | 3248 |
3242 if (replacement->length() == 0) { | 3249 if (replacement->length() == 0) { |
3243 if (subject->HasOnlyAsciiChars()) { | 3250 if (subject->HasOnlyAsciiChars()) { |
3244 return StringReplaceRegExpWithEmptyString<SeqAsciiString>( | 3251 return StringReplaceRegExpWithEmptyString<SeqAsciiString>( |
3245 isolate, subject, regexp, last_match_info); | 3252 isolate, subject, regexp, last_match_info); |
3246 } else { | 3253 } else { |
3247 return StringReplaceRegExpWithEmptyString<SeqTwoByteString>( | 3254 return StringReplaceRegExpWithEmptyString<SeqTwoByteString>( |
3248 isolate, subject, regexp, last_match_info); | 3255 isolate, subject, regexp, last_match_info); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3298 Handle<String> second = | 3305 Handle<String> second = |
3299 isolate->factory()->NewSubString(subject, index + 1, subject->length()); | 3306 isolate->factory()->NewSubString(subject, index + 1, subject->length()); |
3300 return isolate->factory()->NewConsString(cons1, second); | 3307 return isolate->factory()->NewConsString(cons1, second); |
3301 } | 3308 } |
3302 } | 3309 } |
3303 | 3310 |
3304 | 3311 |
3305 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringReplaceOneCharWithString) { | 3312 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringReplaceOneCharWithString) { |
3306 ASSERT(args.length() == 3); | 3313 ASSERT(args.length() == 3); |
3307 HandleScope scope(isolate); | 3314 HandleScope scope(isolate); |
3308 CONVERT_ARG_CHECKED(String, subject, 0); | 3315 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); |
3309 CONVERT_ARG_CHECKED(String, search, 1); | 3316 CONVERT_ARG_HANDLE_CHECKED(String, search, 1); |
3310 CONVERT_ARG_CHECKED(String, replace, 2); | 3317 CONVERT_ARG_HANDLE_CHECKED(String, replace, 2); |
3311 | 3318 |
3312 // If the cons string tree is too deep, we simply abort the recursion and | 3319 // If the cons string tree is too deep, we simply abort the recursion and |
3313 // retry with a flattened subject string. | 3320 // retry with a flattened subject string. |
3314 const int kRecursionLimit = 0x1000; | 3321 const int kRecursionLimit = 0x1000; |
3315 bool found = false; | 3322 bool found = false; |
3316 Handle<String> result = | 3323 Handle<String> result = |
3317 Runtime::StringReplaceOneCharWithString(isolate, | 3324 Runtime::StringReplaceOneCharWithString(isolate, |
3318 subject, | 3325 subject, |
3319 search, | 3326 search, |
3320 replace, | 3327 replace, |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3379 seq_sub.ToUC16Vector(), | 3386 seq_sub.ToUC16Vector(), |
3380 pat_vector, | 3387 pat_vector, |
3381 start_index); | 3388 start_index); |
3382 } | 3389 } |
3383 | 3390 |
3384 | 3391 |
3385 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringIndexOf) { | 3392 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringIndexOf) { |
3386 HandleScope scope(isolate); // create a new handle scope | 3393 HandleScope scope(isolate); // create a new handle scope |
3387 ASSERT(args.length() == 3); | 3394 ASSERT(args.length() == 3); |
3388 | 3395 |
3389 CONVERT_ARG_CHECKED(String, sub, 0); | 3396 CONVERT_ARG_HANDLE_CHECKED(String, sub, 0); |
3390 CONVERT_ARG_CHECKED(String, pat, 1); | 3397 CONVERT_ARG_HANDLE_CHECKED(String, pat, 1); |
3391 | 3398 |
3392 Object* index = args[2]; | 3399 Object* index = args[2]; |
3393 uint32_t start_index; | 3400 uint32_t start_index; |
3394 if (!index->ToArrayIndex(&start_index)) return Smi::FromInt(-1); | 3401 if (!index->ToArrayIndex(&start_index)) return Smi::FromInt(-1); |
3395 | 3402 |
3396 RUNTIME_ASSERT(start_index <= static_cast<uint32_t>(sub->length())); | 3403 RUNTIME_ASSERT(start_index <= static_cast<uint32_t>(sub->length())); |
3397 int position = | 3404 int position = |
3398 Runtime::StringMatch(isolate, sub, pat, start_index); | 3405 Runtime::StringMatch(isolate, sub, pat, start_index); |
3399 return Smi::FromInt(position); | 3406 return Smi::FromInt(position); |
3400 } | 3407 } |
(...skipping 30 matching lines...) Expand all Loading... |
3431 return i; | 3438 return i; |
3432 } | 3439 } |
3433 } | 3440 } |
3434 return -1; | 3441 return -1; |
3435 } | 3442 } |
3436 | 3443 |
3437 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringLastIndexOf) { | 3444 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringLastIndexOf) { |
3438 HandleScope scope(isolate); // create a new handle scope | 3445 HandleScope scope(isolate); // create a new handle scope |
3439 ASSERT(args.length() == 3); | 3446 ASSERT(args.length() == 3); |
3440 | 3447 |
3441 CONVERT_ARG_CHECKED(String, sub, 0); | 3448 CONVERT_ARG_HANDLE_CHECKED(String, sub, 0); |
3442 CONVERT_ARG_CHECKED(String, pat, 1); | 3449 CONVERT_ARG_HANDLE_CHECKED(String, pat, 1); |
3443 | 3450 |
3444 Object* index = args[2]; | 3451 Object* index = args[2]; |
3445 uint32_t start_index; | 3452 uint32_t start_index; |
3446 if (!index->ToArrayIndex(&start_index)) return Smi::FromInt(-1); | 3453 if (!index->ToArrayIndex(&start_index)) return Smi::FromInt(-1); |
3447 | 3454 |
3448 uint32_t pat_length = pat->length(); | 3455 uint32_t pat_length = pat->length(); |
3449 uint32_t sub_length = sub->length(); | 3456 uint32_t sub_length = sub->length(); |
3450 | 3457 |
3451 if (start_index + pat_length > sub_length) { | 3458 if (start_index + pat_length > sub_length) { |
3452 start_index = sub_length - pat_length; | 3459 start_index = sub_length - pat_length; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3490 } | 3497 } |
3491 | 3498 |
3492 return Smi::FromInt(position); | 3499 return Smi::FromInt(position); |
3493 } | 3500 } |
3494 | 3501 |
3495 | 3502 |
3496 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringLocaleCompare) { | 3503 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringLocaleCompare) { |
3497 NoHandleAllocation ha; | 3504 NoHandleAllocation ha; |
3498 ASSERT(args.length() == 2); | 3505 ASSERT(args.length() == 2); |
3499 | 3506 |
3500 CONVERT_CHECKED(String, str1, args[0]); | 3507 CONVERT_ARG_CHECKED(String, str1, 0); |
3501 CONVERT_CHECKED(String, str2, args[1]); | 3508 CONVERT_ARG_CHECKED(String, str2, 1); |
3502 | 3509 |
3503 if (str1 == str2) return Smi::FromInt(0); // Equal. | 3510 if (str1 == str2) return Smi::FromInt(0); // Equal. |
3504 int str1_length = str1->length(); | 3511 int str1_length = str1->length(); |
3505 int str2_length = str2->length(); | 3512 int str2_length = str2->length(); |
3506 | 3513 |
3507 // Decide trivial cases without flattening. | 3514 // Decide trivial cases without flattening. |
3508 if (str1_length == 0) { | 3515 if (str1_length == 0) { |
3509 if (str2_length == 0) return Smi::FromInt(0); // Equal. | 3516 if (str2_length == 0) return Smi::FromInt(0); // Equal. |
3510 return Smi::FromInt(-str2_length); | 3517 return Smi::FromInt(-str2_length); |
3511 } else { | 3518 } else { |
(...skipping 26 matching lines...) Expand all Loading... |
3538 } | 3545 } |
3539 | 3546 |
3540 return Smi::FromInt(str1_length - str2_length); | 3547 return Smi::FromInt(str1_length - str2_length); |
3541 } | 3548 } |
3542 | 3549 |
3543 | 3550 |
3544 RUNTIME_FUNCTION(MaybeObject*, Runtime_SubString) { | 3551 RUNTIME_FUNCTION(MaybeObject*, Runtime_SubString) { |
3545 NoHandleAllocation ha; | 3552 NoHandleAllocation ha; |
3546 ASSERT(args.length() == 3); | 3553 ASSERT(args.length() == 3); |
3547 | 3554 |
3548 CONVERT_CHECKED(String, value, args[0]); | 3555 CONVERT_ARG_CHECKED(String, value, 0); |
3549 int start, end; | 3556 int start, end; |
3550 // We have a fast integer-only case here to avoid a conversion to double in | 3557 // We have a fast integer-only case here to avoid a conversion to double in |
3551 // the common case where from and to are Smis. | 3558 // the common case where from and to are Smis. |
3552 if (args[1]->IsSmi() && args[2]->IsSmi()) { | 3559 if (args[1]->IsSmi() && args[2]->IsSmi()) { |
3553 CONVERT_SMI_ARG_CHECKED(from_number, 1); | 3560 CONVERT_SMI_ARG_CHECKED(from_number, 1); |
3554 CONVERT_SMI_ARG_CHECKED(to_number, 2); | 3561 CONVERT_SMI_ARG_CHECKED(to_number, 2); |
3555 start = from_number; | 3562 start = from_number; |
3556 end = to_number; | 3563 end = to_number; |
3557 } else { | 3564 } else { |
3558 CONVERT_DOUBLE_ARG_CHECKED(from_number, 1); | 3565 CONVERT_DOUBLE_ARG_CHECKED(from_number, 1); |
3559 CONVERT_DOUBLE_ARG_CHECKED(to_number, 2); | 3566 CONVERT_DOUBLE_ARG_CHECKED(to_number, 2); |
3560 start = FastD2I(from_number); | 3567 start = FastD2I(from_number); |
3561 end = FastD2I(to_number); | 3568 end = FastD2I(to_number); |
3562 } | 3569 } |
3563 RUNTIME_ASSERT(end >= start); | 3570 RUNTIME_ASSERT(end >= start); |
3564 RUNTIME_ASSERT(start >= 0); | 3571 RUNTIME_ASSERT(start >= 0); |
3565 RUNTIME_ASSERT(end <= value->length()); | 3572 RUNTIME_ASSERT(end <= value->length()); |
3566 isolate->counters()->sub_string_runtime()->Increment(); | 3573 isolate->counters()->sub_string_runtime()->Increment(); |
3567 return value->SubString(start, end); | 3574 return value->SubString(start, end); |
3568 } | 3575 } |
3569 | 3576 |
3570 | 3577 |
3571 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringMatch) { | 3578 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringMatch) { |
3572 ASSERT_EQ(3, args.length()); | 3579 ASSERT_EQ(3, args.length()); |
3573 | 3580 |
3574 CONVERT_ARG_CHECKED(String, subject, 0); | 3581 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); |
3575 CONVERT_ARG_CHECKED(JSRegExp, regexp, 1); | 3582 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 1); |
3576 CONVERT_ARG_CHECKED(JSArray, regexp_info, 2); | 3583 CONVERT_ARG_HANDLE_CHECKED(JSArray, regexp_info, 2); |
3577 HandleScope handles; | 3584 HandleScope handles; |
3578 | 3585 |
3579 Handle<Object> match = RegExpImpl::Exec(regexp, subject, 0, regexp_info); | 3586 Handle<Object> match = RegExpImpl::Exec(regexp, subject, 0, regexp_info); |
3580 | 3587 |
3581 if (match.is_null()) { | 3588 if (match.is_null()) { |
3582 return Failure::Exception(); | 3589 return Failure::Exception(); |
3583 } | 3590 } |
3584 if (match->IsNull()) { | 3591 if (match->IsNull()) { |
3585 return isolate->heap()->null_value(); | 3592 return isolate->heap()->null_value(); |
3586 } | 3593 } |
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3957 } | 3964 } |
3958 // No matches at all, return failure or exception result directly. | 3965 // No matches at all, return failure or exception result directly. |
3959 return result; | 3966 return result; |
3960 } | 3967 } |
3961 | 3968 |
3962 | 3969 |
3963 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpExecMultiple) { | 3970 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpExecMultiple) { |
3964 ASSERT(args.length() == 4); | 3971 ASSERT(args.length() == 4); |
3965 HandleScope handles(isolate); | 3972 HandleScope handles(isolate); |
3966 | 3973 |
3967 CONVERT_ARG_CHECKED(String, subject, 1); | 3974 CONVERT_ARG_HANDLE_CHECKED(String, subject, 1); |
3968 if (!subject->IsFlat()) FlattenString(subject); | 3975 if (!subject->IsFlat()) FlattenString(subject); |
3969 CONVERT_ARG_CHECKED(JSRegExp, regexp, 0); | 3976 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 0); |
3970 CONVERT_ARG_CHECKED(JSArray, last_match_info, 2); | 3977 CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 2); |
3971 CONVERT_ARG_CHECKED(JSArray, result_array, 3); | 3978 CONVERT_ARG_HANDLE_CHECKED(JSArray, result_array, 3); |
3972 | 3979 |
3973 ASSERT(last_match_info->HasFastElements()); | 3980 ASSERT(last_match_info->HasFastElements()); |
3974 ASSERT(regexp->GetFlags().is_global()); | 3981 ASSERT(regexp->GetFlags().is_global()); |
3975 Handle<FixedArray> result_elements; | 3982 Handle<FixedArray> result_elements; |
3976 if (result_array->HasFastElements()) { | 3983 if (result_array->HasFastElements()) { |
3977 result_elements = | 3984 result_elements = |
3978 Handle<FixedArray>(FixedArray::cast(result_array->elements())); | 3985 Handle<FixedArray>(FixedArray::cast(result_array->elements())); |
3979 } | 3986 } |
3980 if (result_elements.is_null() || result_elements->length() < 16) { | 3987 if (result_elements.is_null() || result_elements->length() < 16) { |
3981 result_elements = isolate->factory()->NewFixedArrayWithHoles(16); | 3988 result_elements = isolate->factory()->NewFixedArrayWithHoles(16); |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4310 | 4317 |
4311 // Implements part of 8.12.9 DefineOwnProperty. | 4318 // Implements part of 8.12.9 DefineOwnProperty. |
4312 // There are 3 cases that lead here: | 4319 // There are 3 cases that lead here: |
4313 // Step 4b - define a new accessor property. | 4320 // Step 4b - define a new accessor property. |
4314 // Steps 9c & 12 - replace an existing data property with an accessor property. | 4321 // Steps 9c & 12 - replace an existing data property with an accessor property. |
4315 // Step 12 - update an existing accessor property with an accessor or generic | 4322 // Step 12 - update an existing accessor property with an accessor or generic |
4316 // descriptor. | 4323 // descriptor. |
4317 RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineAccessorProperty) { | 4324 RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineAccessorProperty) { |
4318 ASSERT(args.length() == 5); | 4325 ASSERT(args.length() == 5); |
4319 HandleScope scope(isolate); | 4326 HandleScope scope(isolate); |
4320 CONVERT_ARG_CHECKED(JSObject, obj, 0); | 4327 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
4321 CONVERT_CHECKED(String, name, args[1]); | 4328 CONVERT_ARG_CHECKED(String, name, 1); |
4322 CONVERT_CHECKED(Smi, flag_setter, args[2]); | 4329 CONVERT_SMI_ARG_CHECKED(flag_setter, 2); |
4323 Object* fun = args[3]; | 4330 Object* fun = args[3]; |
4324 CONVERT_CHECKED(Smi, flag_attr, args[4]); | 4331 CONVERT_SMI_ARG_CHECKED(unchecked, 4); |
4325 | 4332 |
4326 int unchecked = flag_attr->value(); | |
4327 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); | 4333 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); |
4328 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked); | 4334 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked); |
4329 | 4335 |
4330 RUNTIME_ASSERT(!obj->IsNull()); | 4336 RUNTIME_ASSERT(!obj->IsNull()); |
4331 RUNTIME_ASSERT(fun->IsSpecFunction() || fun->IsUndefined()); | 4337 RUNTIME_ASSERT(fun->IsSpecFunction() || fun->IsUndefined()); |
4332 return obj->DefineAccessor(name, flag_setter->value() == 0, fun, attr); | 4338 return obj->DefineAccessor(name, flag_setter == 0, fun, attr); |
4333 } | 4339 } |
4334 | 4340 |
4335 // Implements part of 8.12.9 DefineOwnProperty. | 4341 // Implements part of 8.12.9 DefineOwnProperty. |
4336 // There are 3 cases that lead here: | 4342 // There are 3 cases that lead here: |
4337 // Step 4a - define a new data property. | 4343 // Step 4a - define a new data property. |
4338 // Steps 9b & 12 - replace an existing accessor property with a data property. | 4344 // Steps 9b & 12 - replace an existing accessor property with a data property. |
4339 // Step 12 - update an existing data property with a data or generic | 4345 // Step 12 - update an existing data property with a data or generic |
4340 // descriptor. | 4346 // descriptor. |
4341 RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineDataProperty) { | 4347 RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineDataProperty) { |
4342 ASSERT(args.length() == 4); | 4348 ASSERT(args.length() == 4); |
4343 HandleScope scope(isolate); | 4349 HandleScope scope(isolate); |
4344 CONVERT_ARG_CHECKED(JSObject, js_object, 0); | 4350 CONVERT_ARG_HANDLE_CHECKED(JSObject, js_object, 0); |
4345 CONVERT_ARG_CHECKED(String, name, 1); | 4351 CONVERT_ARG_HANDLE_CHECKED(String, name, 1); |
4346 Handle<Object> obj_value = args.at<Object>(2); | 4352 Handle<Object> obj_value = args.at<Object>(2); |
4347 CONVERT_CHECKED(Smi, flag, args[3]); | 4353 CONVERT_SMI_ARG_CHECKED(unchecked, 3); |
4348 | 4354 |
4349 int unchecked = flag->value(); | |
4350 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); | 4355 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); |
4351 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked); | 4356 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked); |
4352 | 4357 |
4353 // Check if this is an element. | 4358 // Check if this is an element. |
4354 uint32_t index; | 4359 uint32_t index; |
4355 bool is_element = name->AsArrayIndex(&index); | 4360 bool is_element = name->AsArrayIndex(&index); |
4356 | 4361 |
4357 // Special case for elements if any of the flags might be involved. | 4362 // Special case for elements if any of the flags might be involved. |
4358 // If elements are in fast case we always implicitly assume that: | 4363 // If elements are in fast case we always implicitly assume that: |
4359 // DONT_DELETE: false, DONT_ENUM: false, READ_ONLY: false. | 4364 // DONT_DELETE: false, DONT_ENUM: false, READ_ONLY: false. |
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4660 Handle<Object> value = args.at<Object>(2); | 4665 Handle<Object> value = args.at<Object>(2); |
4661 CONVERT_SMI_ARG_CHECKED(unchecked_attributes, 3); | 4666 CONVERT_SMI_ARG_CHECKED(unchecked_attributes, 3); |
4662 RUNTIME_ASSERT( | 4667 RUNTIME_ASSERT( |
4663 (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); | 4668 (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); |
4664 // Compute attributes. | 4669 // Compute attributes. |
4665 PropertyAttributes attributes = | 4670 PropertyAttributes attributes = |
4666 static_cast<PropertyAttributes>(unchecked_attributes); | 4671 static_cast<PropertyAttributes>(unchecked_attributes); |
4667 | 4672 |
4668 StrictModeFlag strict_mode = kNonStrictMode; | 4673 StrictModeFlag strict_mode = kNonStrictMode; |
4669 if (args.length() == 5) { | 4674 if (args.length() == 5) { |
4670 CONVERT_STRICT_MODE_ARG(strict_mode_flag, 4); | 4675 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode_flag, 4); |
4671 strict_mode = strict_mode_flag; | 4676 strict_mode = strict_mode_flag; |
4672 } | 4677 } |
4673 | 4678 |
4674 return Runtime::SetObjectProperty(isolate, | 4679 return Runtime::SetObjectProperty(isolate, |
4675 object, | 4680 object, |
4676 key, | 4681 key, |
4677 value, | 4682 value, |
4678 attributes, | 4683 attributes, |
4679 strict_mode); | 4684 strict_mode); |
4680 } | 4685 } |
(...skipping 27 matching lines...) Expand all Loading... |
4708 if (object->IsJSFunction()) { | 4713 if (object->IsJSFunction()) { |
4709 JSFunction* func = JSFunction::cast(*object); | 4714 JSFunction* func = JSFunction::cast(*object); |
4710 func->shared()->set_native(true); | 4715 func->shared()->set_native(true); |
4711 } | 4716 } |
4712 return isolate->heap()->undefined_value(); | 4717 return isolate->heap()->undefined_value(); |
4713 } | 4718 } |
4714 | 4719 |
4715 | 4720 |
4716 RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreArrayLiteralElement) { | 4721 RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreArrayLiteralElement) { |
4717 RUNTIME_ASSERT(args.length() == 5); | 4722 RUNTIME_ASSERT(args.length() == 5); |
4718 CONVERT_ARG_CHECKED(JSObject, object, 0); | 4723 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
4719 CONVERT_SMI_ARG_CHECKED(store_index, 1); | 4724 CONVERT_SMI_ARG_CHECKED(store_index, 1); |
4720 Handle<Object> value = args.at<Object>(2); | 4725 Handle<Object> value = args.at<Object>(2); |
4721 CONVERT_ARG_CHECKED(FixedArray, literals, 3); | 4726 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 3); |
4722 CONVERT_SMI_ARG_CHECKED(literal_index, 4); | 4727 CONVERT_SMI_ARG_CHECKED(literal_index, 4); |
4723 HandleScope scope; | 4728 HandleScope scope; |
4724 | 4729 |
4725 Object* raw_boilerplate_object = literals->get(literal_index); | 4730 Object* raw_boilerplate_object = literals->get(literal_index); |
4726 Handle<JSArray> boilerplate_object(JSArray::cast(raw_boilerplate_object)); | 4731 Handle<JSArray> boilerplate_object(JSArray::cast(raw_boilerplate_object)); |
4727 #if DEBUG | 4732 #if DEBUG |
4728 ElementsKind elements_kind = object->GetElementsKind(); | 4733 ElementsKind elements_kind = object->GetElementsKind(); |
4729 #endif | 4734 #endif |
4730 ASSERT(elements_kind <= FAST_DOUBLE_ELEMENTS); | 4735 ASSERT(elements_kind <= FAST_DOUBLE_ELEMENTS); |
4731 // Smis should never trigger transitions. | 4736 // Smis should never trigger transitions. |
(...skipping 19 matching lines...) Expand all Loading... |
4751 } | 4756 } |
4752 return *object; | 4757 return *object; |
4753 } | 4758 } |
4754 | 4759 |
4755 | 4760 |
4756 // Set a local property, even if it is READ_ONLY. If the property does not | 4761 // Set a local property, even if it is READ_ONLY. If the property does not |
4757 // exist, it will be added with attributes NONE. | 4762 // exist, it will be added with attributes NONE. |
4758 RUNTIME_FUNCTION(MaybeObject*, Runtime_IgnoreAttributesAndSetProperty) { | 4763 RUNTIME_FUNCTION(MaybeObject*, Runtime_IgnoreAttributesAndSetProperty) { |
4759 NoHandleAllocation ha; | 4764 NoHandleAllocation ha; |
4760 RUNTIME_ASSERT(args.length() == 3 || args.length() == 4); | 4765 RUNTIME_ASSERT(args.length() == 3 || args.length() == 4); |
4761 CONVERT_CHECKED(JSObject, object, args[0]); | 4766 CONVERT_ARG_CHECKED(JSObject, object, 0); |
4762 CONVERT_CHECKED(String, name, args[1]); | 4767 CONVERT_ARG_CHECKED(String, name, 1); |
4763 // Compute attributes. | 4768 // Compute attributes. |
4764 PropertyAttributes attributes = NONE; | 4769 PropertyAttributes attributes = NONE; |
4765 if (args.length() == 4) { | 4770 if (args.length() == 4) { |
4766 CONVERT_CHECKED(Smi, value_obj, args[3]); | 4771 CONVERT_SMI_ARG_CHECKED(unchecked_value, 3); |
4767 int unchecked_value = value_obj->value(); | |
4768 // Only attribute bits should be set. | 4772 // Only attribute bits should be set. |
4769 RUNTIME_ASSERT( | 4773 RUNTIME_ASSERT( |
4770 (unchecked_value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); | 4774 (unchecked_value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); |
4771 attributes = static_cast<PropertyAttributes>(unchecked_value); | 4775 attributes = static_cast<PropertyAttributes>(unchecked_value); |
4772 } | 4776 } |
4773 | 4777 |
4774 return object-> | 4778 return object-> |
4775 SetLocalPropertyIgnoreAttributes(name, args[2], attributes); | 4779 SetLocalPropertyIgnoreAttributes(name, args[2], attributes); |
4776 } | 4780 } |
4777 | 4781 |
4778 | 4782 |
4779 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeleteProperty) { | 4783 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeleteProperty) { |
4780 NoHandleAllocation ha; | 4784 NoHandleAllocation ha; |
4781 ASSERT(args.length() == 3); | 4785 ASSERT(args.length() == 3); |
4782 | 4786 |
4783 CONVERT_CHECKED(JSReceiver, object, args[0]); | 4787 CONVERT_ARG_CHECKED(JSReceiver, object, 0); |
4784 CONVERT_CHECKED(String, key, args[1]); | 4788 CONVERT_ARG_CHECKED(String, key, 1); |
4785 CONVERT_STRICT_MODE_ARG(strict_mode, 2); | 4789 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 2); |
4786 return object->DeleteProperty(key, (strict_mode == kStrictMode) | 4790 return object->DeleteProperty(key, (strict_mode == kStrictMode) |
4787 ? JSReceiver::STRICT_DELETION | 4791 ? JSReceiver::STRICT_DELETION |
4788 : JSReceiver::NORMAL_DELETION); | 4792 : JSReceiver::NORMAL_DELETION); |
4789 } | 4793 } |
4790 | 4794 |
4791 | 4795 |
4792 static Object* HasLocalPropertyImplementation(Isolate* isolate, | 4796 static Object* HasLocalPropertyImplementation(Isolate* isolate, |
4793 Handle<JSObject> object, | 4797 Handle<JSObject> object, |
4794 Handle<String> key) { | 4798 Handle<String> key) { |
4795 if (object->HasLocalProperty(*key)) return isolate->heap()->true_value(); | 4799 if (object->HasLocalProperty(*key)) return isolate->heap()->true_value(); |
4796 // Handle hidden prototypes. If there's a hidden prototype above this thing | 4800 // Handle hidden prototypes. If there's a hidden prototype above this thing |
4797 // then we have to check it for properties, because they are supposed to | 4801 // then we have to check it for properties, because they are supposed to |
4798 // look like they are on this object. | 4802 // look like they are on this object. |
4799 Handle<Object> proto(object->GetPrototype()); | 4803 Handle<Object> proto(object->GetPrototype()); |
4800 if (proto->IsJSObject() && | 4804 if (proto->IsJSObject() && |
4801 Handle<JSObject>::cast(proto)->map()->is_hidden_prototype()) { | 4805 Handle<JSObject>::cast(proto)->map()->is_hidden_prototype()) { |
4802 return HasLocalPropertyImplementation(isolate, | 4806 return HasLocalPropertyImplementation(isolate, |
4803 Handle<JSObject>::cast(proto), | 4807 Handle<JSObject>::cast(proto), |
4804 key); | 4808 key); |
4805 } | 4809 } |
4806 return isolate->heap()->false_value(); | 4810 return isolate->heap()->false_value(); |
4807 } | 4811 } |
4808 | 4812 |
4809 | 4813 |
4810 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasLocalProperty) { | 4814 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasLocalProperty) { |
4811 NoHandleAllocation ha; | 4815 NoHandleAllocation ha; |
4812 ASSERT(args.length() == 2); | 4816 ASSERT(args.length() == 2); |
4813 CONVERT_CHECKED(String, key, args[1]); | 4817 CONVERT_ARG_CHECKED(String, key, 1); |
4814 | 4818 |
4815 uint32_t index; | 4819 uint32_t index; |
4816 const bool key_is_array_index = key->AsArrayIndex(&index); | 4820 const bool key_is_array_index = key->AsArrayIndex(&index); |
4817 | 4821 |
4818 Object* obj = args[0]; | 4822 Object* obj = args[0]; |
4819 // Only JS objects can have properties. | 4823 // Only JS objects can have properties. |
4820 if (obj->IsJSObject()) { | 4824 if (obj->IsJSObject()) { |
4821 JSObject* object = JSObject::cast(obj); | 4825 JSObject* object = JSObject::cast(obj); |
4822 // Fast case: either the key is a real named property or it is not | 4826 // Fast case: either the key is a real named property or it is not |
4823 // an array index and there are no interceptors or hidden | 4827 // an array index and there are no interceptors or hidden |
(...skipping 17 matching lines...) Expand all Loading... |
4841 return isolate->heap()->true_value(); | 4845 return isolate->heap()->true_value(); |
4842 } | 4846 } |
4843 } | 4847 } |
4844 return isolate->heap()->false_value(); | 4848 return isolate->heap()->false_value(); |
4845 } | 4849 } |
4846 | 4850 |
4847 | 4851 |
4848 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasProperty) { | 4852 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasProperty) { |
4849 NoHandleAllocation na; | 4853 NoHandleAllocation na; |
4850 ASSERT(args.length() == 2); | 4854 ASSERT(args.length() == 2); |
4851 CONVERT_CHECKED(JSReceiver, receiver, args[0]); | 4855 CONVERT_ARG_CHECKED(JSReceiver, receiver, 0); |
4852 CONVERT_CHECKED(String, key, args[1]); | 4856 CONVERT_ARG_CHECKED(String, key, 1); |
4853 | 4857 |
4854 bool result = receiver->HasProperty(key); | 4858 bool result = receiver->HasProperty(key); |
4855 if (isolate->has_pending_exception()) return Failure::Exception(); | 4859 if (isolate->has_pending_exception()) return Failure::Exception(); |
4856 return isolate->heap()->ToBoolean(result); | 4860 return isolate->heap()->ToBoolean(result); |
4857 } | 4861 } |
4858 | 4862 |
4859 | 4863 |
4860 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasElement) { | 4864 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasElement) { |
4861 NoHandleAllocation na; | 4865 NoHandleAllocation na; |
4862 ASSERT(args.length() == 2); | 4866 ASSERT(args.length() == 2); |
4863 CONVERT_CHECKED(JSReceiver, receiver, args[0]); | 4867 CONVERT_ARG_CHECKED(JSReceiver, receiver, 0); |
4864 CONVERT_CHECKED(Smi, index, args[1]); | 4868 CONVERT_SMI_ARG_CHECKED(index, 1); |
4865 | 4869 |
4866 bool result = receiver->HasElement(index->value()); | 4870 bool result = receiver->HasElement(index); |
4867 if (isolate->has_pending_exception()) return Failure::Exception(); | 4871 if (isolate->has_pending_exception()) return Failure::Exception(); |
4868 return isolate->heap()->ToBoolean(result); | 4872 return isolate->heap()->ToBoolean(result); |
4869 } | 4873 } |
4870 | 4874 |
4871 | 4875 |
4872 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsPropertyEnumerable) { | 4876 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsPropertyEnumerable) { |
4873 NoHandleAllocation ha; | 4877 NoHandleAllocation ha; |
4874 ASSERT(args.length() == 2); | 4878 ASSERT(args.length() == 2); |
4875 | 4879 |
4876 CONVERT_CHECKED(JSObject, object, args[0]); | 4880 CONVERT_ARG_CHECKED(JSObject, object, 0); |
4877 CONVERT_CHECKED(String, key, args[1]); | 4881 CONVERT_ARG_CHECKED(String, key, 1); |
4878 | 4882 |
4879 uint32_t index; | 4883 uint32_t index; |
4880 if (key->AsArrayIndex(&index)) { | 4884 if (key->AsArrayIndex(&index)) { |
4881 JSObject::LocalElementType type = object->HasLocalElement(index); | 4885 JSObject::LocalElementType type = object->HasLocalElement(index); |
4882 switch (type) { | 4886 switch (type) { |
4883 case JSObject::UNDEFINED_ELEMENT: | 4887 case JSObject::UNDEFINED_ELEMENT: |
4884 case JSObject::STRING_CHARACTER_ELEMENT: | 4888 case JSObject::STRING_CHARACTER_ELEMENT: |
4885 return isolate->heap()->false_value(); | 4889 return isolate->heap()->false_value(); |
4886 case JSObject::INTERCEPTED_ELEMENT: | 4890 case JSObject::INTERCEPTED_ELEMENT: |
4887 case JSObject::FAST_ELEMENT: | 4891 case JSObject::FAST_ELEMENT: |
(...skipping 24 matching lines...) Expand all Loading... |
4912 } | 4916 } |
4913 | 4917 |
4914 PropertyAttributes att = object->GetLocalPropertyAttribute(key); | 4918 PropertyAttributes att = object->GetLocalPropertyAttribute(key); |
4915 return isolate->heap()->ToBoolean(att != ABSENT && (att & DONT_ENUM) == 0); | 4919 return isolate->heap()->ToBoolean(att != ABSENT && (att & DONT_ENUM) == 0); |
4916 } | 4920 } |
4917 | 4921 |
4918 | 4922 |
4919 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNames) { | 4923 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNames) { |
4920 HandleScope scope(isolate); | 4924 HandleScope scope(isolate); |
4921 ASSERT(args.length() == 1); | 4925 ASSERT(args.length() == 1); |
4922 CONVERT_ARG_CHECKED(JSReceiver, object, 0); | 4926 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0); |
4923 bool threw = false; | 4927 bool threw = false; |
4924 Handle<JSArray> result = GetKeysFor(object, &threw); | 4928 Handle<JSArray> result = GetKeysFor(object, &threw); |
4925 if (threw) return Failure::Exception(); | 4929 if (threw) return Failure::Exception(); |
4926 return *result; | 4930 return *result; |
4927 } | 4931 } |
4928 | 4932 |
4929 | 4933 |
4930 // Returns either a FixedArray as Runtime_GetPropertyNames, | 4934 // Returns either a FixedArray as Runtime_GetPropertyNames, |
4931 // or, if the given object has an enum cache that contains | 4935 // or, if the given object has an enum cache that contains |
4932 // all enumerable properties of the object and its prototypes | 4936 // all enumerable properties of the object and its prototypes |
4933 // have none, the map of the object. This is used to speed up | 4937 // have none, the map of the object. This is used to speed up |
4934 // the check for deletions during a for-in. | 4938 // the check for deletions during a for-in. |
4935 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNamesFast) { | 4939 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNamesFast) { |
4936 ASSERT(args.length() == 1); | 4940 ASSERT(args.length() == 1); |
4937 | 4941 |
4938 CONVERT_CHECKED(JSReceiver, raw_object, args[0]); | 4942 CONVERT_ARG_CHECKED(JSReceiver, raw_object, 0); |
4939 | 4943 |
4940 if (raw_object->IsSimpleEnum()) return raw_object->map(); | 4944 if (raw_object->IsSimpleEnum()) return raw_object->map(); |
4941 | 4945 |
4942 HandleScope scope(isolate); | 4946 HandleScope scope(isolate); |
4943 Handle<JSReceiver> object(raw_object); | 4947 Handle<JSReceiver> object(raw_object); |
4944 bool threw = false; | 4948 bool threw = false; |
4945 Handle<FixedArray> content = | 4949 Handle<FixedArray> content = |
4946 GetKeysInFixedArrayFor(object, INCLUDE_PROTOS, &threw); | 4950 GetKeysInFixedArrayFor(object, INCLUDE_PROTOS, &threw); |
4947 if (threw) return Failure::Exception(); | 4951 if (threw) return Failure::Exception(); |
4948 | 4952 |
(...skipping 20 matching lines...) Expand all Loading... |
4969 | 4973 |
4970 | 4974 |
4971 // Return the names of the local named properties. | 4975 // Return the names of the local named properties. |
4972 // args[0]: object | 4976 // args[0]: object |
4973 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLocalPropertyNames) { | 4977 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLocalPropertyNames) { |
4974 HandleScope scope(isolate); | 4978 HandleScope scope(isolate); |
4975 ASSERT(args.length() == 1); | 4979 ASSERT(args.length() == 1); |
4976 if (!args[0]->IsJSObject()) { | 4980 if (!args[0]->IsJSObject()) { |
4977 return isolate->heap()->undefined_value(); | 4981 return isolate->heap()->undefined_value(); |
4978 } | 4982 } |
4979 CONVERT_ARG_CHECKED(JSObject, obj, 0); | 4983 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
4980 | 4984 |
4981 // Skip the global proxy as it has no properties and always delegates to the | 4985 // Skip the global proxy as it has no properties and always delegates to the |
4982 // real global object. | 4986 // real global object. |
4983 if (obj->IsJSGlobalProxy()) { | 4987 if (obj->IsJSGlobalProxy()) { |
4984 // Only collect names if access is permitted. | 4988 // Only collect names if access is permitted. |
4985 if (obj->IsAccessCheckNeeded() && | 4989 if (obj->IsAccessCheckNeeded() && |
4986 !isolate->MayNamedAccess(*obj, | 4990 !isolate->MayNamedAccess(*obj, |
4987 isolate->heap()->undefined_value(), | 4991 isolate->heap()->undefined_value(), |
4988 v8::ACCESS_KEYS)) { | 4992 v8::ACCESS_KEYS)) { |
4989 isolate->ReportFailedAccessCheck(*obj, v8::ACCESS_KEYS); | 4993 isolate->ReportFailedAccessCheck(*obj, v8::ACCESS_KEYS); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5056 | 5060 |
5057 | 5061 |
5058 // Return the names of the local indexed properties. | 5062 // Return the names of the local indexed properties. |
5059 // args[0]: object | 5063 // args[0]: object |
5060 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLocalElementNames) { | 5064 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLocalElementNames) { |
5061 HandleScope scope(isolate); | 5065 HandleScope scope(isolate); |
5062 ASSERT(args.length() == 1); | 5066 ASSERT(args.length() == 1); |
5063 if (!args[0]->IsJSObject()) { | 5067 if (!args[0]->IsJSObject()) { |
5064 return isolate->heap()->undefined_value(); | 5068 return isolate->heap()->undefined_value(); |
5065 } | 5069 } |
5066 CONVERT_ARG_CHECKED(JSObject, obj, 0); | 5070 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
5067 | 5071 |
5068 int n = obj->NumberOfLocalElements(static_cast<PropertyAttributes>(NONE)); | 5072 int n = obj->NumberOfLocalElements(static_cast<PropertyAttributes>(NONE)); |
5069 Handle<FixedArray> names = isolate->factory()->NewFixedArray(n); | 5073 Handle<FixedArray> names = isolate->factory()->NewFixedArray(n); |
5070 obj->GetLocalElementKeys(*names, static_cast<PropertyAttributes>(NONE)); | 5074 obj->GetLocalElementKeys(*names, static_cast<PropertyAttributes>(NONE)); |
5071 return *isolate->factory()->NewJSArrayWithElements(names); | 5075 return *isolate->factory()->NewJSArrayWithElements(names); |
5072 } | 5076 } |
5073 | 5077 |
5074 | 5078 |
5075 // Return information on whether an object has a named or indexed interceptor. | 5079 // Return information on whether an object has a named or indexed interceptor. |
5076 // args[0]: object | 5080 // args[0]: object |
5077 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetInterceptorInfo) { | 5081 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetInterceptorInfo) { |
5078 HandleScope scope(isolate); | 5082 HandleScope scope(isolate); |
5079 ASSERT(args.length() == 1); | 5083 ASSERT(args.length() == 1); |
5080 if (!args[0]->IsJSObject()) { | 5084 if (!args[0]->IsJSObject()) { |
5081 return Smi::FromInt(0); | 5085 return Smi::FromInt(0); |
5082 } | 5086 } |
5083 CONVERT_ARG_CHECKED(JSObject, obj, 0); | 5087 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
5084 | 5088 |
5085 int result = 0; | 5089 int result = 0; |
5086 if (obj->HasNamedInterceptor()) result |= 2; | 5090 if (obj->HasNamedInterceptor()) result |= 2; |
5087 if (obj->HasIndexedInterceptor()) result |= 1; | 5091 if (obj->HasIndexedInterceptor()) result |= 1; |
5088 | 5092 |
5089 return Smi::FromInt(result); | 5093 return Smi::FromInt(result); |
5090 } | 5094 } |
5091 | 5095 |
5092 | 5096 |
5093 // Return property names from named interceptor. | 5097 // Return property names from named interceptor. |
5094 // args[0]: object | 5098 // args[0]: object |
5095 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetNamedInterceptorPropertyNames) { | 5099 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetNamedInterceptorPropertyNames) { |
5096 HandleScope scope(isolate); | 5100 HandleScope scope(isolate); |
5097 ASSERT(args.length() == 1); | 5101 ASSERT(args.length() == 1); |
5098 CONVERT_ARG_CHECKED(JSObject, obj, 0); | 5102 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
5099 | 5103 |
5100 if (obj->HasNamedInterceptor()) { | 5104 if (obj->HasNamedInterceptor()) { |
5101 v8::Handle<v8::Array> result = GetKeysForNamedInterceptor(obj, obj); | 5105 v8::Handle<v8::Array> result = GetKeysForNamedInterceptor(obj, obj); |
5102 if (!result.IsEmpty()) return *v8::Utils::OpenHandle(*result); | 5106 if (!result.IsEmpty()) return *v8::Utils::OpenHandle(*result); |
5103 } | 5107 } |
5104 return isolate->heap()->undefined_value(); | 5108 return isolate->heap()->undefined_value(); |
5105 } | 5109 } |
5106 | 5110 |
5107 | 5111 |
5108 // Return element names from indexed interceptor. | 5112 // Return element names from indexed interceptor. |
5109 // args[0]: object | 5113 // args[0]: object |
5110 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetIndexedInterceptorElementNames) { | 5114 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetIndexedInterceptorElementNames) { |
5111 HandleScope scope(isolate); | 5115 HandleScope scope(isolate); |
5112 ASSERT(args.length() == 1); | 5116 ASSERT(args.length() == 1); |
5113 CONVERT_ARG_CHECKED(JSObject, obj, 0); | 5117 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
5114 | 5118 |
5115 if (obj->HasIndexedInterceptor()) { | 5119 if (obj->HasIndexedInterceptor()) { |
5116 v8::Handle<v8::Array> result = GetKeysForIndexedInterceptor(obj, obj); | 5120 v8::Handle<v8::Array> result = GetKeysForIndexedInterceptor(obj, obj); |
5117 if (!result.IsEmpty()) return *v8::Utils::OpenHandle(*result); | 5121 if (!result.IsEmpty()) return *v8::Utils::OpenHandle(*result); |
5118 } | 5122 } |
5119 return isolate->heap()->undefined_value(); | 5123 return isolate->heap()->undefined_value(); |
5120 } | 5124 } |
5121 | 5125 |
5122 | 5126 |
5123 RUNTIME_FUNCTION(MaybeObject*, Runtime_LocalKeys) { | 5127 RUNTIME_FUNCTION(MaybeObject*, Runtime_LocalKeys) { |
5124 ASSERT_EQ(args.length(), 1); | 5128 ASSERT_EQ(args.length(), 1); |
5125 CONVERT_CHECKED(JSObject, raw_object, args[0]); | 5129 CONVERT_ARG_CHECKED(JSObject, raw_object, 0); |
5126 HandleScope scope(isolate); | 5130 HandleScope scope(isolate); |
5127 Handle<JSObject> object(raw_object); | 5131 Handle<JSObject> object(raw_object); |
5128 | 5132 |
5129 if (object->IsJSGlobalProxy()) { | 5133 if (object->IsJSGlobalProxy()) { |
5130 // Do access checks before going to the global object. | 5134 // Do access checks before going to the global object. |
5131 if (object->IsAccessCheckNeeded() && | 5135 if (object->IsAccessCheckNeeded() && |
5132 !isolate->MayNamedAccess(*object, isolate->heap()->undefined_value(), | 5136 !isolate->MayNamedAccess(*object, isolate->heap()->undefined_value(), |
5133 v8::ACCESS_KEYS)) { | 5137 v8::ACCESS_KEYS)) { |
5134 isolate->ReportFailedAccessCheck(*object, v8::ACCESS_KEYS); | 5138 isolate->ReportFailedAccessCheck(*object, v8::ACCESS_KEYS); |
5135 return *isolate->factory()->NewJSArray(0); | 5139 return *isolate->factory()->NewJSArray(0); |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5307 d = 10 * d + (s[i] - '0'); | 5311 d = 10 * d + (s[i] - '0'); |
5308 } | 5312 } |
5309 | 5313 |
5310 return d; | 5314 return d; |
5311 } | 5315 } |
5312 | 5316 |
5313 | 5317 |
5314 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringToNumber) { | 5318 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringToNumber) { |
5315 NoHandleAllocation ha; | 5319 NoHandleAllocation ha; |
5316 ASSERT(args.length() == 1); | 5320 ASSERT(args.length() == 1); |
5317 CONVERT_CHECKED(String, subject, args[0]); | 5321 CONVERT_ARG_CHECKED(String, subject, 0); |
5318 subject->TryFlatten(); | 5322 subject->TryFlatten(); |
5319 | 5323 |
5320 // Fast case: short integer or some sorts of junk values. | 5324 // Fast case: short integer or some sorts of junk values. |
5321 int len = subject->length(); | 5325 int len = subject->length(); |
5322 if (subject->IsSeqAsciiString()) { | 5326 if (subject->IsSeqAsciiString()) { |
5323 if (len == 0) return Smi::FromInt(0); | 5327 if (len == 0) return Smi::FromInt(0); |
5324 | 5328 |
5325 char const* data = SeqAsciiString::cast(subject)->GetChars(); | 5329 char const* data = SeqAsciiString::cast(subject)->GetChars(); |
5326 bool minus = (data[0] == '-'); | 5330 bool minus = (data[0] == '-'); |
5327 int start_pos = (minus ? 1 : 0); | 5331 int start_pos = (minus ? 1 : 0); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5363 // Slower case. | 5367 // Slower case. |
5364 return isolate->heap()->NumberFromDouble( | 5368 return isolate->heap()->NumberFromDouble( |
5365 StringToDouble(isolate->unicode_cache(), subject, ALLOW_HEX)); | 5369 StringToDouble(isolate->unicode_cache(), subject, ALLOW_HEX)); |
5366 } | 5370 } |
5367 | 5371 |
5368 | 5372 |
5369 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringFromCharCodeArray) { | 5373 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringFromCharCodeArray) { |
5370 NoHandleAllocation ha; | 5374 NoHandleAllocation ha; |
5371 ASSERT(args.length() == 1); | 5375 ASSERT(args.length() == 1); |
5372 | 5376 |
5373 CONVERT_CHECKED(JSArray, codes, args[0]); | 5377 CONVERT_ARG_CHECKED(JSArray, codes, 0); |
5374 int length = Smi::cast(codes->length())->value(); | 5378 int length = Smi::cast(codes->length())->value(); |
5375 | 5379 |
5376 // Check if the string can be ASCII. | 5380 // Check if the string can be ASCII. |
5377 int i; | 5381 int i; |
5378 for (i = 0; i < length; i++) { | 5382 for (i = 0; i < length; i++) { |
5379 Object* element; | 5383 Object* element; |
5380 { MaybeObject* maybe_element = codes->GetElement(i); | 5384 { MaybeObject* maybe_element = codes->GetElement(i); |
5381 // We probably can't get an exception here, but just in order to enforce | 5385 // We probably can't get an exception here, but just in order to enforce |
5382 // the checking of inputs in the runtime calls we check here. | 5386 // the checking of inputs in the runtime calls we check here. |
5383 if (!maybe_element->ToObject(&element)) return maybe_element; | 5387 if (!maybe_element->ToObject(&element)) return maybe_element; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5443 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 5447 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
5444 }; | 5448 }; |
5445 return kNotEscaped[character] != 0; | 5449 return kNotEscaped[character] != 0; |
5446 } | 5450 } |
5447 | 5451 |
5448 | 5452 |
5449 RUNTIME_FUNCTION(MaybeObject*, Runtime_URIEscape) { | 5453 RUNTIME_FUNCTION(MaybeObject*, Runtime_URIEscape) { |
5450 const char hex_chars[] = "0123456789ABCDEF"; | 5454 const char hex_chars[] = "0123456789ABCDEF"; |
5451 NoHandleAllocation ha; | 5455 NoHandleAllocation ha; |
5452 ASSERT(args.length() == 1); | 5456 ASSERT(args.length() == 1); |
5453 CONVERT_CHECKED(String, source, args[0]); | 5457 CONVERT_ARG_CHECKED(String, source, 0); |
5454 | 5458 |
5455 source->TryFlatten(); | 5459 source->TryFlatten(); |
5456 | 5460 |
5457 int escaped_length = 0; | 5461 int escaped_length = 0; |
5458 int length = source->length(); | 5462 int length = source->length(); |
5459 { | 5463 { |
5460 Access<StringInputBuffer> buffer( | 5464 Access<StringInputBuffer> buffer( |
5461 isolate->runtime_state()->string_input_buffer()); | 5465 isolate->runtime_state()->string_input_buffer()); |
5462 buffer->Reset(source); | 5466 buffer->Reset(source); |
5463 while (buffer->has_more()) { | 5467 while (buffer->has_more()) { |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5561 } else { | 5565 } else { |
5562 *step = 1; | 5566 *step = 1; |
5563 return character; | 5567 return character; |
5564 } | 5568 } |
5565 } | 5569 } |
5566 | 5570 |
5567 | 5571 |
5568 RUNTIME_FUNCTION(MaybeObject*, Runtime_URIUnescape) { | 5572 RUNTIME_FUNCTION(MaybeObject*, Runtime_URIUnescape) { |
5569 NoHandleAllocation ha; | 5573 NoHandleAllocation ha; |
5570 ASSERT(args.length() == 1); | 5574 ASSERT(args.length() == 1); |
5571 CONVERT_CHECKED(String, source, args[0]); | 5575 CONVERT_ARG_CHECKED(String, source, 0); |
5572 | 5576 |
5573 source->TryFlatten(); | 5577 source->TryFlatten(); |
5574 | 5578 |
5575 bool ascii = true; | 5579 bool ascii = true; |
5576 int length = source->length(); | 5580 int length = source->length(); |
5577 | 5581 |
5578 int unescaped_length = 0; | 5582 int unescaped_length = 0; |
5579 for (int i = 0; i < length; unescaped_length++) { | 5583 for (int i = 0; i < length; unescaped_length++) { |
5580 int step; | 5584 int step; |
5581 if (Unescape(source, i, length, &step) > String::kMaxAsciiCharCode) { | 5585 if (Unescape(source, i, length, &step) > String::kMaxAsciiCharCode) { |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5818 new_string->address() + SeqString::kHeaderSize)); | 5822 new_string->address() + SeqString::kHeaderSize)); |
5819 isolate->heap()->new_space()-> | 5823 isolate->heap()->new_space()-> |
5820 template ShrinkStringAtAllocationBoundary<StringType>( | 5824 template ShrinkStringAtAllocationBoundary<StringType>( |
5821 new_string, final_length); | 5825 new_string, final_length); |
5822 return new_string; | 5826 return new_string; |
5823 } | 5827 } |
5824 | 5828 |
5825 | 5829 |
5826 RUNTIME_FUNCTION(MaybeObject*, Runtime_QuoteJSONString) { | 5830 RUNTIME_FUNCTION(MaybeObject*, Runtime_QuoteJSONString) { |
5827 NoHandleAllocation ha; | 5831 NoHandleAllocation ha; |
5828 CONVERT_CHECKED(String, str, args[0]); | 5832 CONVERT_ARG_CHECKED(String, str, 0); |
5829 if (!str->IsFlat()) { | 5833 if (!str->IsFlat()) { |
5830 MaybeObject* try_flatten = str->TryFlatten(); | 5834 MaybeObject* try_flatten = str->TryFlatten(); |
5831 Object* flat; | 5835 Object* flat; |
5832 if (!try_flatten->ToObject(&flat)) { | 5836 if (!try_flatten->ToObject(&flat)) { |
5833 return try_flatten; | 5837 return try_flatten; |
5834 } | 5838 } |
5835 str = String::cast(flat); | 5839 str = String::cast(flat); |
5836 ASSERT(str->IsFlat()); | 5840 ASSERT(str->IsFlat()); |
5837 } | 5841 } |
5838 String::FlatContent flat = str->GetFlatContent(); | 5842 String::FlatContent flat = str->GetFlatContent(); |
5839 ASSERT(flat.IsFlat()); | 5843 ASSERT(flat.IsFlat()); |
5840 if (flat.IsTwoByte()) { | 5844 if (flat.IsTwoByte()) { |
5841 return QuoteJsonString<uc16, SeqTwoByteString, false>(isolate, | 5845 return QuoteJsonString<uc16, SeqTwoByteString, false>(isolate, |
5842 flat.ToUC16Vector()); | 5846 flat.ToUC16Vector()); |
5843 } else { | 5847 } else { |
5844 return QuoteJsonString<char, SeqAsciiString, false>(isolate, | 5848 return QuoteJsonString<char, SeqAsciiString, false>(isolate, |
5845 flat.ToAsciiVector()); | 5849 flat.ToAsciiVector()); |
5846 } | 5850 } |
5847 } | 5851 } |
5848 | 5852 |
5849 | 5853 |
5850 RUNTIME_FUNCTION(MaybeObject*, Runtime_QuoteJSONStringComma) { | 5854 RUNTIME_FUNCTION(MaybeObject*, Runtime_QuoteJSONStringComma) { |
5851 NoHandleAllocation ha; | 5855 NoHandleAllocation ha; |
5852 CONVERT_CHECKED(String, str, args[0]); | 5856 CONVERT_ARG_CHECKED(String, str, 0); |
5853 if (!str->IsFlat()) { | 5857 if (!str->IsFlat()) { |
5854 MaybeObject* try_flatten = str->TryFlatten(); | 5858 MaybeObject* try_flatten = str->TryFlatten(); |
5855 Object* flat; | 5859 Object* flat; |
5856 if (!try_flatten->ToObject(&flat)) { | 5860 if (!try_flatten->ToObject(&flat)) { |
5857 return try_flatten; | 5861 return try_flatten; |
5858 } | 5862 } |
5859 str = String::cast(flat); | 5863 str = String::cast(flat); |
5860 ASSERT(str->IsFlat()); | 5864 ASSERT(str->IsFlat()); |
5861 } | 5865 } |
5862 String::FlatContent flat = str->GetFlatContent(); | 5866 String::FlatContent flat = str->GetFlatContent(); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5919 isolate->heap()->new_space()-> | 5923 isolate->heap()->new_space()-> |
5920 template ShrinkStringAtAllocationBoundary<StringType>( | 5924 template ShrinkStringAtAllocationBoundary<StringType>( |
5921 new_string, final_length); | 5925 new_string, final_length); |
5922 return new_string; | 5926 return new_string; |
5923 } | 5927 } |
5924 | 5928 |
5925 | 5929 |
5926 RUNTIME_FUNCTION(MaybeObject*, Runtime_QuoteJSONStringArray) { | 5930 RUNTIME_FUNCTION(MaybeObject*, Runtime_QuoteJSONStringArray) { |
5927 NoHandleAllocation ha; | 5931 NoHandleAllocation ha; |
5928 ASSERT(args.length() == 1); | 5932 ASSERT(args.length() == 1); |
5929 CONVERT_CHECKED(JSArray, array, args[0]); | 5933 CONVERT_ARG_CHECKED(JSArray, array, 0); |
5930 | 5934 |
5931 if (!array->HasFastElements()) return isolate->heap()->undefined_value(); | 5935 if (!array->HasFastElements()) return isolate->heap()->undefined_value(); |
5932 FixedArray* elements = FixedArray::cast(array->elements()); | 5936 FixedArray* elements = FixedArray::cast(array->elements()); |
5933 int n = elements->length(); | 5937 int n = elements->length(); |
5934 bool ascii = true; | 5938 bool ascii = true; |
5935 int total_length = 0; | 5939 int total_length = 0; |
5936 | 5940 |
5937 for (int i = 0; i < n; i++) { | 5941 for (int i = 0; i < n; i++) { |
5938 Object* elt = elements->get(i); | 5942 Object* elt = elements->get(i); |
5939 if (!elt->IsString()) return isolate->heap()->undefined_value(); | 5943 if (!elt->IsString()) return isolate->heap()->undefined_value(); |
(...skipping 21 matching lines...) Expand all Loading... |
5961 return QuoteJsonStringArray<uc16, SeqTwoByteString>(isolate, | 5965 return QuoteJsonStringArray<uc16, SeqTwoByteString>(isolate, |
5962 elements, | 5966 elements, |
5963 worst_case_length); | 5967 worst_case_length); |
5964 } | 5968 } |
5965 } | 5969 } |
5966 | 5970 |
5967 | 5971 |
5968 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringParseInt) { | 5972 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringParseInt) { |
5969 NoHandleAllocation ha; | 5973 NoHandleAllocation ha; |
5970 | 5974 |
5971 CONVERT_CHECKED(String, s, args[0]); | 5975 CONVERT_ARG_CHECKED(String, s, 0); |
5972 CONVERT_SMI_ARG_CHECKED(radix, 1); | 5976 CONVERT_SMI_ARG_CHECKED(radix, 1); |
5973 | 5977 |
5974 s->TryFlatten(); | 5978 s->TryFlatten(); |
5975 | 5979 |
5976 RUNTIME_ASSERT(radix == 0 || (2 <= radix && radix <= 36)); | 5980 RUNTIME_ASSERT(radix == 0 || (2 <= radix && radix <= 36)); |
5977 double value = StringToInt(isolate->unicode_cache(), s, radix); | 5981 double value = StringToInt(isolate->unicode_cache(), s, radix); |
5978 return isolate->heap()->NumberFromDouble(value); | 5982 return isolate->heap()->NumberFromDouble(value); |
5979 } | 5983 } |
5980 | 5984 |
5981 | 5985 |
5982 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringParseFloat) { | 5986 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringParseFloat) { |
5983 NoHandleAllocation ha; | 5987 NoHandleAllocation ha; |
5984 CONVERT_CHECKED(String, str, args[0]); | 5988 CONVERT_ARG_CHECKED(String, str, 0); |
5985 | 5989 |
5986 // ECMA-262 section 15.1.2.3, empty string is NaN | 5990 // ECMA-262 section 15.1.2.3, empty string is NaN |
5987 double value = StringToDouble(isolate->unicode_cache(), | 5991 double value = StringToDouble(isolate->unicode_cache(), |
5988 str, ALLOW_TRAILING_JUNK, OS::nan_value()); | 5992 str, ALLOW_TRAILING_JUNK, OS::nan_value()); |
5989 | 5993 |
5990 // Create a number object from the value. | 5994 // Create a number object from the value. |
5991 return isolate->heap()->NumberFromDouble(value); | 5995 return isolate->heap()->NumberFromDouble(value); |
5992 } | 5996 } |
5993 | 5997 |
5994 | 5998 |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6223 | 6227 |
6224 } // namespace | 6228 } // namespace |
6225 | 6229 |
6226 | 6230 |
6227 template <typename ConvertTraits> | 6231 template <typename ConvertTraits> |
6228 MUST_USE_RESULT static MaybeObject* ConvertCase( | 6232 MUST_USE_RESULT static MaybeObject* ConvertCase( |
6229 Arguments args, | 6233 Arguments args, |
6230 Isolate* isolate, | 6234 Isolate* isolate, |
6231 unibrow::Mapping<typename ConvertTraits::UnibrowConverter, 128>* mapping) { | 6235 unibrow::Mapping<typename ConvertTraits::UnibrowConverter, 128>* mapping) { |
6232 NoHandleAllocation ha; | 6236 NoHandleAllocation ha; |
6233 CONVERT_CHECKED(String, s, args[0]); | 6237 CONVERT_ARG_CHECKED(String, s, 0); |
6234 s = s->TryFlattenGetString(); | 6238 s = s->TryFlattenGetString(); |
6235 | 6239 |
6236 const int length = s->length(); | 6240 const int length = s->length(); |
6237 // Assume that the string is not empty; we need this assumption later | 6241 // Assume that the string is not empty; we need this assumption later |
6238 if (length == 0) return s; | 6242 if (length == 0) return s; |
6239 | 6243 |
6240 // Simpler handling of ASCII strings. | 6244 // Simpler handling of ASCII strings. |
6241 // | 6245 // |
6242 // NOTE: This assumes that the upper/lower case of an ASCII | 6246 // NOTE: This assumes that the upper/lower case of an ASCII |
6243 // character is also ASCII. This is currently the case, but it | 6247 // character is also ASCII. This is currently the case, but it |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6285 | 6289 |
6286 static inline bool IsTrimWhiteSpace(unibrow::uchar c) { | 6290 static inline bool IsTrimWhiteSpace(unibrow::uchar c) { |
6287 return unibrow::WhiteSpace::Is(c) || c == 0x200b || c == 0xfeff; | 6291 return unibrow::WhiteSpace::Is(c) || c == 0x200b || c == 0xfeff; |
6288 } | 6292 } |
6289 | 6293 |
6290 | 6294 |
6291 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringTrim) { | 6295 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringTrim) { |
6292 NoHandleAllocation ha; | 6296 NoHandleAllocation ha; |
6293 ASSERT(args.length() == 3); | 6297 ASSERT(args.length() == 3); |
6294 | 6298 |
6295 CONVERT_CHECKED(String, s, args[0]); | 6299 CONVERT_ARG_CHECKED(String, s, 0); |
6296 CONVERT_BOOLEAN_CHECKED(trimLeft, args[1]); | 6300 CONVERT_BOOLEAN_ARG_CHECKED(trimLeft, 1); |
6297 CONVERT_BOOLEAN_CHECKED(trimRight, args[2]); | 6301 CONVERT_BOOLEAN_ARG_CHECKED(trimRight, 2); |
6298 | 6302 |
6299 s->TryFlatten(); | 6303 s->TryFlatten(); |
6300 int length = s->length(); | 6304 int length = s->length(); |
6301 | 6305 |
6302 int left = 0; | 6306 int left = 0; |
6303 if (trimLeft) { | 6307 if (trimLeft) { |
6304 while (left < length && IsTrimWhiteSpace(s->Get(left))) { | 6308 while (left < length && IsTrimWhiteSpace(s->Get(left))) { |
6305 left++; | 6309 left++; |
6306 } | 6310 } |
6307 } | 6311 } |
6308 | 6312 |
6309 int right = length; | 6313 int right = length; |
6310 if (trimRight) { | 6314 if (trimRight) { |
6311 while (right > left && IsTrimWhiteSpace(s->Get(right - 1))) { | 6315 while (right > left && IsTrimWhiteSpace(s->Get(right - 1))) { |
6312 right--; | 6316 right--; |
6313 } | 6317 } |
6314 } | 6318 } |
6315 return s->SubString(left, right); | 6319 return s->SubString(left, right); |
6316 } | 6320 } |
6317 | 6321 |
6318 | 6322 |
6319 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringSplit) { | 6323 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringSplit) { |
6320 ASSERT(args.length() == 3); | 6324 ASSERT(args.length() == 3); |
6321 HandleScope handle_scope(isolate); | 6325 HandleScope handle_scope(isolate); |
6322 CONVERT_ARG_CHECKED(String, subject, 0); | 6326 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); |
6323 CONVERT_ARG_CHECKED(String, pattern, 1); | 6327 CONVERT_ARG_HANDLE_CHECKED(String, pattern, 1); |
6324 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[2]); | 6328 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[2]); |
6325 | 6329 |
6326 int subject_length = subject->length(); | 6330 int subject_length = subject->length(); |
6327 int pattern_length = pattern->length(); | 6331 int pattern_length = pattern->length(); |
6328 RUNTIME_ASSERT(pattern_length > 0); | 6332 RUNTIME_ASSERT(pattern_length > 0); |
6329 | 6333 |
6330 if (limit == 0xffffffffu) { | 6334 if (limit == 0xffffffffu) { |
6331 Handle<Object> cached_answer(StringSplitCache::Lookup( | 6335 Handle<Object> cached_answer(StringSplitCache::Lookup( |
6332 isolate->heap()->string_split_cache(), | 6336 isolate->heap()->string_split_cache(), |
6333 *subject, | 6337 *subject, |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6434 #endif | 6438 #endif |
6435 return i; | 6439 return i; |
6436 } | 6440 } |
6437 | 6441 |
6438 | 6442 |
6439 // Converts a String to JSArray. | 6443 // Converts a String to JSArray. |
6440 // For example, "foo" => ["f", "o", "o"]. | 6444 // For example, "foo" => ["f", "o", "o"]. |
6441 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringToArray) { | 6445 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringToArray) { |
6442 HandleScope scope(isolate); | 6446 HandleScope scope(isolate); |
6443 ASSERT(args.length() == 2); | 6447 ASSERT(args.length() == 2); |
6444 CONVERT_ARG_CHECKED(String, s, 0); | 6448 CONVERT_ARG_HANDLE_CHECKED(String, s, 0); |
6445 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]); | 6449 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]); |
6446 | 6450 |
6447 s = FlattenGetString(s); | 6451 s = FlattenGetString(s); |
6448 const int length = static_cast<int>(Min<uint32_t>(s->length(), limit)); | 6452 const int length = static_cast<int>(Min<uint32_t>(s->length(), limit)); |
6449 | 6453 |
6450 Handle<FixedArray> elements; | 6454 Handle<FixedArray> elements; |
6451 int position = 0; | 6455 int position = 0; |
6452 if (s->IsFlat() && s->IsAsciiRepresentation()) { | 6456 if (s->IsFlat() && s->IsAsciiRepresentation()) { |
6453 // Try using cached chars where possible. | 6457 // Try using cached chars where possible. |
6454 Object* obj; | 6458 Object* obj; |
(...skipping 30 matching lines...) Expand all Loading... |
6485 } | 6489 } |
6486 #endif | 6490 #endif |
6487 | 6491 |
6488 return *isolate->factory()->NewJSArrayWithElements(elements); | 6492 return *isolate->factory()->NewJSArrayWithElements(elements); |
6489 } | 6493 } |
6490 | 6494 |
6491 | 6495 |
6492 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewStringWrapper) { | 6496 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewStringWrapper) { |
6493 NoHandleAllocation ha; | 6497 NoHandleAllocation ha; |
6494 ASSERT(args.length() == 1); | 6498 ASSERT(args.length() == 1); |
6495 CONVERT_CHECKED(String, value, args[0]); | 6499 CONVERT_ARG_CHECKED(String, value, 0); |
6496 return value->ToObject(); | 6500 return value->ToObject(); |
6497 } | 6501 } |
6498 | 6502 |
6499 | 6503 |
6500 bool Runtime::IsUpperCaseChar(RuntimeState* runtime_state, uint16_t ch) { | 6504 bool Runtime::IsUpperCaseChar(RuntimeState* runtime_state, uint16_t ch) { |
6501 unibrow::uchar chars[unibrow::ToUppercase::kMaxWidth]; | 6505 unibrow::uchar chars[unibrow::ToUppercase::kMaxWidth]; |
6502 int char_length = runtime_state->to_upper_mapping()->get(ch, 0, chars); | 6506 int char_length = runtime_state->to_upper_mapping()->get(ch, 0, chars); |
6503 return char_length == 0; | 6507 return char_length == 0; |
6504 } | 6508 } |
6505 | 6509 |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6676 | 6680 |
6677 x = modulo(x, y); | 6681 x = modulo(x, y); |
6678 // NumberFromDouble may return a Smi instead of a Number object | 6682 // NumberFromDouble may return a Smi instead of a Number object |
6679 return isolate->heap()->NumberFromDouble(x); | 6683 return isolate->heap()->NumberFromDouble(x); |
6680 } | 6684 } |
6681 | 6685 |
6682 | 6686 |
6683 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringAdd) { | 6687 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringAdd) { |
6684 NoHandleAllocation ha; | 6688 NoHandleAllocation ha; |
6685 ASSERT(args.length() == 2); | 6689 ASSERT(args.length() == 2); |
6686 CONVERT_CHECKED(String, str1, args[0]); | 6690 CONVERT_ARG_CHECKED(String, str1, 0); |
6687 CONVERT_CHECKED(String, str2, args[1]); | 6691 CONVERT_ARG_CHECKED(String, str2, 1); |
6688 isolate->counters()->string_add_runtime()->Increment(); | 6692 isolate->counters()->string_add_runtime()->Increment(); |
6689 return isolate->heap()->AllocateConsString(str1, str2); | 6693 return isolate->heap()->AllocateConsString(str1, str2); |
6690 } | 6694 } |
6691 | 6695 |
6692 | 6696 |
6693 template <typename sinkchar> | 6697 template <typename sinkchar> |
6694 static inline void StringBuilderConcatHelper(String* special, | 6698 static inline void StringBuilderConcatHelper(String* special, |
6695 sinkchar* sink, | 6699 sinkchar* sink, |
6696 FixedArray* fixed_array, | 6700 FixedArray* fixed_array, |
6697 int array_length) { | 6701 int array_length) { |
(...skipping 27 matching lines...) Expand all Loading... |
6725 String::WriteToFlat(string, sink + position, 0, element_length); | 6729 String::WriteToFlat(string, sink + position, 0, element_length); |
6726 position += element_length; | 6730 position += element_length; |
6727 } | 6731 } |
6728 } | 6732 } |
6729 } | 6733 } |
6730 | 6734 |
6731 | 6735 |
6732 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderConcat) { | 6736 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderConcat) { |
6733 NoHandleAllocation ha; | 6737 NoHandleAllocation ha; |
6734 ASSERT(args.length() == 3); | 6738 ASSERT(args.length() == 3); |
6735 CONVERT_CHECKED(JSArray, array, args[0]); | 6739 CONVERT_ARG_CHECKED(JSArray, array, 0); |
6736 if (!args[1]->IsSmi()) { | 6740 if (!args[1]->IsSmi()) { |
6737 isolate->context()->mark_out_of_memory(); | 6741 isolate->context()->mark_out_of_memory(); |
6738 return Failure::OutOfMemoryException(); | 6742 return Failure::OutOfMemoryException(); |
6739 } | 6743 } |
6740 int array_length = args.smi_at(1); | 6744 int array_length = args.smi_at(1); |
6741 CONVERT_CHECKED(String, special, args[2]); | 6745 CONVERT_ARG_CHECKED(String, special, 2); |
6742 | 6746 |
6743 // This assumption is used by the slice encoding in one or two smis. | 6747 // This assumption is used by the slice encoding in one or two smis. |
6744 ASSERT(Smi::kMaxValue >= String::kMaxLength); | 6748 ASSERT(Smi::kMaxValue >= String::kMaxLength); |
6745 | 6749 |
6746 MaybeObject* maybe_result = array->EnsureCanContainHeapObjectElements(); | 6750 MaybeObject* maybe_result = array->EnsureCanContainHeapObjectElements(); |
6747 if (maybe_result->IsFailure()) return maybe_result; | 6751 if (maybe_result->IsFailure()) return maybe_result; |
6748 | 6752 |
6749 int special_length = special->length(); | 6753 int special_length = special->length(); |
6750 if (!array->HasFastElements()) { | 6754 if (!array->HasFastElements()) { |
6751 return isolate->Throw(isolate->heap()->illegal_argument_symbol()); | 6755 return isolate->Throw(isolate->heap()->illegal_argument_symbol()); |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6841 fixed_array, | 6845 fixed_array, |
6842 array_length); | 6846 array_length); |
6843 return answer; | 6847 return answer; |
6844 } | 6848 } |
6845 } | 6849 } |
6846 | 6850 |
6847 | 6851 |
6848 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderJoin) { | 6852 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderJoin) { |
6849 NoHandleAllocation ha; | 6853 NoHandleAllocation ha; |
6850 ASSERT(args.length() == 3); | 6854 ASSERT(args.length() == 3); |
6851 CONVERT_CHECKED(JSArray, array, args[0]); | 6855 CONVERT_ARG_CHECKED(JSArray, array, 0); |
6852 if (!args[1]->IsSmi()) { | 6856 if (!args[1]->IsSmi()) { |
6853 isolate->context()->mark_out_of_memory(); | 6857 isolate->context()->mark_out_of_memory(); |
6854 return Failure::OutOfMemoryException(); | 6858 return Failure::OutOfMemoryException(); |
6855 } | 6859 } |
6856 int array_length = args.smi_at(1); | 6860 int array_length = args.smi_at(1); |
6857 CONVERT_CHECKED(String, separator, args[2]); | 6861 CONVERT_ARG_CHECKED(String, separator, 2); |
6858 | 6862 |
6859 if (!array->HasFastElements()) { | 6863 if (!array->HasFastElements()) { |
6860 return isolate->Throw(isolate->heap()->illegal_argument_symbol()); | 6864 return isolate->Throw(isolate->heap()->illegal_argument_symbol()); |
6861 } | 6865 } |
6862 FixedArray* fixed_array = FixedArray::cast(array->elements()); | 6866 FixedArray* fixed_array = FixedArray::cast(array->elements()); |
6863 if (fixed_array->length() < array_length) { | 6867 if (fixed_array->length() < array_length) { |
6864 array_length = fixed_array->length(); | 6868 array_length = fixed_array->length(); |
6865 } | 6869 } |
6866 | 6870 |
6867 if (array_length == 0) { | 6871 if (array_length == 0) { |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6965 previous_separator_position++; | 6969 previous_separator_position++; |
6966 } | 6970 } |
6967 } | 6971 } |
6968 ASSERT(cursor <= buffer.length()); | 6972 ASSERT(cursor <= buffer.length()); |
6969 } | 6973 } |
6970 | 6974 |
6971 | 6975 |
6972 RUNTIME_FUNCTION(MaybeObject*, Runtime_SparseJoinWithSeparator) { | 6976 RUNTIME_FUNCTION(MaybeObject*, Runtime_SparseJoinWithSeparator) { |
6973 NoHandleAllocation ha; | 6977 NoHandleAllocation ha; |
6974 ASSERT(args.length() == 3); | 6978 ASSERT(args.length() == 3); |
6975 CONVERT_CHECKED(JSArray, elements_array, args[0]); | 6979 CONVERT_ARG_CHECKED(JSArray, elements_array, 0); |
6976 RUNTIME_ASSERT(elements_array->HasFastElements() || | 6980 RUNTIME_ASSERT(elements_array->HasFastElements() || |
6977 elements_array->HasFastSmiOnlyElements()); | 6981 elements_array->HasFastSmiOnlyElements()); |
6978 CONVERT_NUMBER_CHECKED(uint32_t, array_length, Uint32, args[1]); | 6982 CONVERT_NUMBER_CHECKED(uint32_t, array_length, Uint32, args[1]); |
6979 CONVERT_CHECKED(String, separator, args[2]); | 6983 CONVERT_ARG_CHECKED(String, separator, 2); |
6980 // elements_array is fast-mode JSarray of alternating positions | 6984 // elements_array is fast-mode JSarray of alternating positions |
6981 // (increasing order) and strings. | 6985 // (increasing order) and strings. |
6982 // array_length is length of original array (used to add separators); | 6986 // array_length is length of original array (used to add separators); |
6983 // separator is string to put between elements. Assumed to be non-empty. | 6987 // separator is string to put between elements. Assumed to be non-empty. |
6984 | 6988 |
6985 // Find total length of join result. | 6989 // Find total length of join result. |
6986 int string_length = 0; | 6990 int string_length = 0; |
6987 bool is_ascii = separator->IsAsciiRepresentation(); | 6991 bool is_ascii = separator->IsAsciiRepresentation(); |
6988 int max_string_length; | 6992 int max_string_length; |
6989 if (is_ascii) { | 6993 if (is_ascii) { |
6990 max_string_length = SeqAsciiString::kMaxLength; | 6994 max_string_length = SeqAsciiString::kMaxLength; |
6991 } else { | 6995 } else { |
6992 max_string_length = SeqTwoByteString::kMaxLength; | 6996 max_string_length = SeqTwoByteString::kMaxLength; |
6993 } | 6997 } |
6994 bool overflow = false; | 6998 bool overflow = false; |
6995 CONVERT_NUMBER_CHECKED(int, elements_length, | 6999 CONVERT_NUMBER_CHECKED(int, elements_length, |
6996 Int32, elements_array->length()); | 7000 Int32, elements_array->length()); |
6997 RUNTIME_ASSERT((elements_length & 1) == 0); // Even length. | 7001 RUNTIME_ASSERT((elements_length & 1) == 0); // Even length. |
6998 FixedArray* elements = FixedArray::cast(elements_array->elements()); | 7002 FixedArray* elements = FixedArray::cast(elements_array->elements()); |
6999 for (int i = 0; i < elements_length; i += 2) { | 7003 for (int i = 0; i < elements_length; i += 2) { |
7000 RUNTIME_ASSERT(elements->get(i)->IsNumber()); | 7004 RUNTIME_ASSERT(elements->get(i)->IsNumber()); |
7001 CONVERT_CHECKED(String, string, elements->get(i + 1)); | 7005 RUNTIME_ASSERT(elements->get(i + 1)->IsString()); |
| 7006 String* string = String::cast(elements->get(i + 1)); |
7002 int length = string->length(); | 7007 int length = string->length(); |
7003 if (is_ascii && !string->IsAsciiRepresentation()) { | 7008 if (is_ascii && !string->IsAsciiRepresentation()) { |
7004 is_ascii = false; | 7009 is_ascii = false; |
7005 max_string_length = SeqTwoByteString::kMaxLength; | 7010 max_string_length = SeqTwoByteString::kMaxLength; |
7006 } | 7011 } |
7007 if (length > max_string_length || | 7012 if (length > max_string_length || |
7008 max_string_length - length < string_length) { | 7013 max_string_length - length < string_length) { |
7009 overflow = true; | 7014 overflow = true; |
7010 break; | 7015 break; |
7011 } | 7016 } |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7149 result = Smi::FromInt(NOT_EQUAL); | 7154 result = Smi::FromInt(NOT_EQUAL); |
7150 } | 7155 } |
7151 return result; | 7156 return result; |
7152 } | 7157 } |
7153 | 7158 |
7154 | 7159 |
7155 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringEquals) { | 7160 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringEquals) { |
7156 NoHandleAllocation ha; | 7161 NoHandleAllocation ha; |
7157 ASSERT(args.length() == 2); | 7162 ASSERT(args.length() == 2); |
7158 | 7163 |
7159 CONVERT_CHECKED(String, x, args[0]); | 7164 CONVERT_ARG_CHECKED(String, x, 0); |
7160 CONVERT_CHECKED(String, y, args[1]); | 7165 CONVERT_ARG_CHECKED(String, y, 1); |
7161 | 7166 |
7162 bool not_equal = !x->Equals(y); | 7167 bool not_equal = !x->Equals(y); |
7163 // This is slightly convoluted because the value that signifies | 7168 // This is slightly convoluted because the value that signifies |
7164 // equality is 0 and inequality is 1 so we have to negate the result | 7169 // equality is 0 and inequality is 1 so we have to negate the result |
7165 // from String::Equals. | 7170 // from String::Equals. |
7166 ASSERT(not_equal == 0 || not_equal == 1); | 7171 ASSERT(not_equal == 0 || not_equal == 1); |
7167 STATIC_CHECK(EQUAL == 0); | 7172 STATIC_CHECK(EQUAL == 0); |
7168 STATIC_CHECK(NOT_EQUAL == 1); | 7173 STATIC_CHECK(NOT_EQUAL == 1); |
7169 return Smi::FromInt(not_equal); | 7174 return Smi::FromInt(not_equal); |
7170 } | 7175 } |
(...skipping 10 matching lines...) Expand all Loading... |
7181 if (isless(x, y)) return Smi::FromInt(LESS); | 7186 if (isless(x, y)) return Smi::FromInt(LESS); |
7182 return Smi::FromInt(GREATER); | 7187 return Smi::FromInt(GREATER); |
7183 } | 7188 } |
7184 | 7189 |
7185 | 7190 |
7186 // Compare two Smis as if they were converted to strings and then | 7191 // Compare two Smis as if they were converted to strings and then |
7187 // compared lexicographically. | 7192 // compared lexicographically. |
7188 RUNTIME_FUNCTION(MaybeObject*, Runtime_SmiLexicographicCompare) { | 7193 RUNTIME_FUNCTION(MaybeObject*, Runtime_SmiLexicographicCompare) { |
7189 NoHandleAllocation ha; | 7194 NoHandleAllocation ha; |
7190 ASSERT(args.length() == 2); | 7195 ASSERT(args.length() == 2); |
7191 | 7196 CONVERT_SMI_ARG_CHECKED(x_value, 0); |
7192 // Extract the integer values from the Smis. | 7197 CONVERT_SMI_ARG_CHECKED(y_value, 1); |
7193 CONVERT_CHECKED(Smi, x, args[0]); | |
7194 CONVERT_CHECKED(Smi, y, args[1]); | |
7195 int x_value = x->value(); | |
7196 int y_value = y->value(); | |
7197 | 7198 |
7198 // If the integers are equal so are the string representations. | 7199 // If the integers are equal so are the string representations. |
7199 if (x_value == y_value) return Smi::FromInt(EQUAL); | 7200 if (x_value == y_value) return Smi::FromInt(EQUAL); |
7200 | 7201 |
7201 // If one of the integers is zero the normal integer order is the | 7202 // If one of the integers is zero the normal integer order is the |
7202 // same as the lexicographic order of the string representations. | 7203 // same as the lexicographic order of the string representations. |
7203 if (x_value == 0 || y_value == 0) | 7204 if (x_value == 0 || y_value == 0) |
7204 return Smi::FromInt(x_value < y_value ? LESS : GREATER); | 7205 return Smi::FromInt(x_value < y_value ? LESS : GREATER); |
7205 | 7206 |
7206 // If only one of the integers is negative the negative number is | 7207 // If only one of the integers is negative the negative number is |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7326 ASSERT(result == | 7327 ASSERT(result == |
7327 StringInputBufferCompare(Isolate::Current()->runtime_state(), x, y)); | 7328 StringInputBufferCompare(Isolate::Current()->runtime_state(), x, y)); |
7328 return result; | 7329 return result; |
7329 } | 7330 } |
7330 | 7331 |
7331 | 7332 |
7332 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringCompare) { | 7333 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringCompare) { |
7333 NoHandleAllocation ha; | 7334 NoHandleAllocation ha; |
7334 ASSERT(args.length() == 2); | 7335 ASSERT(args.length() == 2); |
7335 | 7336 |
7336 CONVERT_CHECKED(String, x, args[0]); | 7337 CONVERT_ARG_CHECKED(String, x, 0); |
7337 CONVERT_CHECKED(String, y, args[1]); | 7338 CONVERT_ARG_CHECKED(String, y, 1); |
7338 | 7339 |
7339 isolate->counters()->string_compare_runtime()->Increment(); | 7340 isolate->counters()->string_compare_runtime()->Increment(); |
7340 | 7341 |
7341 // A few fast case tests before we flatten. | 7342 // A few fast case tests before we flatten. |
7342 if (x == y) return Smi::FromInt(EQUAL); | 7343 if (x == y) return Smi::FromInt(EQUAL); |
7343 if (y->length() == 0) { | 7344 if (y->length() == 0) { |
7344 if (x->length() == 0) return Smi::FromInt(EQUAL); | 7345 if (x->length() == 0) return Smi::FromInt(EQUAL); |
7345 return Smi::FromInt(GREATER); | 7346 return Smi::FromInt(GREATER); |
7346 } else if (x->length() == 0) { | 7347 } else if (x->length() == 0) { |
7347 return Smi::FromInt(LESS); | 7348 return Smi::FromInt(LESS); |
(...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7934 DateYMDFromTimeSlow(date, year, month, day); | 7935 DateYMDFromTimeSlow(date, year, month, day); |
7935 } | 7936 } |
7936 } | 7937 } |
7937 | 7938 |
7938 | 7939 |
7939 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateYMDFromTime) { | 7940 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateYMDFromTime) { |
7940 NoHandleAllocation ha; | 7941 NoHandleAllocation ha; |
7941 ASSERT(args.length() == 2); | 7942 ASSERT(args.length() == 2); |
7942 | 7943 |
7943 CONVERT_DOUBLE_ARG_CHECKED(t, 0); | 7944 CONVERT_DOUBLE_ARG_CHECKED(t, 0); |
7944 CONVERT_CHECKED(JSArray, res_array, args[1]); | 7945 CONVERT_ARG_CHECKED(JSArray, res_array, 1); |
7945 | 7946 |
7946 int year, month, day; | 7947 int year, month, day; |
7947 DateYMDFromTime(static_cast<int>(floor(t / 86400000)), year, month, day); | 7948 DateYMDFromTime(static_cast<int>(floor(t / 86400000)), year, month, day); |
7948 | 7949 |
7949 FixedArrayBase* elms_base = FixedArrayBase::cast(res_array->elements()); | 7950 FixedArrayBase* elms_base = FixedArrayBase::cast(res_array->elements()); |
7950 RUNTIME_ASSERT(elms_base->length() == 3); | 7951 RUNTIME_ASSERT(elms_base->length() == 3); |
7951 RUNTIME_ASSERT(res_array->HasFastTypeElements()); | 7952 RUNTIME_ASSERT(res_array->HasFastTypeElements()); |
7952 | 7953 |
7953 MaybeObject* maybe = res_array->EnsureWritableFastElements(); | 7954 MaybeObject* maybe = res_array->EnsureWritableFastElements(); |
7954 if (maybe->IsFailure()) return maybe; | 7955 if (maybe->IsFailure()) return maybe; |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8089 } | 8090 } |
8090 JSObject::cast(result)->set_elements(FixedArray::cast(obj)); | 8091 JSObject::cast(result)->set_elements(FixedArray::cast(obj)); |
8091 } | 8092 } |
8092 return result; | 8093 return result; |
8093 } | 8094 } |
8094 | 8095 |
8095 | 8096 |
8096 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewClosure) { | 8097 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewClosure) { |
8097 HandleScope scope(isolate); | 8098 HandleScope scope(isolate); |
8098 ASSERT(args.length() == 3); | 8099 ASSERT(args.length() == 3); |
8099 CONVERT_ARG_CHECKED(Context, context, 0); | 8100 CONVERT_ARG_HANDLE_CHECKED(Context, context, 0); |
8100 CONVERT_ARG_CHECKED(SharedFunctionInfo, shared, 1); | 8101 CONVERT_ARG_HANDLE_CHECKED(SharedFunctionInfo, shared, 1); |
8101 CONVERT_BOOLEAN_CHECKED(pretenure, args[2]); | 8102 CONVERT_BOOLEAN_ARG_CHECKED(pretenure, 2); |
8102 | 8103 |
8103 // The caller ensures that we pretenure closures that are assigned | 8104 // The caller ensures that we pretenure closures that are assigned |
8104 // directly to properties. | 8105 // directly to properties. |
8105 PretenureFlag pretenure_flag = pretenure ? TENURED : NOT_TENURED; | 8106 PretenureFlag pretenure_flag = pretenure ? TENURED : NOT_TENURED; |
8106 Handle<JSFunction> result = | 8107 Handle<JSFunction> result = |
8107 isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, | 8108 isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, |
8108 context, | 8109 context, |
8109 pretenure_flag); | 8110 pretenure_flag); |
8110 return *result; | 8111 return *result; |
8111 } | 8112 } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8157 param_data[prefix_argc + i] = val; | 8158 param_data[prefix_argc + i] = val; |
8158 } | 8159 } |
8159 return param_data; | 8160 return param_data; |
8160 } | 8161 } |
8161 } | 8162 } |
8162 | 8163 |
8163 | 8164 |
8164 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionBindArguments) { | 8165 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionBindArguments) { |
8165 HandleScope scope(isolate); | 8166 HandleScope scope(isolate); |
8166 ASSERT(args.length() == 4); | 8167 ASSERT(args.length() == 4); |
8167 CONVERT_ARG_CHECKED(JSFunction, bound_function, 0); | 8168 CONVERT_ARG_HANDLE_CHECKED(JSFunction, bound_function, 0); |
8168 RUNTIME_ASSERT(args[3]->IsNumber()); | 8169 RUNTIME_ASSERT(args[3]->IsNumber()); |
8169 Handle<Object> bindee = args.at<Object>(1); | 8170 Handle<Object> bindee = args.at<Object>(1); |
8170 | 8171 |
8171 // TODO(lrn): Create bound function in C++ code from premade shared info. | 8172 // TODO(lrn): Create bound function in C++ code from premade shared info. |
8172 bound_function->shared()->set_bound(true); | 8173 bound_function->shared()->set_bound(true); |
8173 // Get all arguments of calling function (Function.prototype.bind). | 8174 // Get all arguments of calling function (Function.prototype.bind). |
8174 int argc = 0; | 8175 int argc = 0; |
8175 SmartArrayPointer<Handle<Object> > arguments = GetCallerArguments(0, &argc); | 8176 SmartArrayPointer<Handle<Object> > arguments = GetCallerArguments(0, &argc); |
8176 // Don't count the this-arg. | 8177 // Don't count the this-arg. |
8177 if (argc > 0) { | 8178 if (argc > 0) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8215 PropertyAttributes attr = | 8216 PropertyAttributes attr = |
8216 static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY); | 8217 static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY); |
8217 ForceSetProperty(bound_function, length_symbol, new_length, attr); | 8218 ForceSetProperty(bound_function, length_symbol, new_length, attr); |
8218 return *bound_function; | 8219 return *bound_function; |
8219 } | 8220 } |
8220 | 8221 |
8221 | 8222 |
8222 RUNTIME_FUNCTION(MaybeObject*, Runtime_BoundFunctionGetBindings) { | 8223 RUNTIME_FUNCTION(MaybeObject*, Runtime_BoundFunctionGetBindings) { |
8223 HandleScope handles(isolate); | 8224 HandleScope handles(isolate); |
8224 ASSERT(args.length() == 1); | 8225 ASSERT(args.length() == 1); |
8225 CONVERT_ARG_CHECKED(JSReceiver, callable, 0); | 8226 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, callable, 0); |
8226 if (callable->IsJSFunction()) { | 8227 if (callable->IsJSFunction()) { |
8227 Handle<JSFunction> function = Handle<JSFunction>::cast(callable); | 8228 Handle<JSFunction> function = Handle<JSFunction>::cast(callable); |
8228 if (function->shared()->bound()) { | 8229 if (function->shared()->bound()) { |
8229 Handle<FixedArray> bindings(function->function_bindings()); | 8230 Handle<FixedArray> bindings(function->function_bindings()); |
8230 ASSERT(bindings->map() == isolate->heap()->fixed_cow_array_map()); | 8231 ASSERT(bindings->map() == isolate->heap()->fixed_cow_array_map()); |
8231 return *isolate->factory()->NewJSArrayWithElements(bindings); | 8232 return *isolate->factory()->NewJSArrayWithElements(bindings); |
8232 } | 8233 } |
8233 } | 8234 } |
8234 return isolate->heap()->undefined_value(); | 8235 return isolate->heap()->undefined_value(); |
8235 } | 8236 } |
8236 | 8237 |
8237 | 8238 |
8238 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewObjectFromBound) { | 8239 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewObjectFromBound) { |
8239 HandleScope scope(isolate); | 8240 HandleScope scope(isolate); |
8240 ASSERT(args.length() == 1); | 8241 ASSERT(args.length() == 1); |
8241 // First argument is a function to use as a constructor. | 8242 // First argument is a function to use as a constructor. |
8242 CONVERT_ARG_CHECKED(JSFunction, function, 0); | 8243 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
8243 RUNTIME_ASSERT(function->shared()->bound()); | 8244 RUNTIME_ASSERT(function->shared()->bound()); |
8244 | 8245 |
8245 // The argument is a bound function. Extract its bound arguments | 8246 // The argument is a bound function. Extract its bound arguments |
8246 // and callable. | 8247 // and callable. |
8247 Handle<FixedArray> bound_args = | 8248 Handle<FixedArray> bound_args = |
8248 Handle<FixedArray>(FixedArray::cast(function->function_bindings())); | 8249 Handle<FixedArray>(FixedArray::cast(function->function_bindings())); |
8249 int bound_argc = bound_args->length() - JSFunction::kBoundArgumentsStartIndex; | 8250 int bound_argc = bound_args->length() - JSFunction::kBoundArgumentsStartIndex; |
8250 Handle<Object> bound_function( | 8251 Handle<Object> bound_function( |
8251 JSReceiver::cast(bound_args->get(JSFunction::kBoundFunctionIndex))); | 8252 JSReceiver::cast(bound_args->get(JSFunction::kBoundFunctionIndex))); |
8252 ASSERT(!bound_function->IsJSFunction() || | 8253 ASSERT(!bound_function->IsJSFunction() || |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8373 isolate->counters()->constructed_objects_runtime()->Increment(); | 8374 isolate->counters()->constructed_objects_runtime()->Increment(); |
8374 | 8375 |
8375 return *result; | 8376 return *result; |
8376 } | 8377 } |
8377 | 8378 |
8378 | 8379 |
8379 RUNTIME_FUNCTION(MaybeObject*, Runtime_FinalizeInstanceSize) { | 8380 RUNTIME_FUNCTION(MaybeObject*, Runtime_FinalizeInstanceSize) { |
8380 HandleScope scope(isolate); | 8381 HandleScope scope(isolate); |
8381 ASSERT(args.length() == 1); | 8382 ASSERT(args.length() == 1); |
8382 | 8383 |
8383 CONVERT_ARG_CHECKED(JSFunction, function, 0); | 8384 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
8384 function->shared()->CompleteInobjectSlackTracking(); | 8385 function->shared()->CompleteInobjectSlackTracking(); |
8385 TrySettingInlineConstructStub(isolate, function); | 8386 TrySettingInlineConstructStub(isolate, function); |
8386 | 8387 |
8387 return isolate->heap()->undefined_value(); | 8388 return isolate->heap()->undefined_value(); |
8388 } | 8389 } |
8389 | 8390 |
8390 | 8391 |
8391 RUNTIME_FUNCTION(MaybeObject*, Runtime_LazyCompile) { | 8392 RUNTIME_FUNCTION(MaybeObject*, Runtime_LazyCompile) { |
8392 HandleScope scope(isolate); | 8393 HandleScope scope(isolate); |
8393 ASSERT(args.length() == 1); | 8394 ASSERT(args.length() == 1); |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8562 RUNTIME_FUNCTION(MaybeObject*, Runtime_NotifyOSR) { | 8563 RUNTIME_FUNCTION(MaybeObject*, Runtime_NotifyOSR) { |
8563 Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate); | 8564 Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate); |
8564 delete deoptimizer; | 8565 delete deoptimizer; |
8565 return isolate->heap()->undefined_value(); | 8566 return isolate->heap()->undefined_value(); |
8566 } | 8567 } |
8567 | 8568 |
8568 | 8569 |
8569 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeoptimizeFunction) { | 8570 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeoptimizeFunction) { |
8570 HandleScope scope(isolate); | 8571 HandleScope scope(isolate); |
8571 ASSERT(args.length() == 1); | 8572 ASSERT(args.length() == 1); |
8572 CONVERT_ARG_CHECKED(JSFunction, function, 0); | 8573 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
8573 if (!function->IsOptimized()) return isolate->heap()->undefined_value(); | 8574 if (!function->IsOptimized()) return isolate->heap()->undefined_value(); |
8574 | 8575 |
8575 Deoptimizer::DeoptimizeFunction(*function); | 8576 Deoptimizer::DeoptimizeFunction(*function); |
8576 | 8577 |
8577 return isolate->heap()->undefined_value(); | 8578 return isolate->heap()->undefined_value(); |
8578 } | 8579 } |
8579 | 8580 |
8580 | 8581 |
8581 RUNTIME_FUNCTION(MaybeObject*, Runtime_RunningInSimulator) { | 8582 RUNTIME_FUNCTION(MaybeObject*, Runtime_RunningInSimulator) { |
8582 #if defined(USE_SIMULATOR) | 8583 #if defined(USE_SIMULATOR) |
8583 return isolate->heap()->true_value(); | 8584 return isolate->heap()->true_value(); |
8584 #else | 8585 #else |
8585 return isolate->heap()->false_value(); | 8586 return isolate->heap()->false_value(); |
8586 #endif | 8587 #endif |
8587 } | 8588 } |
8588 | 8589 |
8589 | 8590 |
8590 RUNTIME_FUNCTION(MaybeObject*, Runtime_OptimizeFunctionOnNextCall) { | 8591 RUNTIME_FUNCTION(MaybeObject*, Runtime_OptimizeFunctionOnNextCall) { |
8591 HandleScope scope(isolate); | 8592 HandleScope scope(isolate); |
8592 ASSERT(args.length() == 1); | 8593 ASSERT(args.length() == 1); |
8593 CONVERT_ARG_CHECKED(JSFunction, function, 0); | 8594 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
8594 if (!function->IsOptimizable()) return isolate->heap()->undefined_value(); | 8595 if (!function->IsOptimizable()) return isolate->heap()->undefined_value(); |
8595 function->MarkForLazyRecompilation(); | 8596 function->MarkForLazyRecompilation(); |
8596 return isolate->heap()->undefined_value(); | 8597 return isolate->heap()->undefined_value(); |
8597 } | 8598 } |
8598 | 8599 |
8599 | 8600 |
8600 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOptimizationStatus) { | 8601 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOptimizationStatus) { |
8601 HandleScope scope(isolate); | 8602 HandleScope scope(isolate); |
8602 ASSERT(args.length() == 1); | 8603 ASSERT(args.length() == 1); |
8603 // The least significant bit (after untagging) indicates whether the | 8604 // The least significant bit (after untagging) indicates whether the |
8604 // function is currently optimized, regardless of reason. | 8605 // function is currently optimized, regardless of reason. |
8605 if (!V8::UseCrankshaft()) { | 8606 if (!V8::UseCrankshaft()) { |
8606 return Smi::FromInt(4); // 4 == "never". | 8607 return Smi::FromInt(4); // 4 == "never". |
8607 } | 8608 } |
8608 if (FLAG_always_opt) { | 8609 if (FLAG_always_opt) { |
8609 return Smi::FromInt(3); // 3 == "always". | 8610 return Smi::FromInt(3); // 3 == "always". |
8610 } | 8611 } |
8611 CONVERT_ARG_CHECKED(JSFunction, function, 0); | 8612 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
8612 return function->IsOptimized() ? Smi::FromInt(1) // 1 == "yes". | 8613 return function->IsOptimized() ? Smi::FromInt(1) // 1 == "yes". |
8613 : Smi::FromInt(2); // 2 == "no". | 8614 : Smi::FromInt(2); // 2 == "no". |
8614 } | 8615 } |
8615 | 8616 |
8616 | 8617 |
8617 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOptimizationCount) { | 8618 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOptimizationCount) { |
8618 HandleScope scope(isolate); | 8619 HandleScope scope(isolate); |
8619 ASSERT(args.length() == 1); | 8620 ASSERT(args.length() == 1); |
8620 CONVERT_ARG_CHECKED(JSFunction, function, 0); | 8621 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
8621 return Smi::FromInt(function->shared()->opt_count()); | 8622 return Smi::FromInt(function->shared()->opt_count()); |
8622 } | 8623 } |
8623 | 8624 |
8624 | 8625 |
8625 RUNTIME_FUNCTION(MaybeObject*, Runtime_CompileForOnStackReplacement) { | 8626 RUNTIME_FUNCTION(MaybeObject*, Runtime_CompileForOnStackReplacement) { |
8626 HandleScope scope(isolate); | 8627 HandleScope scope(isolate); |
8627 ASSERT(args.length() == 1); | 8628 ASSERT(args.length() == 1); |
8628 CONVERT_ARG_CHECKED(JSFunction, function, 0); | 8629 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
8629 | 8630 |
8630 // We're not prepared to handle a function with arguments object. | 8631 // We're not prepared to handle a function with arguments object. |
8631 ASSERT(!function->shared()->uses_arguments()); | 8632 ASSERT(!function->shared()->uses_arguments()); |
8632 | 8633 |
8633 // We have hit a back edge in an unoptimized frame for a function that was | 8634 // We have hit a back edge in an unoptimized frame for a function that was |
8634 // selected for on-stack replacement. Find the unoptimized code object. | 8635 // selected for on-stack replacement. Find the unoptimized code object. |
8635 Handle<Code> unoptimized(function->shared()->code(), isolate); | 8636 Handle<Code> unoptimized(function->shared()->code(), isolate); |
8636 // Keep track of whether we've succeeded in optimizing. | 8637 // Keep track of whether we've succeeded in optimizing. |
8637 bool succeeded = unoptimized->optimizable(); | 8638 bool succeeded = unoptimized->optimizable(); |
8638 if (succeeded) { | 8639 if (succeeded) { |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8747 | 8748 |
8748 RUNTIME_FUNCTION(MaybeObject*, Runtime_CheckIsBootstrapping) { | 8749 RUNTIME_FUNCTION(MaybeObject*, Runtime_CheckIsBootstrapping) { |
8749 RUNTIME_ASSERT(isolate->bootstrapper()->IsActive()); | 8750 RUNTIME_ASSERT(isolate->bootstrapper()->IsActive()); |
8750 return isolate->heap()->undefined_value(); | 8751 return isolate->heap()->undefined_value(); |
8751 } | 8752 } |
8752 | 8753 |
8753 | 8754 |
8754 RUNTIME_FUNCTION(MaybeObject*, Runtime_Call) { | 8755 RUNTIME_FUNCTION(MaybeObject*, Runtime_Call) { |
8755 HandleScope scope(isolate); | 8756 HandleScope scope(isolate); |
8756 ASSERT(args.length() >= 2); | 8757 ASSERT(args.length() >= 2); |
8757 CONVERT_CHECKED(JSReceiver, fun, args[args.length() - 1]); | 8758 int argc = args.length() - 2; |
| 8759 CONVERT_ARG_CHECKED(JSReceiver, fun, argc + 1); |
8758 Object* receiver = args[0]; | 8760 Object* receiver = args[0]; |
8759 int argc = args.length() - 2; | |
8760 | 8761 |
8761 // If there are too many arguments, allocate argv via malloc. | 8762 // If there are too many arguments, allocate argv via malloc. |
8762 const int argv_small_size = 10; | 8763 const int argv_small_size = 10; |
8763 Handle<Object> argv_small_buffer[argv_small_size]; | 8764 Handle<Object> argv_small_buffer[argv_small_size]; |
8764 SmartArrayPointer<Handle<Object> > argv_large_buffer; | 8765 SmartArrayPointer<Handle<Object> > argv_large_buffer; |
8765 Handle<Object>* argv = argv_small_buffer; | 8766 Handle<Object>* argv = argv_small_buffer; |
8766 if (argc > argv_small_size) { | 8767 if (argc > argv_small_size) { |
8767 argv = new Handle<Object>[argc]; | 8768 argv = new Handle<Object>[argc]; |
8768 if (argv == NULL) return isolate->StackOverflow(); | 8769 if (argv == NULL) return isolate->StackOverflow(); |
8769 argv_large_buffer = SmartArrayPointer<Handle<Object> >(argv); | 8770 argv_large_buffer = SmartArrayPointer<Handle<Object> >(argv); |
(...skipping 13 matching lines...) Expand all Loading... |
8783 Execution::Call(hfun, hreceiver, argc, argv, &threw, true); | 8784 Execution::Call(hfun, hreceiver, argc, argv, &threw, true); |
8784 | 8785 |
8785 if (threw) return Failure::Exception(); | 8786 if (threw) return Failure::Exception(); |
8786 return *result; | 8787 return *result; |
8787 } | 8788 } |
8788 | 8789 |
8789 | 8790 |
8790 RUNTIME_FUNCTION(MaybeObject*, Runtime_Apply) { | 8791 RUNTIME_FUNCTION(MaybeObject*, Runtime_Apply) { |
8791 HandleScope scope(isolate); | 8792 HandleScope scope(isolate); |
8792 ASSERT(args.length() == 5); | 8793 ASSERT(args.length() == 5); |
8793 CONVERT_ARG_CHECKED(JSReceiver, fun, 0); | 8794 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, fun, 0); |
8794 Handle<Object> receiver = args.at<Object>(1); | 8795 Handle<Object> receiver = args.at<Object>(1); |
8795 CONVERT_ARG_CHECKED(JSObject, arguments, 2); | 8796 CONVERT_ARG_HANDLE_CHECKED(JSObject, arguments, 2); |
8796 CONVERT_SMI_ARG_CHECKED(offset, 3); | 8797 CONVERT_SMI_ARG_CHECKED(offset, 3); |
8797 CONVERT_SMI_ARG_CHECKED(argc, 4); | 8798 CONVERT_SMI_ARG_CHECKED(argc, 4); |
8798 ASSERT(offset >= 0); | 8799 ASSERT(offset >= 0); |
8799 ASSERT(argc >= 0); | 8800 ASSERT(argc >= 0); |
8800 | 8801 |
8801 // If there are too many arguments, allocate argv via malloc. | 8802 // If there are too many arguments, allocate argv via malloc. |
8802 const int argv_small_size = 10; | 8803 const int argv_small_size = 10; |
8803 Handle<Object> argv_small_buffer[argv_small_size]; | 8804 Handle<Object> argv_small_buffer[argv_small_size]; |
8804 SmartArrayPointer<Handle<Object> > argv_large_buffer; | 8805 SmartArrayPointer<Handle<Object> > argv_large_buffer; |
8805 Handle<Object>* argv = argv_small_buffer; | 8806 Handle<Object>* argv = argv_small_buffer; |
(...skipping 29 matching lines...) Expand all Loading... |
8835 ASSERT(args.length() == 1); | 8836 ASSERT(args.length() == 1); |
8836 RUNTIME_ASSERT(!args[0]->IsJSFunction()); | 8837 RUNTIME_ASSERT(!args[0]->IsJSFunction()); |
8837 return *Execution::GetConstructorDelegate(args.at<Object>(0)); | 8838 return *Execution::GetConstructorDelegate(args.at<Object>(0)); |
8838 } | 8839 } |
8839 | 8840 |
8840 | 8841 |
8841 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewFunctionContext) { | 8842 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewFunctionContext) { |
8842 NoHandleAllocation ha; | 8843 NoHandleAllocation ha; |
8843 ASSERT(args.length() == 1); | 8844 ASSERT(args.length() == 1); |
8844 | 8845 |
8845 CONVERT_CHECKED(JSFunction, function, args[0]); | 8846 CONVERT_ARG_CHECKED(JSFunction, function, 0); |
8846 int length = function->shared()->scope_info()->ContextLength(); | 8847 int length = function->shared()->scope_info()->ContextLength(); |
8847 Object* result; | 8848 Object* result; |
8848 { MaybeObject* maybe_result = | 8849 { MaybeObject* maybe_result = |
8849 isolate->heap()->AllocateFunctionContext(length, function); | 8850 isolate->heap()->AllocateFunctionContext(length, function); |
8850 if (!maybe_result->ToObject(&result)) return maybe_result; | 8851 if (!maybe_result->ToObject(&result)) return maybe_result; |
8851 } | 8852 } |
8852 | 8853 |
8853 isolate->set_context(Context::cast(result)); | 8854 isolate->set_context(Context::cast(result)); |
8854 | 8855 |
8855 return result; // non-failure | 8856 return result; // non-failure |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8947 if (!maybe_context->To(&context)) return maybe_context; | 8948 if (!maybe_context->To(&context)) return maybe_context; |
8948 isolate->set_context(context); | 8949 isolate->set_context(context); |
8949 return context; | 8950 return context; |
8950 } | 8951 } |
8951 | 8952 |
8952 | 8953 |
8953 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeleteContextSlot) { | 8954 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeleteContextSlot) { |
8954 HandleScope scope(isolate); | 8955 HandleScope scope(isolate); |
8955 ASSERT(args.length() == 2); | 8956 ASSERT(args.length() == 2); |
8956 | 8957 |
8957 CONVERT_ARG_CHECKED(Context, context, 0); | 8958 CONVERT_ARG_HANDLE_CHECKED(Context, context, 0); |
8958 CONVERT_ARG_CHECKED(String, name, 1); | 8959 CONVERT_ARG_HANDLE_CHECKED(String, name, 1); |
8959 | 8960 |
8960 int index; | 8961 int index; |
8961 PropertyAttributes attributes; | 8962 PropertyAttributes attributes; |
8962 ContextLookupFlags flags = FOLLOW_CHAINS; | 8963 ContextLookupFlags flags = FOLLOW_CHAINS; |
8963 BindingFlags binding_flags; | 8964 BindingFlags binding_flags; |
8964 Handle<Object> holder = context->Lookup(name, | 8965 Handle<Object> holder = context->Lookup(name, |
8965 flags, | 8966 flags, |
8966 &index, | 8967 &index, |
8967 &attributes, | 8968 &attributes, |
8968 &binding_flags); | 8969 &binding_flags); |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9140 RUNTIME_FUNCTION(ObjectPair, Runtime_LoadContextSlotNoReferenceError) { | 9141 RUNTIME_FUNCTION(ObjectPair, Runtime_LoadContextSlotNoReferenceError) { |
9141 return LoadContextSlotHelper(args, isolate, false); | 9142 return LoadContextSlotHelper(args, isolate, false); |
9142 } | 9143 } |
9143 | 9144 |
9144 | 9145 |
9145 RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreContextSlot) { | 9146 RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreContextSlot) { |
9146 HandleScope scope(isolate); | 9147 HandleScope scope(isolate); |
9147 ASSERT(args.length() == 4); | 9148 ASSERT(args.length() == 4); |
9148 | 9149 |
9149 Handle<Object> value(args[0], isolate); | 9150 Handle<Object> value(args[0], isolate); |
9150 CONVERT_ARG_CHECKED(Context, context, 1); | 9151 CONVERT_ARG_HANDLE_CHECKED(Context, context, 1); |
9151 CONVERT_ARG_CHECKED(String, name, 2); | 9152 CONVERT_ARG_HANDLE_CHECKED(String, name, 2); |
9152 CONVERT_LANGUAGE_MODE_ARG(language_mode, 3); | 9153 CONVERT_LANGUAGE_MODE_ARG(language_mode, 3); |
9153 StrictModeFlag strict_mode = (language_mode == CLASSIC_MODE) | 9154 StrictModeFlag strict_mode = (language_mode == CLASSIC_MODE) |
9154 ? kNonStrictMode : kStrictMode; | 9155 ? kNonStrictMode : kStrictMode; |
9155 | 9156 |
9156 int index; | 9157 int index; |
9157 PropertyAttributes attributes; | 9158 PropertyAttributes attributes; |
9158 ContextLookupFlags flags = FOLLOW_CHAINS; | 9159 ContextLookupFlags flags = FOLLOW_CHAINS; |
9159 BindingFlags binding_flags; | 9160 BindingFlags binding_flags; |
9160 Handle<Object> holder = context->Lookup(name, | 9161 Handle<Object> holder = context->Lookup(name, |
9161 flags, | 9162 flags, |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9374 // the OS time. | 9375 // the OS time. |
9375 double millis = floor(OS::TimeCurrentMillis()); | 9376 double millis = floor(OS::TimeCurrentMillis()); |
9376 return isolate->heap()->NumberFromDouble(millis); | 9377 return isolate->heap()->NumberFromDouble(millis); |
9377 } | 9378 } |
9378 | 9379 |
9379 | 9380 |
9380 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateParseString) { | 9381 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateParseString) { |
9381 HandleScope scope(isolate); | 9382 HandleScope scope(isolate); |
9382 ASSERT(args.length() == 2); | 9383 ASSERT(args.length() == 2); |
9383 | 9384 |
9384 CONVERT_ARG_CHECKED(String, str, 0); | 9385 CONVERT_ARG_HANDLE_CHECKED(String, str, 0); |
9385 FlattenString(str); | 9386 FlattenString(str); |
9386 | 9387 |
9387 CONVERT_ARG_CHECKED(JSArray, output, 1); | 9388 CONVERT_ARG_HANDLE_CHECKED(JSArray, output, 1); |
9388 | 9389 |
9389 MaybeObject* maybe_result_array = | 9390 MaybeObject* maybe_result_array = |
9390 output->EnsureCanContainHeapObjectElements(); | 9391 output->EnsureCanContainHeapObjectElements(); |
9391 if (maybe_result_array->IsFailure()) return maybe_result_array; | 9392 if (maybe_result_array->IsFailure()) return maybe_result_array; |
9392 RUNTIME_ASSERT(output->HasFastElements()); | 9393 RUNTIME_ASSERT(output->HasFastElements()); |
9393 | 9394 |
9394 AssertNoAllocation no_allocation; | 9395 AssertNoAllocation no_allocation; |
9395 | 9396 |
9396 FixedArray* output_array = FixedArray::cast(output->elements()); | 9397 FixedArray* output_array = FixedArray::cast(output->elements()); |
9397 RUNTIME_ASSERT(output_array->length() >= DateParser::OUTPUT_SIZE); | 9398 RUNTIME_ASSERT(output_array->length() >= DateParser::OUTPUT_SIZE); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9447 ASSERT(args.length() == 1); | 9448 ASSERT(args.length() == 1); |
9448 Object* global = args[0]; | 9449 Object* global = args[0]; |
9449 if (!global->IsJSGlobalObject()) return isolate->heap()->null_value(); | 9450 if (!global->IsJSGlobalObject()) return isolate->heap()->null_value(); |
9450 return JSGlobalObject::cast(global)->global_receiver(); | 9451 return JSGlobalObject::cast(global)->global_receiver(); |
9451 } | 9452 } |
9452 | 9453 |
9453 | 9454 |
9454 RUNTIME_FUNCTION(MaybeObject*, Runtime_ParseJson) { | 9455 RUNTIME_FUNCTION(MaybeObject*, Runtime_ParseJson) { |
9455 HandleScope scope(isolate); | 9456 HandleScope scope(isolate); |
9456 ASSERT_EQ(1, args.length()); | 9457 ASSERT_EQ(1, args.length()); |
9457 CONVERT_ARG_CHECKED(String, source, 0); | 9458 CONVERT_ARG_HANDLE_CHECKED(String, source, 0); |
9458 | 9459 |
9459 source = Handle<String>(source->TryFlattenGetString()); | 9460 source = Handle<String>(source->TryFlattenGetString()); |
9460 // Optimized fast case where we only have ASCII characters. | 9461 // Optimized fast case where we only have ASCII characters. |
9461 Handle<Object> result; | 9462 Handle<Object> result; |
9462 if (source->IsSeqAsciiString()) { | 9463 if (source->IsSeqAsciiString()) { |
9463 result = JsonParser<true>::Parse(source); | 9464 result = JsonParser<true>::Parse(source); |
9464 } else { | 9465 } else { |
9465 result = JsonParser<false>::Parse(source); | 9466 result = JsonParser<false>::Parse(source); |
9466 } | 9467 } |
9467 if (result.is_null()) { | 9468 if (result.is_null()) { |
(...skipping 18 matching lines...) Expand all Loading... |
9486 // Callback set. Let it decide if code generation is allowed. | 9487 // Callback set. Let it decide if code generation is allowed. |
9487 VMState state(isolate, EXTERNAL); | 9488 VMState state(isolate, EXTERNAL); |
9488 return callback(v8::Utils::ToLocal(context)); | 9489 return callback(v8::Utils::ToLocal(context)); |
9489 } | 9490 } |
9490 } | 9491 } |
9491 | 9492 |
9492 | 9493 |
9493 RUNTIME_FUNCTION(MaybeObject*, Runtime_CompileString) { | 9494 RUNTIME_FUNCTION(MaybeObject*, Runtime_CompileString) { |
9494 HandleScope scope(isolate); | 9495 HandleScope scope(isolate); |
9495 ASSERT_EQ(1, args.length()); | 9496 ASSERT_EQ(1, args.length()); |
9496 CONVERT_ARG_CHECKED(String, source, 0); | 9497 CONVERT_ARG_HANDLE_CHECKED(String, source, 0); |
9497 | 9498 |
9498 // Extract global context. | 9499 // Extract global context. |
9499 Handle<Context> context(isolate->context()->global_context()); | 9500 Handle<Context> context(isolate->context()->global_context()); |
9500 | 9501 |
9501 // Check if global context allows code generation from | 9502 // Check if global context allows code generation from |
9502 // strings. Throw an exception if it doesn't. | 9503 // strings. Throw an exception if it doesn't. |
9503 if (context->allow_code_gen_from_strings()->IsFalse() && | 9504 if (context->allow_code_gen_from_strings()->IsFalse() && |
9504 !CodeGenerationFromStringsAllowed(isolate, context)) { | 9505 !CodeGenerationFromStringsAllowed(isolate, context)) { |
9505 return isolate->Throw(*isolate->factory()->NewError( | 9506 return isolate->Throw(*isolate->factory()->NewError( |
9506 "code_gen_from_strings", HandleVector<Object>(NULL, 0))); | 9507 "code_gen_from_strings", HandleVector<Object>(NULL, 0))); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9577 } | 9578 } |
9578 | 9579 |
9579 | 9580 |
9580 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetNewFunctionAttributes) { | 9581 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetNewFunctionAttributes) { |
9581 // This utility adjusts the property attributes for newly created Function | 9582 // This utility adjusts the property attributes for newly created Function |
9582 // object ("new Function(...)") by changing the map. | 9583 // object ("new Function(...)") by changing the map. |
9583 // All it does is changing the prototype property to enumerable | 9584 // All it does is changing the prototype property to enumerable |
9584 // as specified in ECMA262, 15.3.5.2. | 9585 // as specified in ECMA262, 15.3.5.2. |
9585 HandleScope scope(isolate); | 9586 HandleScope scope(isolate); |
9586 ASSERT(args.length() == 1); | 9587 ASSERT(args.length() == 1); |
9587 CONVERT_ARG_CHECKED(JSFunction, func, 0); | 9588 CONVERT_ARG_HANDLE_CHECKED(JSFunction, func, 0); |
9588 | 9589 |
9589 Handle<Map> map = func->shared()->is_classic_mode() | 9590 Handle<Map> map = func->shared()->is_classic_mode() |
9590 ? isolate->function_instance_map() | 9591 ? isolate->function_instance_map() |
9591 : isolate->strict_mode_function_instance_map(); | 9592 : isolate->strict_mode_function_instance_map(); |
9592 | 9593 |
9593 ASSERT(func->map()->instance_type() == map->instance_type()); | 9594 ASSERT(func->map()->instance_type() == map->instance_type()); |
9594 ASSERT(func->map()->instance_size() == map->instance_size()); | 9595 ASSERT(func->map()->instance_size() == map->instance_size()); |
9595 func->set_map(*map); | 9596 func->set_map(*map); |
9596 return *func; | 9597 return *func; |
9597 } | 9598 } |
9598 | 9599 |
9599 | 9600 |
9600 RUNTIME_FUNCTION(MaybeObject*, Runtime_AllocateInNewSpace) { | 9601 RUNTIME_FUNCTION(MaybeObject*, Runtime_AllocateInNewSpace) { |
9601 // Allocate a block of memory in NewSpace (filled with a filler). | 9602 // Allocate a block of memory in NewSpace (filled with a filler). |
9602 // Use as fallback for allocation in generated code when NewSpace | 9603 // Use as fallback for allocation in generated code when NewSpace |
9603 // is full. | 9604 // is full. |
9604 ASSERT(args.length() == 1); | 9605 ASSERT(args.length() == 1); |
9605 CONVERT_ARG_CHECKED(Smi, size_smi, 0); | 9606 CONVERT_ARG_HANDLE_CHECKED(Smi, size_smi, 0); |
9606 int size = size_smi->value(); | 9607 int size = size_smi->value(); |
9607 RUNTIME_ASSERT(IsAligned(size, kPointerSize)); | 9608 RUNTIME_ASSERT(IsAligned(size, kPointerSize)); |
9608 RUNTIME_ASSERT(size > 0); | 9609 RUNTIME_ASSERT(size > 0); |
9609 Heap* heap = isolate->heap(); | 9610 Heap* heap = isolate->heap(); |
9610 const int kMinFreeNewSpaceAfterGC = heap->InitialSemiSpaceSize() * 3/4; | 9611 const int kMinFreeNewSpaceAfterGC = heap->InitialSemiSpaceSize() * 3/4; |
9611 RUNTIME_ASSERT(size <= kMinFreeNewSpaceAfterGC); | 9612 RUNTIME_ASSERT(size <= kMinFreeNewSpaceAfterGC); |
9612 Object* allocation; | 9613 Object* allocation; |
9613 { MaybeObject* maybe_allocation = heap->new_space()->AllocateRaw(size); | 9614 { MaybeObject* maybe_allocation = heap->new_space()->AllocateRaw(size); |
9614 if (maybe_allocation->ToObject(&allocation)) { | 9615 if (maybe_allocation->ToObject(&allocation)) { |
9615 heap->CreateFillerObjectAt(HeapObject::cast(allocation)->address(), size); | 9616 heap->CreateFillerObjectAt(HeapObject::cast(allocation)->address(), size); |
9616 } | 9617 } |
9617 return maybe_allocation; | 9618 return maybe_allocation; |
9618 } | 9619 } |
9619 } | 9620 } |
9620 | 9621 |
9621 | 9622 |
9622 // Push an object unto an array of objects if it is not already in the | 9623 // Push an object unto an array of objects if it is not already in the |
9623 // array. Returns true if the element was pushed on the stack and | 9624 // array. Returns true if the element was pushed on the stack and |
9624 // false otherwise. | 9625 // false otherwise. |
9625 RUNTIME_FUNCTION(MaybeObject*, Runtime_PushIfAbsent) { | 9626 RUNTIME_FUNCTION(MaybeObject*, Runtime_PushIfAbsent) { |
9626 ASSERT(args.length() == 2); | 9627 ASSERT(args.length() == 2); |
9627 CONVERT_CHECKED(JSArray, array, args[0]); | 9628 CONVERT_ARG_CHECKED(JSArray, array, 0); |
9628 CONVERT_CHECKED(JSObject, element, args[1]); | 9629 CONVERT_ARG_CHECKED(JSObject, element, 1); |
9629 RUNTIME_ASSERT(array->HasFastElements() || array->HasFastSmiOnlyElements()); | 9630 RUNTIME_ASSERT(array->HasFastElements() || array->HasFastSmiOnlyElements()); |
9630 int length = Smi::cast(array->length())->value(); | 9631 int length = Smi::cast(array->length())->value(); |
9631 FixedArray* elements = FixedArray::cast(array->elements()); | 9632 FixedArray* elements = FixedArray::cast(array->elements()); |
9632 for (int i = 0; i < length; i++) { | 9633 for (int i = 0; i < length; i++) { |
9633 if (elements->get(i) == element) return isolate->heap()->false_value(); | 9634 if (elements->get(i) == element) return isolate->heap()->false_value(); |
9634 } | 9635 } |
9635 Object* obj; | 9636 Object* obj; |
9636 // Strict not needed. Used for cycle detection in Array join implementation. | 9637 // Strict not needed. Used for cycle detection in Array join implementation. |
9637 { MaybeObject* maybe_obj = | 9638 { MaybeObject* maybe_obj = |
9638 array->SetFastElement(length, element, kNonStrictMode, true); | 9639 array->SetFastElement(length, element, kNonStrictMode, true); |
(...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10109 /** | 10110 /** |
10110 * Array::concat implementation. | 10111 * Array::concat implementation. |
10111 * See ECMAScript 262, 15.4.4.4. | 10112 * See ECMAScript 262, 15.4.4.4. |
10112 * TODO(581): Fix non-compliance for very large concatenations and update to | 10113 * TODO(581): Fix non-compliance for very large concatenations and update to |
10113 * following the ECMAScript 5 specification. | 10114 * following the ECMAScript 5 specification. |
10114 */ | 10115 */ |
10115 RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayConcat) { | 10116 RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayConcat) { |
10116 ASSERT(args.length() == 1); | 10117 ASSERT(args.length() == 1); |
10117 HandleScope handle_scope(isolate); | 10118 HandleScope handle_scope(isolate); |
10118 | 10119 |
10119 CONVERT_ARG_CHECKED(JSArray, arguments, 0); | 10120 CONVERT_ARG_HANDLE_CHECKED(JSArray, arguments, 0); |
10120 int argument_count = static_cast<int>(arguments->length()->Number()); | 10121 int argument_count = static_cast<int>(arguments->length()->Number()); |
10121 RUNTIME_ASSERT(arguments->HasFastElements()); | 10122 RUNTIME_ASSERT(arguments->HasFastElements()); |
10122 Handle<FixedArray> elements(FixedArray::cast(arguments->elements())); | 10123 Handle<FixedArray> elements(FixedArray::cast(arguments->elements())); |
10123 | 10124 |
10124 // Pass 1: estimate the length and number of elements of the result. | 10125 // Pass 1: estimate the length and number of elements of the result. |
10125 // The actual length can be larger if any of the arguments have getters | 10126 // The actual length can be larger if any of the arguments have getters |
10126 // that mutate other arguments (but will otherwise be precise). | 10127 // that mutate other arguments (but will otherwise be precise). |
10127 // The number of elements is precise if there are no inherited elements. | 10128 // The number of elements is precise if there are no inherited elements. |
10128 | 10129 |
10129 uint32_t estimate_result_length = 0; | 10130 uint32_t estimate_result_length = 0; |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10204 return *visitor.ToArray(); | 10205 return *visitor.ToArray(); |
10205 } | 10206 } |
10206 | 10207 |
10207 | 10208 |
10208 // This will not allocate (flatten the string), but it may run | 10209 // This will not allocate (flatten the string), but it may run |
10209 // very slowly for very deeply nested ConsStrings. For debugging use only. | 10210 // very slowly for very deeply nested ConsStrings. For debugging use only. |
10210 RUNTIME_FUNCTION(MaybeObject*, Runtime_GlobalPrint) { | 10211 RUNTIME_FUNCTION(MaybeObject*, Runtime_GlobalPrint) { |
10211 NoHandleAllocation ha; | 10212 NoHandleAllocation ha; |
10212 ASSERT(args.length() == 1); | 10213 ASSERT(args.length() == 1); |
10213 | 10214 |
10214 CONVERT_CHECKED(String, string, args[0]); | 10215 CONVERT_ARG_CHECKED(String, string, 0); |
10215 StringInputBuffer buffer(string); | 10216 StringInputBuffer buffer(string); |
10216 while (buffer.has_more()) { | 10217 while (buffer.has_more()) { |
10217 uint16_t character = buffer.GetNext(); | 10218 uint16_t character = buffer.GetNext(); |
10218 PrintF("%c", character); | 10219 PrintF("%c", character); |
10219 } | 10220 } |
10220 return string; | 10221 return string; |
10221 } | 10222 } |
10222 | 10223 |
10223 // Moves all own elements of an object, that are below a limit, to positions | 10224 // Moves all own elements of an object, that are below a limit, to positions |
10224 // starting at zero. All undefined values are placed after non-undefined values, | 10225 // starting at zero. All undefined values are placed after non-undefined values, |
10225 // and are followed by non-existing element. Does not change the length | 10226 // and are followed by non-existing element. Does not change the length |
10226 // property. | 10227 // property. |
10227 // Returns the number of non-undefined elements collected. | 10228 // Returns the number of non-undefined elements collected. |
10228 RUNTIME_FUNCTION(MaybeObject*, Runtime_RemoveArrayHoles) { | 10229 RUNTIME_FUNCTION(MaybeObject*, Runtime_RemoveArrayHoles) { |
10229 ASSERT(args.length() == 2); | 10230 ASSERT(args.length() == 2); |
10230 CONVERT_CHECKED(JSObject, object, args[0]); | 10231 CONVERT_ARG_CHECKED(JSObject, object, 0); |
10231 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]); | 10232 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]); |
10232 return object->PrepareElementsForSort(limit); | 10233 return object->PrepareElementsForSort(limit); |
10233 } | 10234 } |
10234 | 10235 |
10235 | 10236 |
10236 // Move contents of argument 0 (an array) to argument 1 (an array) | 10237 // Move contents of argument 0 (an array) to argument 1 (an array) |
10237 RUNTIME_FUNCTION(MaybeObject*, Runtime_MoveArrayContents) { | 10238 RUNTIME_FUNCTION(MaybeObject*, Runtime_MoveArrayContents) { |
10238 ASSERT(args.length() == 2); | 10239 ASSERT(args.length() == 2); |
10239 CONVERT_CHECKED(JSArray, from, args[0]); | 10240 CONVERT_ARG_CHECKED(JSArray, from, 0); |
10240 CONVERT_CHECKED(JSArray, to, args[1]); | 10241 CONVERT_ARG_CHECKED(JSArray, to, 1); |
10241 FixedArrayBase* new_elements = from->elements(); | 10242 FixedArrayBase* new_elements = from->elements(); |
10242 MaybeObject* maybe_new_map; | 10243 MaybeObject* maybe_new_map; |
10243 ElementsKind elements_kind; | 10244 ElementsKind elements_kind; |
10244 if (new_elements->map() == isolate->heap()->fixed_array_map() || | 10245 if (new_elements->map() == isolate->heap()->fixed_array_map() || |
10245 new_elements->map() == isolate->heap()->fixed_cow_array_map()) { | 10246 new_elements->map() == isolate->heap()->fixed_cow_array_map()) { |
10246 elements_kind = FAST_ELEMENTS; | 10247 elements_kind = FAST_ELEMENTS; |
10247 } else if (new_elements->map() == | 10248 } else if (new_elements->map() == |
10248 isolate->heap()->fixed_double_array_map()) { | 10249 isolate->heap()->fixed_double_array_map()) { |
10249 elements_kind = FAST_DOUBLE_ELEMENTS; | 10250 elements_kind = FAST_DOUBLE_ELEMENTS; |
10250 } else { | 10251 } else { |
(...skipping 10 matching lines...) Expand all Loading... |
10261 if (!maybe_obj->ToObject(&obj)) return maybe_obj; | 10262 if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
10262 } | 10263 } |
10263 from->set_length(Smi::FromInt(0)); | 10264 from->set_length(Smi::FromInt(0)); |
10264 return to; | 10265 return to; |
10265 } | 10266 } |
10266 | 10267 |
10267 | 10268 |
10268 // How many elements does this object/array have? | 10269 // How many elements does this object/array have? |
10269 RUNTIME_FUNCTION(MaybeObject*, Runtime_EstimateNumberOfElements) { | 10270 RUNTIME_FUNCTION(MaybeObject*, Runtime_EstimateNumberOfElements) { |
10270 ASSERT(args.length() == 1); | 10271 ASSERT(args.length() == 1); |
10271 CONVERT_CHECKED(JSObject, object, args[0]); | 10272 CONVERT_ARG_CHECKED(JSObject, object, 0); |
10272 HeapObject* elements = object->elements(); | 10273 HeapObject* elements = object->elements(); |
10273 if (elements->IsDictionary()) { | 10274 if (elements->IsDictionary()) { |
10274 int result = SeededNumberDictionary::cast(elements)->NumberOfElements(); | 10275 int result = SeededNumberDictionary::cast(elements)->NumberOfElements(); |
10275 return Smi::FromInt(result); | 10276 return Smi::FromInt(result); |
10276 } else if (object->IsJSArray()) { | 10277 } else if (object->IsJSArray()) { |
10277 return JSArray::cast(object)->length(); | 10278 return JSArray::cast(object)->length(); |
10278 } else { | 10279 } else { |
10279 return Smi::FromInt(FixedArray::cast(elements)->length()); | 10280 return Smi::FromInt(FixedArray::cast(elements)->length()); |
10280 } | 10281 } |
10281 } | 10282 } |
10282 | 10283 |
10283 | 10284 |
10284 RUNTIME_FUNCTION(MaybeObject*, Runtime_SwapElements) { | 10285 RUNTIME_FUNCTION(MaybeObject*, Runtime_SwapElements) { |
10285 HandleScope handle_scope(isolate); | 10286 HandleScope handle_scope(isolate); |
10286 | 10287 |
10287 ASSERT_EQ(3, args.length()); | 10288 ASSERT_EQ(3, args.length()); |
10288 | 10289 |
10289 CONVERT_ARG_CHECKED(JSObject, object, 0); | 10290 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
10290 Handle<Object> key1 = args.at<Object>(1); | 10291 Handle<Object> key1 = args.at<Object>(1); |
10291 Handle<Object> key2 = args.at<Object>(2); | 10292 Handle<Object> key2 = args.at<Object>(2); |
10292 | 10293 |
10293 uint32_t index1, index2; | 10294 uint32_t index1, index2; |
10294 if (!key1->ToArrayIndex(&index1) | 10295 if (!key1->ToArrayIndex(&index1) |
10295 || !key2->ToArrayIndex(&index2)) { | 10296 || !key2->ToArrayIndex(&index2)) { |
10296 return isolate->ThrowIllegalOperation(); | 10297 return isolate->ThrowIllegalOperation(); |
10297 } | 10298 } |
10298 | 10299 |
10299 Handle<JSObject> jsobject = Handle<JSObject>::cast(object); | 10300 Handle<JSObject> jsobject = Handle<JSObject>::cast(object); |
(...skipping 12 matching lines...) Expand all Loading... |
10312 | 10313 |
10313 | 10314 |
10314 // Returns an array that tells you where in the [0, length) interval an array | 10315 // Returns an array that tells you where in the [0, length) interval an array |
10315 // might have elements. Can either return keys (positive integers) or | 10316 // might have elements. Can either return keys (positive integers) or |
10316 // intervals (pair of a negative integer (-start-1) followed by a | 10317 // intervals (pair of a negative integer (-start-1) followed by a |
10317 // positive (length)) or undefined values. | 10318 // positive (length)) or undefined values. |
10318 // Intervals can span over some keys that are not in the object. | 10319 // Intervals can span over some keys that are not in the object. |
10319 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetArrayKeys) { | 10320 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetArrayKeys) { |
10320 ASSERT(args.length() == 2); | 10321 ASSERT(args.length() == 2); |
10321 HandleScope scope(isolate); | 10322 HandleScope scope(isolate); |
10322 CONVERT_ARG_CHECKED(JSObject, array, 0); | 10323 CONVERT_ARG_HANDLE_CHECKED(JSObject, array, 0); |
10323 CONVERT_NUMBER_CHECKED(uint32_t, length, Uint32, args[1]); | 10324 CONVERT_NUMBER_CHECKED(uint32_t, length, Uint32, args[1]); |
10324 if (array->elements()->IsDictionary()) { | 10325 if (array->elements()->IsDictionary()) { |
10325 // Create an array and get all the keys into it, then remove all the | 10326 // Create an array and get all the keys into it, then remove all the |
10326 // keys that are not integers in the range 0 to length-1. | 10327 // keys that are not integers in the range 0 to length-1. |
10327 bool threw = false; | 10328 bool threw = false; |
10328 Handle<FixedArray> keys = | 10329 Handle<FixedArray> keys = |
10329 GetKeysInFixedArrayFor(array, INCLUDE_PROTOS, &threw); | 10330 GetKeysInFixedArrayFor(array, INCLUDE_PROTOS, &threw); |
10330 if (threw) return Failure::Exception(); | 10331 if (threw) return Failure::Exception(); |
10331 | 10332 |
10332 int keys_length = keys->length(); | 10333 int keys_length = keys->length(); |
(...skipping 28 matching lines...) Expand all Loading... |
10361 // DefineAccessor takes an optional final argument which is the | 10362 // DefineAccessor takes an optional final argument which is the |
10362 // property attributes (e.g. DONT_ENUM, DONT_DELETE). IMPORTANT: due | 10363 // property attributes (e.g. DONT_ENUM, DONT_DELETE). IMPORTANT: due |
10363 // to the way accessors are implemented, it is set for both the getter | 10364 // to the way accessors are implemented, it is set for both the getter |
10364 // and setter on the first call to DefineAccessor and ignored on | 10365 // and setter on the first call to DefineAccessor and ignored on |
10365 // subsequent calls. | 10366 // subsequent calls. |
10366 RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineAccessor) { | 10367 RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineAccessor) { |
10367 RUNTIME_ASSERT(args.length() == 4 || args.length() == 5); | 10368 RUNTIME_ASSERT(args.length() == 4 || args.length() == 5); |
10368 // Compute attributes. | 10369 // Compute attributes. |
10369 PropertyAttributes attributes = NONE; | 10370 PropertyAttributes attributes = NONE; |
10370 if (args.length() == 5) { | 10371 if (args.length() == 5) { |
10371 CONVERT_CHECKED(Smi, attrs, args[4]); | 10372 CONVERT_SMI_ARG_CHECKED(value, 4); |
10372 int value = attrs->value(); | |
10373 // Only attribute bits should be set. | 10373 // Only attribute bits should be set. |
10374 ASSERT((value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); | 10374 ASSERT((value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); |
10375 attributes = static_cast<PropertyAttributes>(value); | 10375 attributes = static_cast<PropertyAttributes>(value); |
10376 } | 10376 } |
10377 | 10377 |
10378 CONVERT_CHECKED(JSObject, obj, args[0]); | 10378 CONVERT_ARG_CHECKED(JSObject, obj, 0); |
10379 CONVERT_CHECKED(String, name, args[1]); | 10379 CONVERT_ARG_CHECKED(String, name, 1); |
10380 CONVERT_CHECKED(Smi, flag, args[2]); | 10380 CONVERT_SMI_ARG_CHECKED(flag, 2); |
10381 CONVERT_CHECKED(JSFunction, fun, args[3]); | 10381 CONVERT_ARG_CHECKED(JSFunction, fun, 3); |
10382 return obj->DefineAccessor(name, flag->value() == 0, fun, attributes); | 10382 return obj->DefineAccessor(name, flag == 0, fun, attributes); |
10383 } | 10383 } |
10384 | 10384 |
10385 | 10385 |
10386 RUNTIME_FUNCTION(MaybeObject*, Runtime_LookupAccessor) { | 10386 RUNTIME_FUNCTION(MaybeObject*, Runtime_LookupAccessor) { |
10387 ASSERT(args.length() == 3); | 10387 ASSERT(args.length() == 3); |
10388 CONVERT_CHECKED(JSObject, obj, args[0]); | 10388 CONVERT_ARG_CHECKED(JSObject, obj, 0); |
10389 CONVERT_CHECKED(String, name, args[1]); | 10389 CONVERT_ARG_CHECKED(String, name, 1); |
10390 CONVERT_CHECKED(Smi, flag, args[2]); | 10390 CONVERT_SMI_ARG_CHECKED(flag, 2); |
10391 return obj->LookupAccessor(name, flag->value() == 0); | 10391 return obj->LookupAccessor(name, flag == 0); |
10392 } | 10392 } |
10393 | 10393 |
10394 | 10394 |
10395 #ifdef ENABLE_DEBUGGER_SUPPORT | 10395 #ifdef ENABLE_DEBUGGER_SUPPORT |
10396 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugBreak) { | 10396 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugBreak) { |
10397 ASSERT(args.length() == 0); | 10397 ASSERT(args.length() == 0); |
10398 return Execution::DebugBreakHelper(); | 10398 return Execution::DebugBreakHelper(); |
10399 } | 10399 } |
10400 | 10400 |
10401 | 10401 |
10402 // Helper functions for wrapping and unwrapping stack frame ids. | 10402 // Helper functions for wrapping and unwrapping stack frame ids. |
10403 static Smi* WrapFrameId(StackFrame::Id id) { | 10403 static Smi* WrapFrameId(StackFrame::Id id) { |
10404 ASSERT(IsAligned(OffsetFrom(id), static_cast<intptr_t>(4))); | 10404 ASSERT(IsAligned(OffsetFrom(id), static_cast<intptr_t>(4))); |
10405 return Smi::FromInt(id >> 2); | 10405 return Smi::FromInt(id >> 2); |
10406 } | 10406 } |
10407 | 10407 |
10408 | 10408 |
10409 static StackFrame::Id UnwrapFrameId(Smi* wrapped) { | 10409 static StackFrame::Id UnwrapFrameId(int wrapped) { |
10410 return static_cast<StackFrame::Id>(wrapped->value() << 2); | 10410 return static_cast<StackFrame::Id>(wrapped << 2); |
10411 } | 10411 } |
10412 | 10412 |
10413 | 10413 |
10414 // Adds a JavaScript function as a debug event listener. | 10414 // Adds a JavaScript function as a debug event listener. |
10415 // args[0]: debug event listener function to set or null or undefined for | 10415 // args[0]: debug event listener function to set or null or undefined for |
10416 // clearing the event listener function | 10416 // clearing the event listener function |
10417 // args[1]: object supplied during callback | 10417 // args[1]: object supplied during callback |
10418 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetDebugEventListener) { | 10418 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetDebugEventListener) { |
10419 ASSERT(args.length() == 2); | 10419 ASSERT(args.length() == 2); |
10420 RUNTIME_ASSERT(args[0]->IsJSFunction() || | 10420 RUNTIME_ASSERT(args[0]->IsJSFunction() || |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10503 // 2: Property value is exception | 10503 // 2: Property value is exception |
10504 // 3: Getter function if defined | 10504 // 3: Getter function if defined |
10505 // 4: Setter function if defined | 10505 // 4: Setter function if defined |
10506 // Items 2-4 are only filled if the property has either a getter or a setter | 10506 // Items 2-4 are only filled if the property has either a getter or a setter |
10507 // defined through __defineGetter__ and/or __defineSetter__. | 10507 // defined through __defineGetter__ and/or __defineSetter__. |
10508 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetPropertyDetails) { | 10508 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetPropertyDetails) { |
10509 HandleScope scope(isolate); | 10509 HandleScope scope(isolate); |
10510 | 10510 |
10511 ASSERT(args.length() == 2); | 10511 ASSERT(args.length() == 2); |
10512 | 10512 |
10513 CONVERT_ARG_CHECKED(JSObject, obj, 0); | 10513 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
10514 CONVERT_ARG_CHECKED(String, name, 1); | 10514 CONVERT_ARG_HANDLE_CHECKED(String, name, 1); |
10515 | 10515 |
10516 // Make sure to set the current context to the context before the debugger was | 10516 // Make sure to set the current context to the context before the debugger was |
10517 // entered (if the debugger is entered). The reason for switching context here | 10517 // entered (if the debugger is entered). The reason for switching context here |
10518 // is that for some property lookups (accessors and interceptors) callbacks | 10518 // is that for some property lookups (accessors and interceptors) callbacks |
10519 // into the embedding application can occour, and the embedding application | 10519 // into the embedding application can occour, and the embedding application |
10520 // could have the assumption that its own global context is the current | 10520 // could have the assumption that its own global context is the current |
10521 // context and not some internal debugger context. | 10521 // context and not some internal debugger context. |
10522 SaveContext save(isolate); | 10522 SaveContext save(isolate); |
10523 if (isolate->debug()->InDebugger()) { | 10523 if (isolate->debug()->InDebugger()) { |
10524 isolate->set_context(*isolate->debug()->debugger_entry()->GetContext()); | 10524 isolate->set_context(*isolate->debug()->debugger_entry()->GetContext()); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10601 | 10601 |
10602 return isolate->heap()->undefined_value(); | 10602 return isolate->heap()->undefined_value(); |
10603 } | 10603 } |
10604 | 10604 |
10605 | 10605 |
10606 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetProperty) { | 10606 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetProperty) { |
10607 HandleScope scope(isolate); | 10607 HandleScope scope(isolate); |
10608 | 10608 |
10609 ASSERT(args.length() == 2); | 10609 ASSERT(args.length() == 2); |
10610 | 10610 |
10611 CONVERT_ARG_CHECKED(JSObject, obj, 0); | 10611 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
10612 CONVERT_ARG_CHECKED(String, name, 1); | 10612 CONVERT_ARG_HANDLE_CHECKED(String, name, 1); |
10613 | 10613 |
10614 LookupResult result(isolate); | 10614 LookupResult result(isolate); |
10615 obj->Lookup(*name, &result); | 10615 obj->Lookup(*name, &result); |
10616 if (result.IsProperty()) { | 10616 if (result.IsProperty()) { |
10617 return DebugLookupResultValue(isolate->heap(), *obj, *name, &result, NULL); | 10617 return DebugLookupResultValue(isolate->heap(), *obj, *name, &result, NULL); |
10618 } | 10618 } |
10619 return isolate->heap()->undefined_value(); | 10619 return isolate->heap()->undefined_value(); |
10620 } | 10620 } |
10621 | 10621 |
10622 | 10622 |
10623 // Return the property type calculated from the property details. | 10623 // Return the property type calculated from the property details. |
10624 // args[0]: smi with property details. | 10624 // args[0]: smi with property details. |
10625 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyTypeFromDetails) { | 10625 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyTypeFromDetails) { |
10626 ASSERT(args.length() == 1); | 10626 ASSERT(args.length() == 1); |
10627 CONVERT_CHECKED(Smi, details, args[0]); | 10627 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0); |
10628 PropertyType type = PropertyDetails(details).type(); | 10628 return Smi::FromInt(static_cast<int>(details.type())); |
10629 return Smi::FromInt(static_cast<int>(type)); | |
10630 } | 10629 } |
10631 | 10630 |
10632 | 10631 |
10633 // Return the property attribute calculated from the property details. | 10632 // Return the property attribute calculated from the property details. |
10634 // args[0]: smi with property details. | 10633 // args[0]: smi with property details. |
10635 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyAttributesFromDetails) { | 10634 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyAttributesFromDetails) { |
10636 ASSERT(args.length() == 1); | 10635 ASSERT(args.length() == 1); |
10637 CONVERT_CHECKED(Smi, details, args[0]); | 10636 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0); |
10638 PropertyAttributes attributes = PropertyDetails(details).attributes(); | 10637 return Smi::FromInt(static_cast<int>(details.attributes())); |
10639 return Smi::FromInt(static_cast<int>(attributes)); | |
10640 } | 10638 } |
10641 | 10639 |
10642 | 10640 |
10643 // Return the property insertion index calculated from the property details. | 10641 // Return the property insertion index calculated from the property details. |
10644 // args[0]: smi with property details. | 10642 // args[0]: smi with property details. |
10645 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyIndexFromDetails) { | 10643 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyIndexFromDetails) { |
10646 ASSERT(args.length() == 1); | 10644 ASSERT(args.length() == 1); |
10647 CONVERT_CHECKED(Smi, details, args[0]); | 10645 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0); |
10648 int index = PropertyDetails(details).index(); | 10646 return Smi::FromInt(details.index()); |
10649 return Smi::FromInt(index); | |
10650 } | 10647 } |
10651 | 10648 |
10652 | 10649 |
10653 // Return property value from named interceptor. | 10650 // Return property value from named interceptor. |
10654 // args[0]: object | 10651 // args[0]: object |
10655 // args[1]: property name | 10652 // args[1]: property name |
10656 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugNamedInterceptorPropertyValue) { | 10653 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugNamedInterceptorPropertyValue) { |
10657 HandleScope scope(isolate); | 10654 HandleScope scope(isolate); |
10658 ASSERT(args.length() == 2); | 10655 ASSERT(args.length() == 2); |
10659 CONVERT_ARG_CHECKED(JSObject, obj, 0); | 10656 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
10660 RUNTIME_ASSERT(obj->HasNamedInterceptor()); | 10657 RUNTIME_ASSERT(obj->HasNamedInterceptor()); |
10661 CONVERT_ARG_CHECKED(String, name, 1); | 10658 CONVERT_ARG_HANDLE_CHECKED(String, name, 1); |
10662 | 10659 |
10663 PropertyAttributes attributes; | 10660 PropertyAttributes attributes; |
10664 return obj->GetPropertyWithInterceptor(*obj, *name, &attributes); | 10661 return obj->GetPropertyWithInterceptor(*obj, *name, &attributes); |
10665 } | 10662 } |
10666 | 10663 |
10667 | 10664 |
10668 // Return element value from indexed interceptor. | 10665 // Return element value from indexed interceptor. |
10669 // args[0]: object | 10666 // args[0]: object |
10670 // args[1]: index | 10667 // args[1]: index |
10671 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugIndexedInterceptorElementValue) { | 10668 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugIndexedInterceptorElementValue) { |
10672 HandleScope scope(isolate); | 10669 HandleScope scope(isolate); |
10673 ASSERT(args.length() == 2); | 10670 ASSERT(args.length() == 2); |
10674 CONVERT_ARG_CHECKED(JSObject, obj, 0); | 10671 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
10675 RUNTIME_ASSERT(obj->HasIndexedInterceptor()); | 10672 RUNTIME_ASSERT(obj->HasIndexedInterceptor()); |
10676 CONVERT_NUMBER_CHECKED(uint32_t, index, Uint32, args[1]); | 10673 CONVERT_NUMBER_CHECKED(uint32_t, index, Uint32, args[1]); |
10677 | 10674 |
10678 return obj->GetElementWithInterceptor(*obj, index); | 10675 return obj->GetElementWithInterceptor(*obj, index); |
10679 } | 10676 } |
10680 | 10677 |
10681 | 10678 |
10682 RUNTIME_FUNCTION(MaybeObject*, Runtime_CheckExecutionState) { | 10679 RUNTIME_FUNCTION(MaybeObject*, Runtime_CheckExecutionState) { |
10683 ASSERT(args.length() >= 1); | 10680 ASSERT(args.length() >= 1); |
10684 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); | 10681 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); |
(...skipping 915 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11600 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeCount) { | 11597 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeCount) { |
11601 HandleScope scope(isolate); | 11598 HandleScope scope(isolate); |
11602 ASSERT(args.length() == 2); | 11599 ASSERT(args.length() == 2); |
11603 | 11600 |
11604 // Check arguments. | 11601 // Check arguments. |
11605 Object* check; | 11602 Object* check; |
11606 { MaybeObject* maybe_check = Runtime_CheckExecutionState( | 11603 { MaybeObject* maybe_check = Runtime_CheckExecutionState( |
11607 RUNTIME_ARGUMENTS(isolate, args)); | 11604 RUNTIME_ARGUMENTS(isolate, args)); |
11608 if (!maybe_check->ToObject(&check)) return maybe_check; | 11605 if (!maybe_check->ToObject(&check)) return maybe_check; |
11609 } | 11606 } |
11610 CONVERT_CHECKED(Smi, wrapped_id, args[1]); | 11607 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); |
11611 | 11608 |
11612 // Get the frame where the debugging is performed. | 11609 // Get the frame where the debugging is performed. |
11613 StackFrame::Id id = UnwrapFrameId(wrapped_id); | 11610 StackFrame::Id id = UnwrapFrameId(wrapped_id); |
11614 JavaScriptFrameIterator it(isolate, id); | 11611 JavaScriptFrameIterator it(isolate, id); |
11615 JavaScriptFrame* frame = it.frame(); | 11612 JavaScriptFrame* frame = it.frame(); |
11616 | 11613 |
11617 // Count the visible scopes. | 11614 // Count the visible scopes. |
11618 int n = 0; | 11615 int n = 0; |
11619 for (ScopeIterator it(isolate, frame, 0); | 11616 for (ScopeIterator it(isolate, frame, 0); |
11620 !it.Done(); | 11617 !it.Done(); |
(...skipping 21 matching lines...) Expand all Loading... |
11642 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeDetails) { | 11639 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeDetails) { |
11643 HandleScope scope(isolate); | 11640 HandleScope scope(isolate); |
11644 ASSERT(args.length() == 4); | 11641 ASSERT(args.length() == 4); |
11645 | 11642 |
11646 // Check arguments. | 11643 // Check arguments. |
11647 Object* check; | 11644 Object* check; |
11648 { MaybeObject* maybe_check = Runtime_CheckExecutionState( | 11645 { MaybeObject* maybe_check = Runtime_CheckExecutionState( |
11649 RUNTIME_ARGUMENTS(isolate, args)); | 11646 RUNTIME_ARGUMENTS(isolate, args)); |
11650 if (!maybe_check->ToObject(&check)) return maybe_check; | 11647 if (!maybe_check->ToObject(&check)) return maybe_check; |
11651 } | 11648 } |
11652 CONVERT_CHECKED(Smi, wrapped_id, args[1]); | 11649 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); |
11653 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]); | 11650 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]); |
11654 CONVERT_NUMBER_CHECKED(int, index, Int32, args[3]); | 11651 CONVERT_NUMBER_CHECKED(int, index, Int32, args[3]); |
11655 | 11652 |
11656 // Get the frame where the debugging is performed. | 11653 // Get the frame where the debugging is performed. |
11657 StackFrame::Id id = UnwrapFrameId(wrapped_id); | 11654 StackFrame::Id id = UnwrapFrameId(wrapped_id); |
11658 JavaScriptFrameIterator frame_it(isolate, id); | 11655 JavaScriptFrameIterator frame_it(isolate, id); |
11659 JavaScriptFrame* frame = frame_it.frame(); | 11656 JavaScriptFrame* frame = frame_it.frame(); |
11660 | 11657 |
11661 // Find the requested scope. | 11658 // Find the requested scope. |
11662 int n = 0; | 11659 int n = 0; |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11782 // Convert to JS array and return. | 11779 // Convert to JS array and return. |
11783 return *isolate->factory()->NewJSArrayWithElements(details); | 11780 return *isolate->factory()->NewJSArrayWithElements(details); |
11784 } | 11781 } |
11785 | 11782 |
11786 | 11783 |
11787 // Sets the disable break state | 11784 // Sets the disable break state |
11788 // args[0]: disable break state | 11785 // args[0]: disable break state |
11789 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetDisableBreak) { | 11786 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetDisableBreak) { |
11790 HandleScope scope(isolate); | 11787 HandleScope scope(isolate); |
11791 ASSERT(args.length() == 1); | 11788 ASSERT(args.length() == 1); |
11792 CONVERT_BOOLEAN_CHECKED(disable_break, args[0]); | 11789 CONVERT_BOOLEAN_ARG_CHECKED(disable_break, 0); |
11793 isolate->debug()->set_disable_break(disable_break); | 11790 isolate->debug()->set_disable_break(disable_break); |
11794 return isolate->heap()->undefined_value(); | 11791 return isolate->heap()->undefined_value(); |
11795 } | 11792 } |
11796 | 11793 |
11797 | 11794 |
11798 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetBreakLocations) { | 11795 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetBreakLocations) { |
11799 HandleScope scope(isolate); | 11796 HandleScope scope(isolate); |
11800 ASSERT(args.length() == 1); | 11797 ASSERT(args.length() == 1); |
11801 | 11798 |
11802 CONVERT_ARG_CHECKED(JSFunction, fun, 0); | 11799 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); |
11803 Handle<SharedFunctionInfo> shared(fun->shared()); | 11800 Handle<SharedFunctionInfo> shared(fun->shared()); |
11804 // Find the number of break points | 11801 // Find the number of break points |
11805 Handle<Object> break_locations = Debug::GetSourceBreakLocations(shared); | 11802 Handle<Object> break_locations = Debug::GetSourceBreakLocations(shared); |
11806 if (break_locations->IsUndefined()) return isolate->heap()->undefined_value(); | 11803 if (break_locations->IsUndefined()) return isolate->heap()->undefined_value(); |
11807 // Return array as JS array | 11804 // Return array as JS array |
11808 return *isolate->factory()->NewJSArrayWithElements( | 11805 return *isolate->factory()->NewJSArrayWithElements( |
11809 Handle<FixedArray>::cast(break_locations)); | 11806 Handle<FixedArray>::cast(break_locations)); |
11810 } | 11807 } |
11811 | 11808 |
11812 | 11809 |
11813 // Set a break point in a function | 11810 // Set a break point in a function |
11814 // args[0]: function | 11811 // args[0]: function |
11815 // args[1]: number: break source position (within the function source) | 11812 // args[1]: number: break source position (within the function source) |
11816 // args[2]: number: break point object | 11813 // args[2]: number: break point object |
11817 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetFunctionBreakPoint) { | 11814 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetFunctionBreakPoint) { |
11818 HandleScope scope(isolate); | 11815 HandleScope scope(isolate); |
11819 ASSERT(args.length() == 3); | 11816 ASSERT(args.length() == 3); |
11820 CONVERT_ARG_CHECKED(JSFunction, fun, 0); | 11817 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); |
11821 Handle<SharedFunctionInfo> shared(fun->shared()); | 11818 Handle<SharedFunctionInfo> shared(fun->shared()); |
11822 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); | 11819 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); |
11823 RUNTIME_ASSERT(source_position >= 0); | 11820 RUNTIME_ASSERT(source_position >= 0); |
11824 Handle<Object> break_point_object_arg = args.at<Object>(2); | 11821 Handle<Object> break_point_object_arg = args.at<Object>(2); |
11825 | 11822 |
11826 // Set break point. | 11823 // Set break point. |
11827 isolate->debug()->SetBreakPoint(shared, break_point_object_arg, | 11824 isolate->debug()->SetBreakPoint(shared, break_point_object_arg, |
11828 &source_position); | 11825 &source_position); |
11829 | 11826 |
11830 return Smi::FromInt(source_position); | 11827 return Smi::FromInt(source_position); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11916 | 11913 |
11917 // Changes the state of a break point in a script and returns source position | 11914 // Changes the state of a break point in a script and returns source position |
11918 // where break point was set. NOTE: Regarding performance see the NOTE for | 11915 // where break point was set. NOTE: Regarding performance see the NOTE for |
11919 // GetScriptFromScriptData. | 11916 // GetScriptFromScriptData. |
11920 // args[0]: script to set break point in | 11917 // args[0]: script to set break point in |
11921 // args[1]: number: break source position (within the script source) | 11918 // args[1]: number: break source position (within the script source) |
11922 // args[2]: number: break point object | 11919 // args[2]: number: break point object |
11923 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetScriptBreakPoint) { | 11920 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetScriptBreakPoint) { |
11924 HandleScope scope(isolate); | 11921 HandleScope scope(isolate); |
11925 ASSERT(args.length() == 3); | 11922 ASSERT(args.length() == 3); |
11926 CONVERT_ARG_CHECKED(JSValue, wrapper, 0); | 11923 CONVERT_ARG_HANDLE_CHECKED(JSValue, wrapper, 0); |
11927 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); | 11924 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); |
11928 RUNTIME_ASSERT(source_position >= 0); | 11925 RUNTIME_ASSERT(source_position >= 0); |
11929 Handle<Object> break_point_object_arg = args.at<Object>(2); | 11926 Handle<Object> break_point_object_arg = args.at<Object>(2); |
11930 | 11927 |
11931 // Get the script from the script wrapper. | 11928 // Get the script from the script wrapper. |
11932 RUNTIME_ASSERT(wrapper->value()->IsScript()); | 11929 RUNTIME_ASSERT(wrapper->value()->IsScript()); |
11933 Handle<Script> script(Script::cast(wrapper->value())); | 11930 Handle<Script> script(Script::cast(wrapper->value())); |
11934 | 11931 |
11935 Object* result = Runtime::FindSharedFunctionInfoInScript( | 11932 Object* result = Runtime::FindSharedFunctionInfoInScript( |
11936 isolate, script, source_position); | 11933 isolate, script, source_position); |
(...skipping 29 matching lines...) Expand all Loading... |
11966 } | 11963 } |
11967 | 11964 |
11968 | 11965 |
11969 // Change the state of break on exceptions. | 11966 // Change the state of break on exceptions. |
11970 // args[0]: Enum value indicating whether to affect caught/uncaught exceptions. | 11967 // args[0]: Enum value indicating whether to affect caught/uncaught exceptions. |
11971 // args[1]: Boolean indicating on/off. | 11968 // args[1]: Boolean indicating on/off. |
11972 RUNTIME_FUNCTION(MaybeObject*, Runtime_ChangeBreakOnException) { | 11969 RUNTIME_FUNCTION(MaybeObject*, Runtime_ChangeBreakOnException) { |
11973 HandleScope scope(isolate); | 11970 HandleScope scope(isolate); |
11974 ASSERT(args.length() == 2); | 11971 ASSERT(args.length() == 2); |
11975 RUNTIME_ASSERT(args[0]->IsNumber()); | 11972 RUNTIME_ASSERT(args[0]->IsNumber()); |
11976 CONVERT_BOOLEAN_CHECKED(enable, args[1]); | 11973 CONVERT_BOOLEAN_ARG_CHECKED(enable, 1); |
11977 | 11974 |
11978 // If the number doesn't match an enum value, the ChangeBreakOnException | 11975 // If the number doesn't match an enum value, the ChangeBreakOnException |
11979 // function will default to affecting caught exceptions. | 11976 // function will default to affecting caught exceptions. |
11980 ExceptionBreakType type = | 11977 ExceptionBreakType type = |
11981 static_cast<ExceptionBreakType>(NumberToUint32(args[0])); | 11978 static_cast<ExceptionBreakType>(NumberToUint32(args[0])); |
11982 // Update break point state. | 11979 // Update break point state. |
11983 isolate->debug()->ChangeBreakOnException(type, enable); | 11980 isolate->debug()->ChangeBreakOnException(type, enable); |
11984 return isolate->heap()->undefined_value(); | 11981 return isolate->heap()->undefined_value(); |
11985 } | 11982 } |
11986 | 11983 |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12181 // Check the execution state and decode arguments frame and source to be | 12178 // Check the execution state and decode arguments frame and source to be |
12182 // evaluated. | 12179 // evaluated. |
12183 ASSERT(args.length() == 6); | 12180 ASSERT(args.length() == 6); |
12184 Object* check_result; | 12181 Object* check_result; |
12185 { MaybeObject* maybe_check_result = Runtime_CheckExecutionState( | 12182 { MaybeObject* maybe_check_result = Runtime_CheckExecutionState( |
12186 RUNTIME_ARGUMENTS(isolate, args)); | 12183 RUNTIME_ARGUMENTS(isolate, args)); |
12187 if (!maybe_check_result->ToObject(&check_result)) { | 12184 if (!maybe_check_result->ToObject(&check_result)) { |
12188 return maybe_check_result; | 12185 return maybe_check_result; |
12189 } | 12186 } |
12190 } | 12187 } |
12191 CONVERT_CHECKED(Smi, wrapped_id, args[1]); | 12188 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); |
12192 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]); | 12189 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]); |
12193 CONVERT_ARG_CHECKED(String, source, 3); | 12190 CONVERT_ARG_HANDLE_CHECKED(String, source, 3); |
12194 CONVERT_BOOLEAN_CHECKED(disable_break, args[4]); | 12191 CONVERT_BOOLEAN_ARG_CHECKED(disable_break, 4); |
12195 Handle<Object> additional_context(args[5]); | 12192 Handle<Object> additional_context(args[5]); |
12196 | 12193 |
12197 // Handle the processing of break. | 12194 // Handle the processing of break. |
12198 DisableBreak disable_break_save(disable_break); | 12195 DisableBreak disable_break_save(disable_break); |
12199 | 12196 |
12200 // Get the frame where the debugging is performed. | 12197 // Get the frame where the debugging is performed. |
12201 StackFrame::Id id = UnwrapFrameId(wrapped_id); | 12198 StackFrame::Id id = UnwrapFrameId(wrapped_id); |
12202 JavaScriptFrameIterator it(isolate, id); | 12199 JavaScriptFrameIterator it(isolate, id); |
12203 JavaScriptFrame* frame = it.frame(); | 12200 JavaScriptFrame* frame = it.frame(); |
12204 FrameInspector frame_inspector(frame, inlined_jsframe_index, isolate); | 12201 FrameInspector frame_inspector(frame, inlined_jsframe_index, isolate); |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12320 // Check the execution state and decode arguments frame and source to be | 12317 // Check the execution state and decode arguments frame and source to be |
12321 // evaluated. | 12318 // evaluated. |
12322 ASSERT(args.length() == 4); | 12319 ASSERT(args.length() == 4); |
12323 Object* check_result; | 12320 Object* check_result; |
12324 { MaybeObject* maybe_check_result = Runtime_CheckExecutionState( | 12321 { MaybeObject* maybe_check_result = Runtime_CheckExecutionState( |
12325 RUNTIME_ARGUMENTS(isolate, args)); | 12322 RUNTIME_ARGUMENTS(isolate, args)); |
12326 if (!maybe_check_result->ToObject(&check_result)) { | 12323 if (!maybe_check_result->ToObject(&check_result)) { |
12327 return maybe_check_result; | 12324 return maybe_check_result; |
12328 } | 12325 } |
12329 } | 12326 } |
12330 CONVERT_ARG_CHECKED(String, source, 1); | 12327 CONVERT_ARG_HANDLE_CHECKED(String, source, 1); |
12331 CONVERT_BOOLEAN_CHECKED(disable_break, args[2]); | 12328 CONVERT_BOOLEAN_ARG_CHECKED(disable_break, 2); |
12332 Handle<Object> additional_context(args[3]); | 12329 Handle<Object> additional_context(args[3]); |
12333 | 12330 |
12334 // Handle the processing of break. | 12331 // Handle the processing of break. |
12335 DisableBreak disable_break_save(disable_break); | 12332 DisableBreak disable_break_save(disable_break); |
12336 | 12333 |
12337 // Enter the top context from before the debugger was invoked. | 12334 // Enter the top context from before the debugger was invoked. |
12338 SaveContext save(isolate); | 12335 SaveContext save(isolate); |
12339 SaveContext* top = &save; | 12336 SaveContext* top = &save; |
12340 while (top != NULL && *top->context() == *isolate->debug()->debug_context()) { | 12337 while (top != NULL && *top->context() == *isolate->debug()->debug_context()) { |
12341 top = top->prev(); | 12338 top = top->prev(); |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12494 | 12491 |
12495 // First perform a full GC in order to avoid references from dead objects. | 12492 // First perform a full GC in order to avoid references from dead objects. |
12496 isolate->heap()->CollectAllGarbage(Heap::kMakeHeapIterableMask, | 12493 isolate->heap()->CollectAllGarbage(Heap::kMakeHeapIterableMask, |
12497 "%DebugReferencedBy"); | 12494 "%DebugReferencedBy"); |
12498 // The heap iterator reserves the right to do a GC to make the heap iterable. | 12495 // The heap iterator reserves the right to do a GC to make the heap iterable. |
12499 // Due to the GC above we know it won't need to do that, but it seems cleaner | 12496 // Due to the GC above we know it won't need to do that, but it seems cleaner |
12500 // to get the heap iterator constructed before we start having unprotected | 12497 // to get the heap iterator constructed before we start having unprotected |
12501 // Object* locals that are not protected by handles. | 12498 // Object* locals that are not protected by handles. |
12502 | 12499 |
12503 // Check parameters. | 12500 // Check parameters. |
12504 CONVERT_CHECKED(JSObject, target, args[0]); | 12501 CONVERT_ARG_CHECKED(JSObject, target, 0); |
12505 Object* instance_filter = args[1]; | 12502 Object* instance_filter = args[1]; |
12506 RUNTIME_ASSERT(instance_filter->IsUndefined() || | 12503 RUNTIME_ASSERT(instance_filter->IsUndefined() || |
12507 instance_filter->IsJSObject()); | 12504 instance_filter->IsJSObject()); |
12508 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[2]); | 12505 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[2]); |
12509 RUNTIME_ASSERT(max_references >= 0); | 12506 RUNTIME_ASSERT(max_references >= 0); |
12510 | 12507 |
12511 | 12508 |
12512 // Get the constructor function for context extension and arguments array. | 12509 // Get the constructor function for context extension and arguments array. |
12513 JSObject* arguments_boilerplate = | 12510 JSObject* arguments_boilerplate = |
12514 isolate->context()->global_context()->arguments_boilerplate(); | 12511 isolate->context()->global_context()->arguments_boilerplate(); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12582 // args[0]: the constructor to find instances of | 12579 // args[0]: the constructor to find instances of |
12583 // args[1]: the the maximum number of objects to return | 12580 // args[1]: the the maximum number of objects to return |
12584 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugConstructedBy) { | 12581 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugConstructedBy) { |
12585 ASSERT(args.length() == 2); | 12582 ASSERT(args.length() == 2); |
12586 | 12583 |
12587 // First perform a full GC in order to avoid dead objects. | 12584 // First perform a full GC in order to avoid dead objects. |
12588 isolate->heap()->CollectAllGarbage(Heap::kMakeHeapIterableMask, | 12585 isolate->heap()->CollectAllGarbage(Heap::kMakeHeapIterableMask, |
12589 "%DebugConstructedBy"); | 12586 "%DebugConstructedBy"); |
12590 | 12587 |
12591 // Check parameters. | 12588 // Check parameters. |
12592 CONVERT_CHECKED(JSFunction, constructor, args[0]); | 12589 CONVERT_ARG_CHECKED(JSFunction, constructor, 0); |
12593 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[1]); | 12590 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[1]); |
12594 RUNTIME_ASSERT(max_references >= 0); | 12591 RUNTIME_ASSERT(max_references >= 0); |
12595 | 12592 |
12596 // Get the number of referencing objects. | 12593 // Get the number of referencing objects. |
12597 int count; | 12594 int count; |
12598 HeapIterator heap_iterator; | 12595 HeapIterator heap_iterator; |
12599 count = DebugConstructedBy(&heap_iterator, | 12596 count = DebugConstructedBy(&heap_iterator, |
12600 constructor, | 12597 constructor, |
12601 max_references, | 12598 max_references, |
12602 NULL, | 12599 NULL, |
(...skipping 23 matching lines...) Expand all Loading... |
12626 } | 12623 } |
12627 return JSArray::cast(result)->SetContent(instances); | 12624 return JSArray::cast(result)->SetContent(instances); |
12628 } | 12625 } |
12629 | 12626 |
12630 | 12627 |
12631 // Find the effective prototype object as returned by __proto__. | 12628 // Find the effective prototype object as returned by __proto__. |
12632 // args[0]: the object to find the prototype for. | 12629 // args[0]: the object to find the prototype for. |
12633 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetPrototype) { | 12630 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetPrototype) { |
12634 ASSERT(args.length() == 1); | 12631 ASSERT(args.length() == 1); |
12635 | 12632 |
12636 CONVERT_CHECKED(JSObject, obj, args[0]); | 12633 CONVERT_ARG_CHECKED(JSObject, obj, 0); |
12637 | 12634 |
12638 // Use the __proto__ accessor. | 12635 // Use the __proto__ accessor. |
12639 return Accessors::ObjectPrototype.getter(obj, NULL); | 12636 return Accessors::ObjectPrototype.getter(obj, NULL); |
12640 } | 12637 } |
12641 | 12638 |
12642 | 12639 |
12643 RUNTIME_FUNCTION(MaybeObject*, Runtime_SystemBreak) { | 12640 RUNTIME_FUNCTION(MaybeObject*, Runtime_SystemBreak) { |
12644 ASSERT(args.length() == 0); | 12641 ASSERT(args.length() == 0); |
12645 CPU::DebugBreak(); | 12642 CPU::DebugBreak(); |
12646 return isolate->heap()->undefined_value(); | 12643 return isolate->heap()->undefined_value(); |
12647 } | 12644 } |
12648 | 12645 |
12649 | 12646 |
12650 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugDisassembleFunction) { | 12647 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugDisassembleFunction) { |
12651 #ifdef DEBUG | 12648 #ifdef DEBUG |
12652 HandleScope scope(isolate); | 12649 HandleScope scope(isolate); |
12653 ASSERT(args.length() == 1); | 12650 ASSERT(args.length() == 1); |
12654 // Get the function and make sure it is compiled. | 12651 // Get the function and make sure it is compiled. |
12655 CONVERT_ARG_CHECKED(JSFunction, func, 0); | 12652 CONVERT_ARG_HANDLE_CHECKED(JSFunction, func, 0); |
12656 Handle<SharedFunctionInfo> shared(func->shared()); | 12653 Handle<SharedFunctionInfo> shared(func->shared()); |
12657 if (!SharedFunctionInfo::EnsureCompiled(shared, KEEP_EXCEPTION)) { | 12654 if (!SharedFunctionInfo::EnsureCompiled(shared, KEEP_EXCEPTION)) { |
12658 return Failure::Exception(); | 12655 return Failure::Exception(); |
12659 } | 12656 } |
12660 func->code()->PrintLn(); | 12657 func->code()->PrintLn(); |
12661 #endif // DEBUG | 12658 #endif // DEBUG |
12662 return isolate->heap()->undefined_value(); | 12659 return isolate->heap()->undefined_value(); |
12663 } | 12660 } |
12664 | 12661 |
12665 | 12662 |
12666 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugDisassembleConstructor) { | 12663 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugDisassembleConstructor) { |
12667 #ifdef DEBUG | 12664 #ifdef DEBUG |
12668 HandleScope scope(isolate); | 12665 HandleScope scope(isolate); |
12669 ASSERT(args.length() == 1); | 12666 ASSERT(args.length() == 1); |
12670 // Get the function and make sure it is compiled. | 12667 // Get the function and make sure it is compiled. |
12671 CONVERT_ARG_CHECKED(JSFunction, func, 0); | 12668 CONVERT_ARG_HANDLE_CHECKED(JSFunction, func, 0); |
12672 Handle<SharedFunctionInfo> shared(func->shared()); | 12669 Handle<SharedFunctionInfo> shared(func->shared()); |
12673 if (!SharedFunctionInfo::EnsureCompiled(shared, KEEP_EXCEPTION)) { | 12670 if (!SharedFunctionInfo::EnsureCompiled(shared, KEEP_EXCEPTION)) { |
12674 return Failure::Exception(); | 12671 return Failure::Exception(); |
12675 } | 12672 } |
12676 shared->construct_stub()->PrintLn(); | 12673 shared->construct_stub()->PrintLn(); |
12677 #endif // DEBUG | 12674 #endif // DEBUG |
12678 return isolate->heap()->undefined_value(); | 12675 return isolate->heap()->undefined_value(); |
12679 } | 12676 } |
12680 | 12677 |
12681 | 12678 |
12682 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetInferredName) { | 12679 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetInferredName) { |
12683 NoHandleAllocation ha; | 12680 NoHandleAllocation ha; |
12684 ASSERT(args.length() == 1); | 12681 ASSERT(args.length() == 1); |
12685 | 12682 |
12686 CONVERT_CHECKED(JSFunction, f, args[0]); | 12683 CONVERT_ARG_CHECKED(JSFunction, f, 0); |
12687 return f->shared()->inferred_name(); | 12684 return f->shared()->inferred_name(); |
12688 } | 12685 } |
12689 | 12686 |
12690 | 12687 |
12691 static int FindSharedFunctionInfosForScript(HeapIterator* iterator, | 12688 static int FindSharedFunctionInfosForScript(HeapIterator* iterator, |
12692 Script* script, | 12689 Script* script, |
12693 FixedArray* buffer) { | 12690 FixedArray* buffer) { |
12694 AssertNoAllocation no_allocations; | 12691 AssertNoAllocation no_allocations; |
12695 int counter = 0; | 12692 int counter = 0; |
12696 int buffer_size = buffer->length(); | 12693 int buffer_size = buffer->length(); |
(...skipping 16 matching lines...) Expand all Loading... |
12713 return counter; | 12710 return counter; |
12714 } | 12711 } |
12715 | 12712 |
12716 // For a script finds all SharedFunctionInfo's in the heap that points | 12713 // For a script finds all SharedFunctionInfo's in the heap that points |
12717 // to this script. Returns JSArray of SharedFunctionInfo wrapped | 12714 // to this script. Returns JSArray of SharedFunctionInfo wrapped |
12718 // in OpaqueReferences. | 12715 // in OpaqueReferences. |
12719 RUNTIME_FUNCTION(MaybeObject*, | 12716 RUNTIME_FUNCTION(MaybeObject*, |
12720 Runtime_LiveEditFindSharedFunctionInfosForScript) { | 12717 Runtime_LiveEditFindSharedFunctionInfosForScript) { |
12721 ASSERT(args.length() == 1); | 12718 ASSERT(args.length() == 1); |
12722 HandleScope scope(isolate); | 12719 HandleScope scope(isolate); |
12723 CONVERT_CHECKED(JSValue, script_value, args[0]); | 12720 CONVERT_ARG_CHECKED(JSValue, script_value, 0); |
12724 | 12721 |
12725 | 12722 |
12726 Handle<Script> script = Handle<Script>(Script::cast(script_value->value())); | 12723 Handle<Script> script = Handle<Script>(Script::cast(script_value->value())); |
12727 | 12724 |
12728 const int kBufferSize = 32; | 12725 const int kBufferSize = 32; |
12729 | 12726 |
12730 Handle<FixedArray> array; | 12727 Handle<FixedArray> array; |
12731 array = isolate->factory()->NewFixedArray(kBufferSize); | 12728 array = isolate->factory()->NewFixedArray(kBufferSize); |
12732 int number; | 12729 int number; |
12733 { | 12730 { |
(...skipping 25 matching lines...) Expand all Loading... |
12759 // For a script calculates compilation information about all its functions. | 12756 // For a script calculates compilation information about all its functions. |
12760 // The script source is explicitly specified by the second argument. | 12757 // The script source is explicitly specified by the second argument. |
12761 // The source of the actual script is not used, however it is important that | 12758 // The source of the actual script is not used, however it is important that |
12762 // all generated code keeps references to this particular instance of script. | 12759 // all generated code keeps references to this particular instance of script. |
12763 // Returns a JSArray of compilation infos. The array is ordered so that | 12760 // Returns a JSArray of compilation infos. The array is ordered so that |
12764 // each function with all its descendant is always stored in a continues range | 12761 // each function with all its descendant is always stored in a continues range |
12765 // with the function itself going first. The root function is a script function. | 12762 // with the function itself going first. The root function is a script function. |
12766 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditGatherCompileInfo) { | 12763 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditGatherCompileInfo) { |
12767 ASSERT(args.length() == 2); | 12764 ASSERT(args.length() == 2); |
12768 HandleScope scope(isolate); | 12765 HandleScope scope(isolate); |
12769 CONVERT_CHECKED(JSValue, script, args[0]); | 12766 CONVERT_ARG_CHECKED(JSValue, script, 0); |
12770 CONVERT_ARG_CHECKED(String, source, 1); | 12767 CONVERT_ARG_HANDLE_CHECKED(String, source, 1); |
12771 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); | 12768 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); |
12772 | 12769 |
12773 JSArray* result = LiveEdit::GatherCompileInfo(script_handle, source); | 12770 JSArray* result = LiveEdit::GatherCompileInfo(script_handle, source); |
12774 | 12771 |
12775 if (isolate->has_pending_exception()) { | 12772 if (isolate->has_pending_exception()) { |
12776 return Failure::Exception(); | 12773 return Failure::Exception(); |
12777 } | 12774 } |
12778 | 12775 |
12779 return result; | 12776 return result; |
12780 } | 12777 } |
12781 | 12778 |
12782 // Changes the source of the script to a new_source. | 12779 // Changes the source of the script to a new_source. |
12783 // If old_script_name is provided (i.e. is a String), also creates a copy of | 12780 // If old_script_name is provided (i.e. is a String), also creates a copy of |
12784 // the script with its original source and sends notification to debugger. | 12781 // the script with its original source and sends notification to debugger. |
12785 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditReplaceScript) { | 12782 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditReplaceScript) { |
12786 ASSERT(args.length() == 3); | 12783 ASSERT(args.length() == 3); |
12787 HandleScope scope(isolate); | 12784 HandleScope scope(isolate); |
12788 CONVERT_CHECKED(JSValue, original_script_value, args[0]); | 12785 CONVERT_ARG_CHECKED(JSValue, original_script_value, 0); |
12789 CONVERT_ARG_CHECKED(String, new_source, 1); | 12786 CONVERT_ARG_HANDLE_CHECKED(String, new_source, 1); |
12790 Handle<Object> old_script_name(args[2], isolate); | 12787 Handle<Object> old_script_name(args[2], isolate); |
12791 | 12788 |
12792 CONVERT_CHECKED(Script, original_script_pointer, | 12789 RUNTIME_ASSERT(original_script_value->value()->IsScript()); |
12793 original_script_value->value()); | 12790 Handle<Script> original_script(Script::cast(original_script_value->value())); |
12794 Handle<Script> original_script(original_script_pointer); | |
12795 | 12791 |
12796 Object* old_script = LiveEdit::ChangeScriptSource(original_script, | 12792 Object* old_script = LiveEdit::ChangeScriptSource(original_script, |
12797 new_source, | 12793 new_source, |
12798 old_script_name); | 12794 old_script_name); |
12799 | 12795 |
12800 if (old_script->IsScript()) { | 12796 if (old_script->IsScript()) { |
12801 Handle<Script> script_handle(Script::cast(old_script)); | 12797 Handle<Script> script_handle(Script::cast(old_script)); |
12802 return *(GetScriptWrapper(script_handle)); | 12798 return *(GetScriptWrapper(script_handle)); |
12803 } else { | 12799 } else { |
12804 return isolate->heap()->null_value(); | 12800 return isolate->heap()->null_value(); |
12805 } | 12801 } |
12806 } | 12802 } |
12807 | 12803 |
12808 | 12804 |
12809 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditFunctionSourceUpdated) { | 12805 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditFunctionSourceUpdated) { |
12810 ASSERT(args.length() == 1); | 12806 ASSERT(args.length() == 1); |
12811 HandleScope scope(isolate); | 12807 HandleScope scope(isolate); |
12812 CONVERT_ARG_CHECKED(JSArray, shared_info, 0); | 12808 CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_info, 0); |
12813 return LiveEdit::FunctionSourceUpdated(shared_info); | 12809 return LiveEdit::FunctionSourceUpdated(shared_info); |
12814 } | 12810 } |
12815 | 12811 |
12816 | 12812 |
12817 // Replaces code of SharedFunctionInfo with a new one. | 12813 // Replaces code of SharedFunctionInfo with a new one. |
12818 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditReplaceFunctionCode) { | 12814 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditReplaceFunctionCode) { |
12819 ASSERT(args.length() == 2); | 12815 ASSERT(args.length() == 2); |
12820 HandleScope scope(isolate); | 12816 HandleScope scope(isolate); |
12821 CONVERT_ARG_CHECKED(JSArray, new_compile_info, 0); | 12817 CONVERT_ARG_HANDLE_CHECKED(JSArray, new_compile_info, 0); |
12822 CONVERT_ARG_CHECKED(JSArray, shared_info, 1); | 12818 CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_info, 1); |
12823 | 12819 |
12824 return LiveEdit::ReplaceFunctionCode(new_compile_info, shared_info); | 12820 return LiveEdit::ReplaceFunctionCode(new_compile_info, shared_info); |
12825 } | 12821 } |
12826 | 12822 |
12827 // Connects SharedFunctionInfo to another script. | 12823 // Connects SharedFunctionInfo to another script. |
12828 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditFunctionSetScript) { | 12824 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditFunctionSetScript) { |
12829 ASSERT(args.length() == 2); | 12825 ASSERT(args.length() == 2); |
12830 HandleScope scope(isolate); | 12826 HandleScope scope(isolate); |
12831 Handle<Object> function_object(args[0], isolate); | 12827 Handle<Object> function_object(args[0], isolate); |
12832 Handle<Object> script_object(args[1], isolate); | 12828 Handle<Object> script_object(args[1], isolate); |
12833 | 12829 |
12834 if (function_object->IsJSValue()) { | 12830 if (function_object->IsJSValue()) { |
12835 Handle<JSValue> function_wrapper = Handle<JSValue>::cast(function_object); | 12831 Handle<JSValue> function_wrapper = Handle<JSValue>::cast(function_object); |
12836 if (script_object->IsJSValue()) { | 12832 if (script_object->IsJSValue()) { |
12837 CONVERT_CHECKED(Script, script, JSValue::cast(*script_object)->value()); | 12833 RUNTIME_ASSERT(JSValue::cast(*script_object)->value()->IsScript()); |
| 12834 Script* script = Script::cast(JSValue::cast(*script_object)->value()); |
12838 script_object = Handle<Object>(script, isolate); | 12835 script_object = Handle<Object>(script, isolate); |
12839 } | 12836 } |
12840 | 12837 |
12841 LiveEdit::SetFunctionScript(function_wrapper, script_object); | 12838 LiveEdit::SetFunctionScript(function_wrapper, script_object); |
12842 } else { | 12839 } else { |
12843 // Just ignore this. We may not have a SharedFunctionInfo for some functions | 12840 // Just ignore this. We may not have a SharedFunctionInfo for some functions |
12844 // and we check it in this function. | 12841 // and we check it in this function. |
12845 } | 12842 } |
12846 | 12843 |
12847 return isolate->heap()->undefined_value(); | 12844 return isolate->heap()->undefined_value(); |
12848 } | 12845 } |
12849 | 12846 |
12850 | 12847 |
12851 // In a code of a parent function replaces original function as embedded object | 12848 // In a code of a parent function replaces original function as embedded object |
12852 // with a substitution one. | 12849 // with a substitution one. |
12853 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditReplaceRefToNestedFunction) { | 12850 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditReplaceRefToNestedFunction) { |
12854 ASSERT(args.length() == 3); | 12851 ASSERT(args.length() == 3); |
12855 HandleScope scope(isolate); | 12852 HandleScope scope(isolate); |
12856 | 12853 |
12857 CONVERT_ARG_CHECKED(JSValue, parent_wrapper, 0); | 12854 CONVERT_ARG_HANDLE_CHECKED(JSValue, parent_wrapper, 0); |
12858 CONVERT_ARG_CHECKED(JSValue, orig_wrapper, 1); | 12855 CONVERT_ARG_HANDLE_CHECKED(JSValue, orig_wrapper, 1); |
12859 CONVERT_ARG_CHECKED(JSValue, subst_wrapper, 2); | 12856 CONVERT_ARG_HANDLE_CHECKED(JSValue, subst_wrapper, 2); |
12860 | 12857 |
12861 LiveEdit::ReplaceRefToNestedFunction(parent_wrapper, orig_wrapper, | 12858 LiveEdit::ReplaceRefToNestedFunction(parent_wrapper, orig_wrapper, |
12862 subst_wrapper); | 12859 subst_wrapper); |
12863 | 12860 |
12864 return isolate->heap()->undefined_value(); | 12861 return isolate->heap()->undefined_value(); |
12865 } | 12862 } |
12866 | 12863 |
12867 | 12864 |
12868 // Updates positions of a shared function info (first parameter) according | 12865 // Updates positions of a shared function info (first parameter) according |
12869 // to script source change. Text change is described in second parameter as | 12866 // to script source change. Text change is described in second parameter as |
12870 // array of groups of 3 numbers: | 12867 // array of groups of 3 numbers: |
12871 // (change_begin, change_end, change_end_new_position). | 12868 // (change_begin, change_end, change_end_new_position). |
12872 // Each group describes a change in text; groups are sorted by change_begin. | 12869 // Each group describes a change in text; groups are sorted by change_begin. |
12873 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditPatchFunctionPositions) { | 12870 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditPatchFunctionPositions) { |
12874 ASSERT(args.length() == 2); | 12871 ASSERT(args.length() == 2); |
12875 HandleScope scope(isolate); | 12872 HandleScope scope(isolate); |
12876 CONVERT_ARG_CHECKED(JSArray, shared_array, 0); | 12873 CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_array, 0); |
12877 CONVERT_ARG_CHECKED(JSArray, position_change_array, 1); | 12874 CONVERT_ARG_HANDLE_CHECKED(JSArray, position_change_array, 1); |
12878 | 12875 |
12879 return LiveEdit::PatchFunctionPositions(shared_array, position_change_array); | 12876 return LiveEdit::PatchFunctionPositions(shared_array, position_change_array); |
12880 } | 12877 } |
12881 | 12878 |
12882 | 12879 |
12883 // For array of SharedFunctionInfo's (each wrapped in JSValue) | 12880 // For array of SharedFunctionInfo's (each wrapped in JSValue) |
12884 // checks that none of them have activations on stacks (of any thread). | 12881 // checks that none of them have activations on stacks (of any thread). |
12885 // Returns array of the same length with corresponding results of | 12882 // Returns array of the same length with corresponding results of |
12886 // LiveEdit::FunctionPatchabilityStatus type. | 12883 // LiveEdit::FunctionPatchabilityStatus type. |
12887 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditCheckAndDropActivations) { | 12884 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditCheckAndDropActivations) { |
12888 ASSERT(args.length() == 2); | 12885 ASSERT(args.length() == 2); |
12889 HandleScope scope(isolate); | 12886 HandleScope scope(isolate); |
12890 CONVERT_ARG_CHECKED(JSArray, shared_array, 0); | 12887 CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_array, 0); |
12891 CONVERT_BOOLEAN_CHECKED(do_drop, args[1]); | 12888 CONVERT_BOOLEAN_ARG_CHECKED(do_drop, 1); |
12892 | 12889 |
12893 return *LiveEdit::CheckAndDropActivations(shared_array, do_drop); | 12890 return *LiveEdit::CheckAndDropActivations(shared_array, do_drop); |
12894 } | 12891 } |
12895 | 12892 |
12896 // Compares 2 strings line-by-line, then token-wise and returns diff in form | 12893 // Compares 2 strings line-by-line, then token-wise and returns diff in form |
12897 // of JSArray of triplets (pos1, pos1_end, pos2_end) describing list | 12894 // of JSArray of triplets (pos1, pos1_end, pos2_end) describing list |
12898 // of diff chunks. | 12895 // of diff chunks. |
12899 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditCompareStrings) { | 12896 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditCompareStrings) { |
12900 ASSERT(args.length() == 2); | 12897 ASSERT(args.length() == 2); |
12901 HandleScope scope(isolate); | 12898 HandleScope scope(isolate); |
12902 CONVERT_ARG_CHECKED(String, s1, 0); | 12899 CONVERT_ARG_HANDLE_CHECKED(String, s1, 0); |
12903 CONVERT_ARG_CHECKED(String, s2, 1); | 12900 CONVERT_ARG_HANDLE_CHECKED(String, s2, 1); |
12904 | 12901 |
12905 return *LiveEdit::CompareStrings(s1, s2); | 12902 return *LiveEdit::CompareStrings(s1, s2); |
12906 } | 12903 } |
12907 | 12904 |
12908 | 12905 |
12909 // A testing entry. Returns statement position which is the closest to | 12906 // A testing entry. Returns statement position which is the closest to |
12910 // source_position. | 12907 // source_position. |
12911 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFunctionCodePositionFromSource) { | 12908 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFunctionCodePositionFromSource) { |
12912 ASSERT(args.length() == 2); | 12909 ASSERT(args.length() == 2); |
12913 HandleScope scope(isolate); | 12910 HandleScope scope(isolate); |
12914 CONVERT_ARG_CHECKED(JSFunction, function, 0); | 12911 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
12915 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); | 12912 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); |
12916 | 12913 |
12917 Handle<Code> code(function->code(), isolate); | 12914 Handle<Code> code(function->code(), isolate); |
12918 | 12915 |
12919 if (code->kind() != Code::FUNCTION && | 12916 if (code->kind() != Code::FUNCTION && |
12920 code->kind() != Code::OPTIMIZED_FUNCTION) { | 12917 code->kind() != Code::OPTIMIZED_FUNCTION) { |
12921 return isolate->heap()->undefined_value(); | 12918 return isolate->heap()->undefined_value(); |
12922 } | 12919 } |
12923 | 12920 |
12924 RelocIterator it(*code, RelocInfo::ModeMask(RelocInfo::STATEMENT_POSITION)); | 12921 RelocIterator it(*code, RelocInfo::ModeMask(RelocInfo::STATEMENT_POSITION)); |
(...skipping 16 matching lines...) Expand all Loading... |
12941 return Smi::FromInt(closest_pc); | 12938 return Smi::FromInt(closest_pc); |
12942 } | 12939 } |
12943 | 12940 |
12944 | 12941 |
12945 // Calls specified function with or without entering the debugger. | 12942 // Calls specified function with or without entering the debugger. |
12946 // This is used in unit tests to run code as if debugger is entered or simply | 12943 // This is used in unit tests to run code as if debugger is entered or simply |
12947 // to have a stack with C++ frame in the middle. | 12944 // to have a stack with C++ frame in the middle. |
12948 RUNTIME_FUNCTION(MaybeObject*, Runtime_ExecuteInDebugContext) { | 12945 RUNTIME_FUNCTION(MaybeObject*, Runtime_ExecuteInDebugContext) { |
12949 ASSERT(args.length() == 2); | 12946 ASSERT(args.length() == 2); |
12950 HandleScope scope(isolate); | 12947 HandleScope scope(isolate); |
12951 CONVERT_ARG_CHECKED(JSFunction, function, 0); | 12948 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); |
12952 CONVERT_BOOLEAN_CHECKED(without_debugger, args[1]); | 12949 CONVERT_BOOLEAN_ARG_CHECKED(without_debugger, 1); |
12953 | 12950 |
12954 Handle<Object> result; | 12951 Handle<Object> result; |
12955 bool pending_exception; | 12952 bool pending_exception; |
12956 { | 12953 { |
12957 if (without_debugger) { | 12954 if (without_debugger) { |
12958 result = Execution::Call(function, isolate->global(), 0, NULL, | 12955 result = Execution::Call(function, isolate->global(), 0, NULL, |
12959 &pending_exception); | 12956 &pending_exception); |
12960 } else { | 12957 } else { |
12961 EnterDebugger enter_debugger; | 12958 EnterDebugger enter_debugger; |
12962 result = Execution::Call(function, isolate->global(), 0, NULL, | 12959 result = Execution::Call(function, isolate->global(), 0, NULL, |
12963 &pending_exception); | 12960 &pending_exception); |
12964 } | 12961 } |
12965 } | 12962 } |
12966 if (!pending_exception) { | 12963 if (!pending_exception) { |
12967 return *result; | 12964 return *result; |
12968 } else { | 12965 } else { |
12969 return Failure::Exception(); | 12966 return Failure::Exception(); |
12970 } | 12967 } |
12971 } | 12968 } |
12972 | 12969 |
12973 | 12970 |
12974 // Sets a v8 flag. | 12971 // Sets a v8 flag. |
12975 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetFlags) { | 12972 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetFlags) { |
12976 CONVERT_CHECKED(String, arg, args[0]); | 12973 CONVERT_ARG_CHECKED(String, arg, 0); |
12977 SmartArrayPointer<char> flags = | 12974 SmartArrayPointer<char> flags = |
12978 arg->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); | 12975 arg->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
12979 FlagList::SetFlagsFromString(*flags, StrLength(*flags)); | 12976 FlagList::SetFlagsFromString(*flags, StrLength(*flags)); |
12980 return isolate->heap()->undefined_value(); | 12977 return isolate->heap()->undefined_value(); |
12981 } | 12978 } |
12982 | 12979 |
12983 | 12980 |
12984 // Performs a GC. | 12981 // Performs a GC. |
12985 // Presently, it only does a full GC. | 12982 // Presently, it only does a full GC. |
12986 RUNTIME_FUNCTION(MaybeObject*, Runtime_CollectGarbage) { | 12983 RUNTIME_FUNCTION(MaybeObject*, Runtime_CollectGarbage) { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13036 // specified by id1 and id2. | 13033 // specified by id1 and id2. |
13037 // If id1 is 0 (i.e. not a valid lol), then the whole of lol id2 will be | 13034 // If id1 is 0 (i.e. not a valid lol), then the whole of lol id2 will be |
13038 // dumped. | 13035 // dumped. |
13039 RUNTIME_FUNCTION(MaybeObject*, Runtime_DumpLOL) { | 13036 RUNTIME_FUNCTION(MaybeObject*, Runtime_DumpLOL) { |
13040 #ifdef LIVE_OBJECT_LIST | 13037 #ifdef LIVE_OBJECT_LIST |
13041 HandleScope scope; | 13038 HandleScope scope; |
13042 CONVERT_SMI_ARG_CHECKED(id1, 0); | 13039 CONVERT_SMI_ARG_CHECKED(id1, 0); |
13043 CONVERT_SMI_ARG_CHECKED(id2, 1); | 13040 CONVERT_SMI_ARG_CHECKED(id2, 1); |
13044 CONVERT_SMI_ARG_CHECKED(start, 2); | 13041 CONVERT_SMI_ARG_CHECKED(start, 2); |
13045 CONVERT_SMI_ARG_CHECKED(count, 3); | 13042 CONVERT_SMI_ARG_CHECKED(count, 3); |
13046 CONVERT_ARG_CHECKED(JSObject, filter_obj, 4); | 13043 CONVERT_ARG_HANDLE_CHECKED(JSObject, filter_obj, 4); |
13047 EnterDebugger enter_debugger; | 13044 EnterDebugger enter_debugger; |
13048 return LiveObjectList::Dump(id1, id2, start, count, filter_obj); | 13045 return LiveObjectList::Dump(id1, id2, start, count, filter_obj); |
13049 #else | 13046 #else |
13050 return isolate->heap()->undefined_value(); | 13047 return isolate->heap()->undefined_value(); |
13051 #endif | 13048 #endif |
13052 } | 13049 } |
13053 | 13050 |
13054 | 13051 |
13055 // Gets the specified object as requested by the debugger. | 13052 // Gets the specified object as requested by the debugger. |
13056 // This is only used for obj ids shown in live object lists. | 13053 // This is only used for obj ids shown in live object lists. |
13057 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLOLObj) { | 13054 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLOLObj) { |
13058 #ifdef LIVE_OBJECT_LIST | 13055 #ifdef LIVE_OBJECT_LIST |
13059 CONVERT_SMI_ARG_CHECKED(obj_id, 0); | 13056 CONVERT_SMI_ARG_CHECKED(obj_id, 0); |
13060 Object* result = LiveObjectList::GetObj(obj_id); | 13057 Object* result = LiveObjectList::GetObj(obj_id); |
13061 return result; | 13058 return result; |
13062 #else | 13059 #else |
13063 return isolate->heap()->undefined_value(); | 13060 return isolate->heap()->undefined_value(); |
13064 #endif | 13061 #endif |
13065 } | 13062 } |
13066 | 13063 |
13067 | 13064 |
13068 // Gets the obj id for the specified address if valid. | 13065 // Gets the obj id for the specified address if valid. |
13069 // This is only used for obj ids shown in live object lists. | 13066 // This is only used for obj ids shown in live object lists. |
13070 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLOLObjId) { | 13067 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLOLObjId) { |
13071 #ifdef LIVE_OBJECT_LIST | 13068 #ifdef LIVE_OBJECT_LIST |
13072 HandleScope scope; | 13069 HandleScope scope; |
13073 CONVERT_ARG_CHECKED(String, address, 0); | 13070 CONVERT_ARG_HANDLE_CHECKED(String, address, 0); |
13074 Object* result = LiveObjectList::GetObjId(address); | 13071 Object* result = LiveObjectList::GetObjId(address); |
13075 return result; | 13072 return result; |
13076 #else | 13073 #else |
13077 return isolate->heap()->undefined_value(); | 13074 return isolate->heap()->undefined_value(); |
13078 #endif | 13075 #endif |
13079 } | 13076 } |
13080 | 13077 |
13081 | 13078 |
13082 // Gets the retainers that references the specified object alive. | 13079 // Gets the retainers that references the specified object alive. |
13083 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLOLObjRetainers) { | 13080 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetLOLObjRetainers) { |
13084 #ifdef LIVE_OBJECT_LIST | 13081 #ifdef LIVE_OBJECT_LIST |
13085 HandleScope scope; | 13082 HandleScope scope; |
13086 CONVERT_SMI_ARG_CHECKED(obj_id, 0); | 13083 CONVERT_SMI_ARG_CHECKED(obj_id, 0); |
13087 RUNTIME_ASSERT(args[1]->IsUndefined() || args[1]->IsJSObject()); | 13084 RUNTIME_ASSERT(args[1]->IsUndefined() || args[1]->IsJSObject()); |
13088 RUNTIME_ASSERT(args[2]->IsUndefined() || args[2]->IsBoolean()); | 13085 RUNTIME_ASSERT(args[2]->IsUndefined() || args[2]->IsBoolean()); |
13089 RUNTIME_ASSERT(args[3]->IsUndefined() || args[3]->IsSmi()); | 13086 RUNTIME_ASSERT(args[3]->IsUndefined() || args[3]->IsSmi()); |
13090 RUNTIME_ASSERT(args[4]->IsUndefined() || args[4]->IsSmi()); | 13087 RUNTIME_ASSERT(args[4]->IsUndefined() || args[4]->IsSmi()); |
13091 CONVERT_ARG_CHECKED(JSObject, filter_obj, 5); | 13088 CONVERT_ARG_HANDLE_CHECKED(JSObject, filter_obj, 5); |
13092 | 13089 |
13093 Handle<JSObject> instance_filter; | 13090 Handle<JSObject> instance_filter; |
13094 if (args[1]->IsJSObject()) { | 13091 if (args[1]->IsJSObject()) { |
13095 instance_filter = args.at<JSObject>(1); | 13092 instance_filter = args.at<JSObject>(1); |
13096 } | 13093 } |
13097 bool verbose = false; | 13094 bool verbose = false; |
13098 if (args[2]->IsBoolean()) { | 13095 if (args[2]->IsBoolean()) { |
13099 verbose = args[2]->IsTrue(); | 13096 verbose = args[2]->IsTrue(); |
13100 } | 13097 } |
13101 int start = 0; | 13098 int start = 0; |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13182 // Generates the response to a debugger request for a summary of the types | 13179 // Generates the response to a debugger request for a summary of the types |
13183 // of objects in the difference between the captured live object lists | 13180 // of objects in the difference between the captured live object lists |
13184 // specified by id1 and id2. | 13181 // specified by id1 and id2. |
13185 // If id1 is 0 (i.e. not a valid lol), then the whole of lol id2 will be | 13182 // If id1 is 0 (i.e. not a valid lol), then the whole of lol id2 will be |
13186 // summarized. | 13183 // summarized. |
13187 RUNTIME_FUNCTION(MaybeObject*, Runtime_SummarizeLOL) { | 13184 RUNTIME_FUNCTION(MaybeObject*, Runtime_SummarizeLOL) { |
13188 #ifdef LIVE_OBJECT_LIST | 13185 #ifdef LIVE_OBJECT_LIST |
13189 HandleScope scope; | 13186 HandleScope scope; |
13190 CONVERT_SMI_ARG_CHECKED(id1, 0); | 13187 CONVERT_SMI_ARG_CHECKED(id1, 0); |
13191 CONVERT_SMI_ARG_CHECKED(id2, 1); | 13188 CONVERT_SMI_ARG_CHECKED(id2, 1); |
13192 CONVERT_ARG_CHECKED(JSObject, filter_obj, 2); | 13189 CONVERT_ARG_HANDLE_CHECKED(JSObject, filter_obj, 2); |
13193 | 13190 |
13194 EnterDebugger enter_debugger; | 13191 EnterDebugger enter_debugger; |
13195 return LiveObjectList::Summarize(id1, id2, filter_obj); | 13192 return LiveObjectList::Summarize(id1, id2, filter_obj); |
13196 #else | 13193 #else |
13197 return isolate->heap()->undefined_value(); | 13194 return isolate->heap()->undefined_value(); |
13198 #endif | 13195 #endif |
13199 } | 13196 } |
13200 | 13197 |
13201 #endif // ENABLE_DEBUGGER_SUPPORT | 13198 #endif // ENABLE_DEBUGGER_SUPPORT |
13202 | 13199 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13250 | 13247 |
13251 | 13248 |
13252 // Get the script object from script data. NOTE: Regarding performance | 13249 // Get the script object from script data. NOTE: Regarding performance |
13253 // see the NOTE for GetScriptFromScriptData. | 13250 // see the NOTE for GetScriptFromScriptData. |
13254 // args[0]: script data for the script to find the source for | 13251 // args[0]: script data for the script to find the source for |
13255 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScript) { | 13252 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScript) { |
13256 HandleScope scope(isolate); | 13253 HandleScope scope(isolate); |
13257 | 13254 |
13258 ASSERT(args.length() == 1); | 13255 ASSERT(args.length() == 1); |
13259 | 13256 |
13260 CONVERT_CHECKED(String, script_name, args[0]); | 13257 CONVERT_ARG_CHECKED(String, script_name, 0); |
13261 | 13258 |
13262 // Find the requested script. | 13259 // Find the requested script. |
13263 Handle<Object> result = | 13260 Handle<Object> result = |
13264 Runtime_GetScriptFromScriptName(Handle<String>(script_name)); | 13261 Runtime_GetScriptFromScriptName(Handle<String>(script_name)); |
13265 return *result; | 13262 return *result; |
13266 } | 13263 } |
13267 | 13264 |
13268 | 13265 |
13269 // Determines whether the given stack frame should be displayed in | 13266 // Determines whether the given stack frame should be displayed in |
13270 // a stack trace. The caller is the error constructor that asked | 13267 // a stack trace. The caller is the error constructor that asked |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13305 } | 13302 } |
13306 return true; | 13303 return true; |
13307 } | 13304 } |
13308 | 13305 |
13309 | 13306 |
13310 // Collect the raw data for a stack trace. Returns an array of 4 | 13307 // Collect the raw data for a stack trace. Returns an array of 4 |
13311 // element segments each containing a receiver, function, code and | 13308 // element segments each containing a receiver, function, code and |
13312 // native code offset. | 13309 // native code offset. |
13313 RUNTIME_FUNCTION(MaybeObject*, Runtime_CollectStackTrace) { | 13310 RUNTIME_FUNCTION(MaybeObject*, Runtime_CollectStackTrace) { |
13314 ASSERT_EQ(args.length(), 3); | 13311 ASSERT_EQ(args.length(), 3); |
13315 CONVERT_ARG_CHECKED(JSObject, error_object, 0); | 13312 CONVERT_ARG_HANDLE_CHECKED(JSObject, error_object, 0); |
13316 Handle<Object> caller = args.at<Object>(1); | 13313 Handle<Object> caller = args.at<Object>(1); |
13317 CONVERT_NUMBER_CHECKED(int32_t, limit, Int32, args[2]); | 13314 CONVERT_NUMBER_CHECKED(int32_t, limit, Int32, args[2]); |
13318 | 13315 |
13319 HandleScope scope(isolate); | 13316 HandleScope scope(isolate); |
13320 Factory* factory = isolate->factory(); | 13317 Factory* factory = isolate->factory(); |
13321 | 13318 |
13322 limit = Max(limit, 0); // Ensure that limit is not negative. | 13319 limit = Max(limit, 0); // Ensure that limit is not negative. |
13323 int initial_size = Min(limit, 10); | 13320 int initial_size = Min(limit, 10); |
13324 Handle<FixedArray> elements = | 13321 Handle<FixedArray> elements = |
13325 factory->NewFixedArrayWithHoles(initial_size * 4); | 13322 factory->NewFixedArrayWithHoles(initial_size * 4); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13390 reinterpret_cast<char*>(args[0]) + args.smi_at(1)); | 13387 reinterpret_cast<char*>(args[0]) + args.smi_at(1)); |
13391 isolate->PrintStack(); | 13388 isolate->PrintStack(); |
13392 OS::Abort(); | 13389 OS::Abort(); |
13393 UNREACHABLE(); | 13390 UNREACHABLE(); |
13394 return NULL; | 13391 return NULL; |
13395 } | 13392 } |
13396 | 13393 |
13397 | 13394 |
13398 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFromCache) { | 13395 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFromCache) { |
13399 // This is only called from codegen, so checks might be more lax. | 13396 // This is only called from codegen, so checks might be more lax. |
13400 CONVERT_CHECKED(JSFunctionResultCache, cache, args[0]); | 13397 CONVERT_ARG_CHECKED(JSFunctionResultCache, cache, 0); |
13401 Object* key = args[1]; | 13398 Object* key = args[1]; |
13402 | 13399 |
13403 int finger_index = cache->finger_index(); | 13400 int finger_index = cache->finger_index(); |
13404 Object* o = cache->get(finger_index); | 13401 Object* o = cache->get(finger_index); |
13405 if (o == key) { | 13402 if (o == key) { |
13406 // The fastest case: hit the same place again. | 13403 // The fastest case: hit the same place again. |
13407 return cache->get(finger_index + 1); | 13404 return cache->get(finger_index + 1); |
13408 } | 13405 } |
13409 | 13406 |
13410 for (int i = finger_index - 2; | 13407 for (int i = finger_index - 2; |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13486 cache_handle->JSFunctionResultCacheVerify(); | 13483 cache_handle->JSFunctionResultCacheVerify(); |
13487 } | 13484 } |
13488 #endif | 13485 #endif |
13489 | 13486 |
13490 return *value; | 13487 return *value; |
13491 } | 13488 } |
13492 | 13489 |
13493 | 13490 |
13494 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewMessageObject) { | 13491 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewMessageObject) { |
13495 HandleScope scope(isolate); | 13492 HandleScope scope(isolate); |
13496 CONVERT_ARG_CHECKED(String, type, 0); | 13493 CONVERT_ARG_HANDLE_CHECKED(String, type, 0); |
13497 CONVERT_ARG_CHECKED(JSArray, arguments, 1); | 13494 CONVERT_ARG_HANDLE_CHECKED(JSArray, arguments, 1); |
13498 return *isolate->factory()->NewJSMessageObject( | 13495 return *isolate->factory()->NewJSMessageObject( |
13499 type, | 13496 type, |
13500 arguments, | 13497 arguments, |
13501 0, | 13498 0, |
13502 0, | 13499 0, |
13503 isolate->factory()->undefined_value(), | 13500 isolate->factory()->undefined_value(), |
13504 isolate->factory()->undefined_value(), | 13501 isolate->factory()->undefined_value(), |
13505 isolate->factory()->undefined_value()); | 13502 isolate->factory()->undefined_value()); |
13506 } | 13503 } |
13507 | 13504 |
13508 | 13505 |
13509 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetType) { | 13506 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetType) { |
13510 CONVERT_CHECKED(JSMessageObject, message, args[0]); | 13507 CONVERT_ARG_CHECKED(JSMessageObject, message, 0); |
13511 return message->type(); | 13508 return message->type(); |
13512 } | 13509 } |
13513 | 13510 |
13514 | 13511 |
13515 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetArguments) { | 13512 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetArguments) { |
13516 CONVERT_CHECKED(JSMessageObject, message, args[0]); | 13513 CONVERT_ARG_CHECKED(JSMessageObject, message, 0); |
13517 return message->arguments(); | 13514 return message->arguments(); |
13518 } | 13515 } |
13519 | 13516 |
13520 | 13517 |
13521 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetStartPosition) { | 13518 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetStartPosition) { |
13522 CONVERT_CHECKED(JSMessageObject, message, args[0]); | 13519 CONVERT_ARG_CHECKED(JSMessageObject, message, 0); |
13523 return Smi::FromInt(message->start_position()); | 13520 return Smi::FromInt(message->start_position()); |
13524 } | 13521 } |
13525 | 13522 |
13526 | 13523 |
13527 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetScript) { | 13524 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetScript) { |
13528 CONVERT_CHECKED(JSMessageObject, message, args[0]); | 13525 CONVERT_ARG_CHECKED(JSMessageObject, message, 0); |
13529 return message->script(); | 13526 return message->script(); |
13530 } | 13527 } |
13531 | 13528 |
13532 | 13529 |
13533 #ifdef DEBUG | 13530 #ifdef DEBUG |
13534 // ListNatives is ONLY used by the fuzz-natives.js in debug mode | 13531 // ListNatives is ONLY used by the fuzz-natives.js in debug mode |
13535 // Exclude the code in release mode. | 13532 // Exclude the code in release mode. |
13536 RUNTIME_FUNCTION(MaybeObject*, Runtime_ListNatives) { | 13533 RUNTIME_FUNCTION(MaybeObject*, Runtime_ListNatives) { |
13537 ASSERT(args.length() == 0); | 13534 ASSERT(args.length() == 0); |
13538 HandleScope scope; | 13535 HandleScope scope; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13572 #undef ADD_ENTRY | 13569 #undef ADD_ENTRY |
13573 ASSERT_EQ(index, entry_count); | 13570 ASSERT_EQ(index, entry_count); |
13574 Handle<JSArray> result = factory->NewJSArrayWithElements(elements); | 13571 Handle<JSArray> result = factory->NewJSArrayWithElements(elements); |
13575 return *result; | 13572 return *result; |
13576 } | 13573 } |
13577 #endif | 13574 #endif |
13578 | 13575 |
13579 | 13576 |
13580 RUNTIME_FUNCTION(MaybeObject*, Runtime_Log) { | 13577 RUNTIME_FUNCTION(MaybeObject*, Runtime_Log) { |
13581 ASSERT(args.length() == 2); | 13578 ASSERT(args.length() == 2); |
13582 CONVERT_CHECKED(String, format, args[0]); | 13579 CONVERT_ARG_CHECKED(String, format, 0); |
13583 CONVERT_CHECKED(JSArray, elms, args[1]); | 13580 CONVERT_ARG_CHECKED(JSArray, elms, 1); |
13584 String::FlatContent format_content = format->GetFlatContent(); | 13581 String::FlatContent format_content = format->GetFlatContent(); |
13585 RUNTIME_ASSERT(format_content.IsAscii()); | 13582 RUNTIME_ASSERT(format_content.IsAscii()); |
13586 Vector<const char> chars = format_content.ToAsciiVector(); | 13583 Vector<const char> chars = format_content.ToAsciiVector(); |
13587 LOGGER->LogRuntime(chars, elms); | 13584 LOGGER->LogRuntime(chars, elms); |
13588 return isolate->heap()->undefined_value(); | 13585 return isolate->heap()->undefined_value(); |
13589 } | 13586 } |
13590 | 13587 |
13591 | 13588 |
13592 RUNTIME_FUNCTION(MaybeObject*, Runtime_IS_VAR) { | 13589 RUNTIME_FUNCTION(MaybeObject*, Runtime_IS_VAR) { |
13593 UNREACHABLE(); // implemented as macro in the parser | 13590 UNREACHABLE(); // implemented as macro in the parser |
13594 return NULL; | 13591 return NULL; |
13595 } | 13592 } |
13596 | 13593 |
13597 | 13594 |
13598 #define ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(Name) \ | 13595 #define ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(Name) \ |
13599 RUNTIME_FUNCTION(MaybeObject*, Runtime_Has##Name) { \ | 13596 RUNTIME_FUNCTION(MaybeObject*, Runtime_Has##Name) { \ |
13600 CONVERT_CHECKED(JSObject, obj, args[0]); \ | 13597 CONVERT_ARG_CHECKED(JSObject, obj, 0); \ |
13601 return isolate->heap()->ToBoolean(obj->Has##Name()); \ | 13598 return isolate->heap()->ToBoolean(obj->Has##Name()); \ |
13602 } | 13599 } |
13603 | 13600 |
13604 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastSmiOnlyElements) | 13601 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastSmiOnlyElements) |
13605 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastElements) | 13602 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastElements) |
13606 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastDoubleElements) | 13603 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastDoubleElements) |
13607 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(DictionaryElements) | 13604 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(DictionaryElements) |
13608 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalPixelElements) | 13605 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalPixelElements) |
13609 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalArrayElements) | 13606 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalArrayElements) |
13610 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalByteElements) | 13607 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalByteElements) |
13611 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalUnsignedByteElements) | 13608 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalUnsignedByteElements) |
13612 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalShortElements) | 13609 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalShortElements) |
13613 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalUnsignedShortElements) | 13610 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalUnsignedShortElements) |
13614 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalIntElements) | 13611 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalIntElements) |
13615 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalUnsignedIntElements) | 13612 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalUnsignedIntElements) |
13616 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalFloatElements) | 13613 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalFloatElements) |
13617 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalDoubleElements) | 13614 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalDoubleElements) |
13618 | 13615 |
13619 #undef ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION | 13616 #undef ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION |
13620 | 13617 |
13621 | 13618 |
13622 RUNTIME_FUNCTION(MaybeObject*, Runtime_HaveSameMap) { | 13619 RUNTIME_FUNCTION(MaybeObject*, Runtime_HaveSameMap) { |
13623 ASSERT(args.length() == 2); | 13620 ASSERT(args.length() == 2); |
13624 CONVERT_CHECKED(JSObject, obj1, args[0]); | 13621 CONVERT_ARG_CHECKED(JSObject, obj1, 0); |
13625 CONVERT_CHECKED(JSObject, obj2, args[1]); | 13622 CONVERT_ARG_CHECKED(JSObject, obj2, 1); |
13626 return isolate->heap()->ToBoolean(obj1->map() == obj2->map()); | 13623 return isolate->heap()->ToBoolean(obj1->map() == obj2->map()); |
13627 } | 13624 } |
13628 | 13625 |
13629 // ---------------------------------------------------------------------------- | 13626 // ---------------------------------------------------------------------------- |
13630 // Implementation of Runtime | 13627 // Implementation of Runtime |
13631 | 13628 |
13632 #define F(name, number_of_args, result_size) \ | 13629 #define F(name, number_of_args, result_size) \ |
13633 { Runtime::k##name, Runtime::RUNTIME, #name, \ | 13630 { Runtime::k##name, Runtime::RUNTIME, #name, \ |
13634 FUNCTION_ADDR(Runtime_##name), number_of_args, result_size }, | 13631 FUNCTION_ADDR(Runtime_##name), number_of_args, result_size }, |
13635 | 13632 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13704 // Handle last resort GC and make sure to allow future allocations | 13701 // Handle last resort GC and make sure to allow future allocations |
13705 // to grow the heap without causing GCs (if possible). | 13702 // to grow the heap without causing GCs (if possible). |
13706 isolate->counters()->gc_last_resort_from_js()->Increment(); | 13703 isolate->counters()->gc_last_resort_from_js()->Increment(); |
13707 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, | 13704 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, |
13708 "Runtime::PerformGC"); | 13705 "Runtime::PerformGC"); |
13709 } | 13706 } |
13710 } | 13707 } |
13711 | 13708 |
13712 | 13709 |
13713 } } // namespace v8::internal | 13710 } } // namespace v8::internal |
OLD | NEW |