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 742 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 holder->set_table(*table); | 753 holder->set_table(*table); |
754 return *holder; | 754 return *holder; |
755 } | 755 } |
756 | 756 |
757 | 757 |
758 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetAdd) { | 758 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetAdd) { |
759 HandleScope scope(isolate); | 759 HandleScope scope(isolate); |
760 ASSERT(args.length() == 2); | 760 ASSERT(args.length() == 2); |
761 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); | 761 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); |
762 Handle<Object> key(args[1]); | 762 Handle<Object> key(args[1]); |
763 Handle<ObjectHashSet> table(ObjectHashSet::cast(holder->table())); | 763 Handle<ObjectHashSet> table(holder->table()); |
764 table = ObjectHashSetAdd(table, key); | 764 table = ObjectHashSetAdd(table, key); |
765 holder->set_table(*table); | 765 holder->set_table(*table); |
766 return isolate->heap()->undefined_value(); | 766 return isolate->heap()->undefined_value(); |
767 } | 767 } |
768 | 768 |
769 | 769 |
770 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetHas) { | 770 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetHas) { |
771 HandleScope scope(isolate); | 771 HandleScope scope(isolate); |
772 ASSERT(args.length() == 2); | 772 ASSERT(args.length() == 2); |
773 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); | 773 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); |
774 Handle<Object> key(args[1]); | 774 Handle<Object> key(args[1]); |
775 Handle<ObjectHashSet> table(ObjectHashSet::cast(holder->table())); | 775 Handle<ObjectHashSet> table(holder->table()); |
776 return isolate->heap()->ToBoolean(table->Contains(*key)); | 776 return isolate->heap()->ToBoolean(table->Contains(*key)); |
777 } | 777 } |
778 | 778 |
779 | 779 |
780 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetDelete) { | 780 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetDelete) { |
781 HandleScope scope(isolate); | 781 HandleScope scope(isolate); |
782 ASSERT(args.length() == 2); | 782 ASSERT(args.length() == 2); |
783 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); | 783 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); |
784 Handle<Object> key(args[1]); | 784 Handle<Object> key(args[1]); |
785 Handle<ObjectHashSet> table(ObjectHashSet::cast(holder->table())); | 785 Handle<ObjectHashSet> table(holder->table()); |
786 table = ObjectHashSetRemove(table, key); | 786 table = ObjectHashSetRemove(table, key); |
787 holder->set_table(*table); | 787 holder->set_table(*table); |
788 return isolate->heap()->undefined_value(); | 788 return isolate->heap()->undefined_value(); |
789 } | 789 } |
790 | 790 |
791 | 791 |
792 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetGetSize) { | 792 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetGetSize) { |
793 HandleScope scope(isolate); | 793 HandleScope scope(isolate); |
794 ASSERT(args.length() == 1); | 794 ASSERT(args.length() == 1); |
795 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); | 795 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); |
796 Handle<ObjectHashSet> table(ObjectHashSet::cast(holder->table())); | 796 Handle<ObjectHashSet> table(holder->table()); |
797 return Smi::FromInt(table->NumberOfElements()); | 797 return Smi::FromInt(table->NumberOfElements()); |
798 } | 798 } |
799 | 799 |
800 | 800 |
801 RUNTIME_FUNCTION(MaybeObject*, Runtime_MapInitialize) { | 801 RUNTIME_FUNCTION(MaybeObject*, Runtime_MapInitialize) { |
802 HandleScope scope(isolate); | 802 HandleScope scope(isolate); |
803 ASSERT(args.length() == 1); | 803 ASSERT(args.length() == 1); |
804 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); | 804 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); |
805 Handle<ObjectHashTable> table = isolate->factory()->NewObjectHashTable(0); | 805 Handle<ObjectHashTable> table = isolate->factory()->NewObjectHashTable(0); |
806 holder->set_table(*table); | 806 holder->set_table(*table); |
807 return *holder; | 807 return *holder; |
808 } | 808 } |
809 | 809 |
810 | 810 |
811 RUNTIME_FUNCTION(MaybeObject*, Runtime_MapGet) { | 811 RUNTIME_FUNCTION(MaybeObject*, Runtime_MapGet) { |
812 HandleScope scope(isolate); | 812 HandleScope scope(isolate); |
813 ASSERT(args.length() == 2); | 813 ASSERT(args.length() == 2); |
814 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); | 814 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); |
815 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 815 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
816 Handle<ObjectHashTable> table(ObjectHashTable::cast(holder->table())); | 816 Handle<ObjectHashTable> table(holder->table()); |
817 Handle<Object> lookup(table->Lookup(*key)); | 817 Handle<Object> lookup(table->Lookup(*key)); |
818 return lookup->IsTheHole() ? isolate->heap()->undefined_value() : *lookup; | 818 return lookup->IsTheHole() ? isolate->heap()->undefined_value() : *lookup; |
819 } | 819 } |
820 | 820 |
821 | 821 |
822 RUNTIME_FUNCTION(MaybeObject*, Runtime_MapHas) { | 822 RUNTIME_FUNCTION(MaybeObject*, Runtime_MapHas) { |
823 HandleScope scope(isolate); | 823 HandleScope scope(isolate); |
824 ASSERT(args.length() == 2); | 824 ASSERT(args.length() == 2); |
825 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); | 825 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); |
826 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 826 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
827 Handle<ObjectHashTable> table(ObjectHashTable::cast(holder->table())); | 827 Handle<ObjectHashTable> table(holder->table()); |
828 Handle<Object> lookup(table->Lookup(*key)); | 828 Handle<Object> lookup(table->Lookup(*key)); |
829 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); | 829 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); |
830 } | 830 } |
831 | 831 |
832 | 832 |
833 RUNTIME_FUNCTION(MaybeObject*, Runtime_MapDelete) { | 833 RUNTIME_FUNCTION(MaybeObject*, Runtime_MapDelete) { |
834 HandleScope scope(isolate); | 834 HandleScope scope(isolate); |
835 ASSERT(args.length() == 2); | 835 ASSERT(args.length() == 2); |
836 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); | 836 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); |
837 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 837 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
838 Handle<ObjectHashTable> table(ObjectHashTable::cast(holder->table())); | 838 Handle<ObjectHashTable> table(holder->table()); |
839 Handle<Object> lookup(table->Lookup(*key)); | 839 Handle<Object> lookup(table->Lookup(*key)); |
840 Handle<ObjectHashTable> new_table = | 840 Handle<ObjectHashTable> new_table = |
841 PutIntoObjectHashTable(table, key, isolate->factory()->the_hole_value()); | 841 PutIntoObjectHashTable(table, key, isolate->factory()->the_hole_value()); |
842 holder->set_table(*new_table); | 842 holder->set_table(*new_table); |
843 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); | 843 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); |
844 } | 844 } |
845 | 845 |
846 | 846 |
847 RUNTIME_FUNCTION(MaybeObject*, Runtime_MapSet) { | 847 RUNTIME_FUNCTION(MaybeObject*, Runtime_MapSet) { |
848 HandleScope scope(isolate); | 848 HandleScope scope(isolate); |
849 ASSERT(args.length() == 3); | 849 ASSERT(args.length() == 3); |
850 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); | 850 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); |
851 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); | 851 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); |
852 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); | 852 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
853 Handle<ObjectHashTable> table(ObjectHashTable::cast(holder->table())); | 853 Handle<ObjectHashTable> table(holder->table()); |
854 Handle<ObjectHashTable> new_table = PutIntoObjectHashTable(table, key, value); | 854 Handle<ObjectHashTable> new_table = PutIntoObjectHashTable(table, key, value); |
855 holder->set_table(*new_table); | 855 holder->set_table(*new_table); |
856 return isolate->heap()->undefined_value(); | 856 return isolate->heap()->undefined_value(); |
857 } | 857 } |
858 | 858 |
859 | 859 |
860 RUNTIME_FUNCTION(MaybeObject*, Runtime_MapGetSize) { | 860 RUNTIME_FUNCTION(MaybeObject*, Runtime_MapGetSize) { |
861 HandleScope scope(isolate); | 861 HandleScope scope(isolate); |
862 ASSERT(args.length() == 1); | 862 ASSERT(args.length() == 1); |
863 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); | 863 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); |
864 Handle<ObjectHashTable> table(ObjectHashTable::cast(holder->table())); | 864 Handle<ObjectHashTable> table(holder->table()); |
865 return Smi::FromInt(table->NumberOfElements()); | 865 return Smi::FromInt(table->NumberOfElements()); |
866 } | 866 } |
867 | 867 |
868 | 868 |
869 static JSWeakMap* WeakMapInitialize(Isolate* isolate, | 869 static JSWeakMap* WeakMapInitialize(Isolate* isolate, |
870 Handle<JSWeakMap> weakmap) { | 870 Handle<JSWeakMap> weakmap) { |
871 ASSERT(weakmap->map()->inobject_properties() == 0); | 871 ASSERT(weakmap->map()->inobject_properties() == 0); |
872 Handle<ObjectHashTable> table = isolate->factory()->NewObjectHashTable(0); | 872 Handle<ObjectHashTable> table = isolate->factory()->NewObjectHashTable(0); |
873 weakmap->set_table(*table); | 873 weakmap->set_table(*table); |
874 weakmap->set_next(Smi::FromInt(0)); | 874 weakmap->set_next(Smi::FromInt(0)); |
875 return *weakmap; | 875 return *weakmap; |
876 } | 876 } |
877 | 877 |
878 | 878 |
879 RUNTIME_FUNCTION(MaybeObject*, Runtime_WeakMapInitialize) { | 879 RUNTIME_FUNCTION(MaybeObject*, Runtime_WeakMapInitialize) { |
880 HandleScope scope(isolate); | 880 HandleScope scope(isolate); |
881 ASSERT(args.length() == 1); | 881 ASSERT(args.length() == 1); |
882 CONVERT_ARG_HANDLE_CHECKED(JSWeakMap, weakmap, 0); | 882 CONVERT_ARG_HANDLE_CHECKED(JSWeakMap, weakmap, 0); |
883 return WeakMapInitialize(isolate, weakmap); | 883 return WeakMapInitialize(isolate, weakmap); |
884 } | 884 } |
885 | 885 |
886 | 886 |
887 RUNTIME_FUNCTION(MaybeObject*, Runtime_WeakMapGet) { | 887 RUNTIME_FUNCTION(MaybeObject*, Runtime_WeakMapGet) { |
888 HandleScope scope(isolate); | 888 HandleScope scope(isolate); |
889 ASSERT(args.length() == 2); | 889 ASSERT(args.length() == 2); |
890 CONVERT_ARG_HANDLE_CHECKED(JSWeakMap, weakmap, 0); | 890 CONVERT_ARG_HANDLE_CHECKED(JSWeakMap, weakmap, 0); |
891 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, key, 1); | 891 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, key, 1); |
892 Handle<ObjectHashTable> table(ObjectHashTable::cast(weakmap->table())); | 892 Handle<ObjectHashTable> table(weakmap->table()); |
893 Handle<Object> lookup(table->Lookup(*key)); | 893 Handle<Object> lookup(table->Lookup(*key)); |
894 return lookup->IsTheHole() ? isolate->heap()->undefined_value() : *lookup; | 894 return lookup->IsTheHole() ? isolate->heap()->undefined_value() : *lookup; |
895 } | 895 } |
896 | 896 |
897 | 897 |
898 RUNTIME_FUNCTION(MaybeObject*, Runtime_WeakMapHas) { | 898 RUNTIME_FUNCTION(MaybeObject*, Runtime_WeakMapHas) { |
899 HandleScope scope(isolate); | 899 HandleScope scope(isolate); |
900 ASSERT(args.length() == 2); | 900 ASSERT(args.length() == 2); |
901 CONVERT_ARG_HANDLE_CHECKED(JSWeakMap, weakmap, 0); | 901 CONVERT_ARG_HANDLE_CHECKED(JSWeakMap, weakmap, 0); |
902 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, key, 1); | 902 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, key, 1); |
903 Handle<ObjectHashTable> table(ObjectHashTable::cast(weakmap->table())); | 903 Handle<ObjectHashTable> table(weakmap->table()); |
904 Handle<Object> lookup(table->Lookup(*key)); | 904 Handle<Object> lookup(table->Lookup(*key)); |
905 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); | 905 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); |
906 } | 906 } |
907 | 907 |
908 | 908 |
909 RUNTIME_FUNCTION(MaybeObject*, Runtime_WeakMapDelete) { | 909 RUNTIME_FUNCTION(MaybeObject*, Runtime_WeakMapDelete) { |
910 HandleScope scope(isolate); | 910 HandleScope scope(isolate); |
911 ASSERT(args.length() == 2); | 911 ASSERT(args.length() == 2); |
912 CONVERT_ARG_HANDLE_CHECKED(JSWeakMap, weakmap, 0); | 912 CONVERT_ARG_HANDLE_CHECKED(JSWeakMap, weakmap, 0); |
913 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, key, 1); | 913 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, key, 1); |
914 Handle<ObjectHashTable> table(ObjectHashTable::cast(weakmap->table())); | 914 Handle<ObjectHashTable> table(weakmap->table()); |
915 Handle<Object> lookup(table->Lookup(*key)); | 915 Handle<Object> lookup(table->Lookup(*key)); |
916 Handle<ObjectHashTable> new_table = | 916 Handle<ObjectHashTable> new_table = |
917 PutIntoObjectHashTable(table, key, isolate->factory()->the_hole_value()); | 917 PutIntoObjectHashTable(table, key, isolate->factory()->the_hole_value()); |
918 weakmap->set_table(*new_table); | 918 weakmap->set_table(*new_table); |
919 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); | 919 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); |
920 } | 920 } |
921 | 921 |
922 | 922 |
923 RUNTIME_FUNCTION(MaybeObject*, Runtime_WeakMapSet) { | 923 RUNTIME_FUNCTION(MaybeObject*, Runtime_WeakMapSet) { |
924 HandleScope scope(isolate); | 924 HandleScope scope(isolate); |
925 ASSERT(args.length() == 3); | 925 ASSERT(args.length() == 3); |
926 CONVERT_ARG_HANDLE_CHECKED(JSWeakMap, weakmap, 0); | 926 CONVERT_ARG_HANDLE_CHECKED(JSWeakMap, weakmap, 0); |
927 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, key, 1); | 927 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, key, 1); |
928 Handle<Object> value(args[2]); | 928 Handle<Object> value(args[2]); |
929 Handle<ObjectHashTable> table(ObjectHashTable::cast(weakmap->table())); | 929 Handle<ObjectHashTable> table(weakmap->table()); |
930 Handle<ObjectHashTable> new_table = PutIntoObjectHashTable(table, key, value); | 930 Handle<ObjectHashTable> new_table = PutIntoObjectHashTable(table, key, value); |
931 weakmap->set_table(*new_table); | 931 weakmap->set_table(*new_table); |
932 return isolate->heap()->undefined_value(); | 932 return isolate->heap()->undefined_value(); |
933 } | 933 } |
934 | 934 |
935 | 935 |
936 RUNTIME_FUNCTION(MaybeObject*, Runtime_ClassOf) { | 936 RUNTIME_FUNCTION(MaybeObject*, Runtime_ClassOf) { |
937 NoHandleAllocation ha; | 937 NoHandleAllocation ha; |
938 ASSERT(args.length() == 1); | 938 ASSERT(args.length() == 1); |
939 Object* obj = args[0]; | 939 Object* obj = args[0]; |
(...skipping 12587 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13527 // Handle last resort GC and make sure to allow future allocations | 13527 // Handle last resort GC and make sure to allow future allocations |
13528 // to grow the heap without causing GCs (if possible). | 13528 // to grow the heap without causing GCs (if possible). |
13529 isolate->counters()->gc_last_resort_from_js()->Increment(); | 13529 isolate->counters()->gc_last_resort_from_js()->Increment(); |
13530 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, | 13530 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, |
13531 "Runtime::PerformGC"); | 13531 "Runtime::PerformGC"); |
13532 } | 13532 } |
13533 } | 13533 } |
13534 | 13534 |
13535 | 13535 |
13536 } } // namespace v8::internal | 13536 } } // namespace v8::internal |
OLD | NEW |