Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(159)

Side by Side Diff: src/runtime.cc

Issue 239313002: Harden runtime functions (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/v8conversions.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 465 matching lines...) Expand 10 before | Expand all | Expand 10 after
476 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_CreateObjectLiteral) { 476 RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_CreateObjectLiteral) {
477 HandleScope scope(isolate); 477 HandleScope scope(isolate);
478 ASSERT(args.length() == 4); 478 ASSERT(args.length() == 4);
479 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0); 479 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0);
480 CONVERT_SMI_ARG_CHECKED(literals_index, 1); 480 CONVERT_SMI_ARG_CHECKED(literals_index, 1);
481 CONVERT_ARG_HANDLE_CHECKED(FixedArray, constant_properties, 2); 481 CONVERT_ARG_HANDLE_CHECKED(FixedArray, constant_properties, 2);
482 CONVERT_SMI_ARG_CHECKED(flags, 3); 482 CONVERT_SMI_ARG_CHECKED(flags, 3);
483 bool should_have_fast_elements = (flags & ObjectLiteral::kFastElements) != 0; 483 bool should_have_fast_elements = (flags & ObjectLiteral::kFastElements) != 0;
484 bool has_function_literal = (flags & ObjectLiteral::kHasFunction) != 0; 484 bool has_function_literal = (flags & ObjectLiteral::kHasFunction) != 0;
485 485
486 RUNTIME_ASSERT(literals_index >= 0 && literals_index < literals->length());
487
486 // Check if boilerplate exists. If not, create it first. 488 // Check if boilerplate exists. If not, create it first.
487 Handle<Object> literal_site(literals->get(literals_index), isolate); 489 Handle<Object> literal_site(literals->get(literals_index), isolate);
488 Handle<AllocationSite> site; 490 Handle<AllocationSite> site;
489 Handle<JSObject> boilerplate; 491 Handle<JSObject> boilerplate;
490 if (*literal_site == isolate->heap()->undefined_value()) { 492 if (*literal_site == isolate->heap()->undefined_value()) {
491 Handle<Object> raw_boilerplate; 493 Handle<Object> raw_boilerplate;
492 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 494 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
493 isolate, raw_boilerplate, 495 isolate, raw_boilerplate,
494 CreateObjectLiteralBoilerplate( 496 CreateObjectLiteralBoilerplate(
495 isolate, 497 isolate,
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 555
554 return site; 556 return site;
555 } 557 }
556 558
557 559
558 static MaybeHandle<JSObject> CreateArrayLiteralImpl(Isolate* isolate, 560 static MaybeHandle<JSObject> CreateArrayLiteralImpl(Isolate* isolate,
559 Handle<FixedArray> literals, 561 Handle<FixedArray> literals,
560 int literals_index, 562 int literals_index,
561 Handle<FixedArray> elements, 563 Handle<FixedArray> elements,
562 int flags) { 564 int flags) {
565 RUNTIME_ASSERT(literals_index >= 0 && literals_index < literals->length());
Jakob Kummerow 2014/04/15 15:27:31 Urgh. After rebasing, this doesn't compile any mor
563 Handle<AllocationSite> site; 566 Handle<AllocationSite> site;
564 ASSIGN_RETURN_ON_EXCEPTION( 567 ASSIGN_RETURN_ON_EXCEPTION(
565 isolate, site, 568 isolate, site,
566 GetLiteralAllocationSite(isolate, literals, literals_index, elements), 569 GetLiteralAllocationSite(isolate, literals, literals_index, elements),
567 JSObject); 570 JSObject);
568 571
569 bool enable_mementos = (flags & ArrayLiteral::kDisableMementos) == 0; 572 bool enable_mementos = (flags & ArrayLiteral::kDisableMementos) == 0;
570 Handle<JSObject> boilerplate(JSObject::cast(site->transition_info())); 573 Handle<JSObject> boilerplate(JSObject::cast(site->transition_info()));
571 AllocationSiteUsageContext usage_context(isolate, site, enable_mementos); 574 AllocationSiteUsageContext usage_context(isolate, site, enable_mementos);
572 usage_context.EnterNewScope(); 575 usage_context.EnterNewScope();
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
810 Handle<JSArrayBuffer> array_buffer, 813 Handle<JSArrayBuffer> array_buffer,
811 size_t allocated_length, 814 size_t allocated_length,
812 bool initialize) { 815 bool initialize) {
813 void* data; 816 void* data;
814 CHECK(V8::ArrayBufferAllocator() != NULL); 817 CHECK(V8::ArrayBufferAllocator() != NULL);
815 if (allocated_length != 0) { 818 if (allocated_length != 0) {
816 if (initialize) { 819 if (initialize) {
817 data = V8::ArrayBufferAllocator()->Allocate(allocated_length); 820 data = V8::ArrayBufferAllocator()->Allocate(allocated_length);
818 } else { 821 } else {
819 data = 822 data =
820 V8::ArrayBufferAllocator()->AllocateUninitialized(allocated_length); 823 V8::ArrayBufferAllocator()->AllocateUninitialized(allocated_length);
821 } 824 }
822 if (data == NULL) return false; 825 if (data == NULL) return false;
823 } else { 826 } else {
824 data = NULL; 827 data = NULL;
825 } 828 }
826 829
827 SetupArrayBuffer(isolate, array_buffer, false, data, allocated_length); 830 SetupArrayBuffer(isolate, array_buffer, false, data, allocated_length);
828 831
829 isolate->heap()->AdjustAmountOfExternalAllocatedMemory(allocated_length); 832 isolate->heap()->AdjustAmountOfExternalAllocatedMemory(allocated_length);
830 833
(...skipping 16 matching lines...) Expand all
847 view_obj = handle(view->weak_next(), isolate); 850 view_obj = handle(view->weak_next(), isolate);
848 } 851 }
849 array_buffer->Neuter(); 852 array_buffer->Neuter();
850 } 853 }
851 854
852 855
853 RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayBufferInitialize) { 856 RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayBufferInitialize) {
854 HandleScope scope(isolate); 857 HandleScope scope(isolate);
855 ASSERT(args.length() == 2); 858 ASSERT(args.length() == 2);
856 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, holder, 0); 859 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, holder, 0);
857 CONVERT_ARG_HANDLE_CHECKED(Object, byteLength, 1); 860 CONVERT_ARG_HANDLE_CHECKED(Number, byteLength, 1);
858 size_t allocated_length; 861 size_t allocated_length = 0;
859 if (byteLength->IsSmi()) { 862 if (byteLength->IsSmi()) {
Jakob Kummerow 2014/04/15 15:27:31 Come to think of it, we can probably just call Num
860 allocated_length = Smi::cast(*byteLength)->value(); 863 int smi_value = Smi::cast(*byteLength)->value();
864 RUNTIME_ASSERT(smi_value >= 0);
865 allocated_length = smi_value;
861 } else { 866 } else {
862 ASSERT(byteLength->IsHeapNumber()); 867 ASSERT(byteLength->IsHeapNumber());
863 double value = HeapNumber::cast(*byteLength)->value(); 868 double value = HeapNumber::cast(*byteLength)->value();
864 869 if (value < 0 || value > std::numeric_limits<size_t>::max()) {
865 ASSERT(value >= 0);
866
867 if (value > std::numeric_limits<size_t>::max()) {
868 return isolate->Throw( 870 return isolate->Throw(
869 *isolate->factory()->NewRangeError("invalid_array_buffer_length", 871 *isolate->factory()->NewRangeError("invalid_array_buffer_length",
870 HandleVector<Object>(NULL, 0))); 872 HandleVector<Object>(NULL, 0)));
871 } 873 }
872
873 allocated_length = static_cast<size_t>(value); 874 allocated_length = static_cast<size_t>(value);
874 } 875 }
875 876
876 if (!Runtime::SetupArrayBufferAllocatingData(isolate, 877 if (!Runtime::SetupArrayBufferAllocatingData(isolate,
877 holder, allocated_length)) { 878 holder, allocated_length)) {
878 return isolate->Throw(*isolate->factory()-> 879 return isolate->Throw(
879 NewRangeError("invalid_array_buffer_length", 880 *isolate->factory()->NewRangeError("invalid_array_buffer_length",
880 HandleVector<Object>(NULL, 0))); 881 HandleVector<Object>(NULL, 0)));
881 } 882 }
882 883
883 return *holder; 884 return *holder;
884 } 885 }
885 886
886 887
887 RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayBufferGetByteLength) { 888 RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayBufferGetByteLength) {
888 SealHandleScope shs(isolate); 889 SealHandleScope shs(isolate);
889 ASSERT(args.length() == 1); 890 ASSERT(args.length() == 1);
890 CONVERT_ARG_CHECKED(JSArrayBuffer, holder, 0); 891 CONVERT_ARG_CHECKED(JSArrayBuffer, holder, 0);
891 return holder->byte_length(); 892 return holder->byte_length();
892 } 893 }
893 894
894 895
895 RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayBufferSliceImpl) { 896 RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayBufferSliceImpl) {
896 HandleScope scope(isolate); 897 HandleScope scope(isolate);
897 ASSERT(args.length() == 3); 898 ASSERT(args.length() == 3);
898 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, source, 0); 899 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, source, 0);
899 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, target, 1); 900 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, target, 1);
900 CONVERT_DOUBLE_ARG_CHECKED(first, 2); 901 CONVERT_ARG_HANDLE_CHECKED(Number, first, 2);
901 size_t start = static_cast<size_t>(first); 902 size_t start = NumberToSize(isolate, first);
Jakob Kummerow 2014/04/15 15:27:31 As discussed, we'll want to return an exception ra
902 size_t target_length = NumberToSize(isolate, target->byte_length()); 903 size_t target_length = NumberToSize(isolate, target->byte_length());
903 904
904 if (target_length == 0) return isolate->heap()->undefined_value(); 905 if (target_length == 0) return isolate->heap()->undefined_value();
905 906
906 size_t source_byte_length = NumberToSize(isolate, source->byte_length()); 907 size_t source_byte_length = NumberToSize(isolate, source->byte_length());
907 CHECK(start <= source_byte_length); 908 RUNTIME_ASSERT(start <= source_byte_length);
908 CHECK(source_byte_length - start >= target_length); 909 RUNTIME_ASSERT(source_byte_length - start >= target_length);
909 uint8_t* source_data = reinterpret_cast<uint8_t*>(source->backing_store()); 910 uint8_t* source_data = reinterpret_cast<uint8_t*>(source->backing_store());
910 uint8_t* target_data = reinterpret_cast<uint8_t*>(target->backing_store()); 911 uint8_t* target_data = reinterpret_cast<uint8_t*>(target->backing_store());
911 CopyBytes(target_data, source_data + start, target_length); 912 CopyBytes(target_data, source_data + start, target_length);
912 return isolate->heap()->undefined_value(); 913 return isolate->heap()->undefined_value();
913 } 914 }
914 915
915 916
916 RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayBufferIsView) { 917 RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayBufferIsView) {
917 HandleScope scope(isolate); 918 HandleScope scope(isolate);
918 ASSERT(args.length() == 1); 919 ASSERT(args.length() == 1);
919 CONVERT_ARG_CHECKED(Object, object, 0); 920 CONVERT_ARG_CHECKED(Object, object, 0);
920 return object->IsJSArrayBufferView() 921 return isolate->heap()->ToBoolean(object->IsJSArrayBufferView());
921 ? isolate->heap()->true_value()
922 : isolate->heap()->false_value();
923 } 922 }
924 923
925 924
926 RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayBufferNeuter) { 925 RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayBufferNeuter) {
927 HandleScope scope(isolate); 926 HandleScope scope(isolate);
927 ASSERT(args.length() == 1);
928 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, array_buffer, 0); 928 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, array_buffer, 0);
929 if (array_buffer->backing_store() == NULL) { 929 if (array_buffer->backing_store() == NULL) {
930 CHECK(Smi::FromInt(0) == array_buffer->byte_length()); 930 CHECK(Smi::FromInt(0) == array_buffer->byte_length());
931 return isolate->heap()->undefined_value(); 931 return isolate->heap()->undefined_value();
932 } 932 }
933 ASSERT(!array_buffer->is_external()); 933 ASSERT(!array_buffer->is_external());
934 void* backing_store = array_buffer->backing_store(); 934 void* backing_store = array_buffer->backing_store();
935 size_t byte_length = NumberToSize(isolate, array_buffer->byte_length()); 935 size_t byte_length = NumberToSize(isolate, array_buffer->byte_length());
936 array_buffer->set_is_external(true); 936 array_buffer->set_is_external(true);
937 Runtime::NeuterArrayBuffer(array_buffer); 937 Runtime::NeuterArrayBuffer(array_buffer);
(...skipping 25 matching lines...) Expand all
963 } 963 }
964 } 964 }
965 965
966 966
967 RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitialize) { 967 RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitialize) {
968 HandleScope scope(isolate); 968 HandleScope scope(isolate);
969 ASSERT(args.length() == 5); 969 ASSERT(args.length() == 5);
970 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0); 970 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0);
971 CONVERT_SMI_ARG_CHECKED(arrayId, 1); 971 CONVERT_SMI_ARG_CHECKED(arrayId, 1);
972 CONVERT_ARG_HANDLE_CHECKED(Object, maybe_buffer, 2); 972 CONVERT_ARG_HANDLE_CHECKED(Object, maybe_buffer, 2);
973 CONVERT_ARG_HANDLE_CHECKED(Object, byte_offset_object, 3); 973 CONVERT_ARG_HANDLE_CHECKED(Number, byte_offset_object, 3);
974 CONVERT_ARG_HANDLE_CHECKED(Object, byte_length_object, 4); 974 CONVERT_ARG_HANDLE_CHECKED(Number, byte_length_object, 4);
975 975
976 ASSERT(holder->GetInternalFieldCount() == 976 ASSERT(holder->GetInternalFieldCount() ==
977 v8::ArrayBufferView::kInternalFieldCount); 977 v8::ArrayBufferView::kInternalFieldCount);
978 for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { 978 for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) {
979 holder->SetInternalField(i, Smi::FromInt(0)); 979 holder->SetInternalField(i, Smi::FromInt(0));
980 } 980 }
981 981
982 ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization. 982 ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization.
983 size_t element_size = 1; // Bogus initialization. 983 size_t element_size = 1; // Bogus initialization.
984 ElementsKind external_elements_kind = 984 ElementsKind external_elements_kind =
985 EXTERNAL_INT8_ELEMENTS; // Bogus initialization. 985 EXTERNAL_INT8_ELEMENTS; // Bogus initialization.
986 ElementsKind fixed_elements_kind = INT8_ELEMENTS; // Bogus initialization. 986 ElementsKind fixed_elements_kind = INT8_ELEMENTS; // Bogus initialization.
987 Runtime::ArrayIdToTypeAndSize(arrayId, 987 Runtime::ArrayIdToTypeAndSize(arrayId,
988 &array_type, 988 &array_type,
989 &external_elements_kind, 989 &external_elements_kind,
990 &fixed_elements_kind, 990 &fixed_elements_kind,
991 &element_size); 991 &element_size);
992 992
993 holder->set_byte_offset(*byte_offset_object); 993 holder->set_byte_offset(*byte_offset_object);
994 holder->set_byte_length(*byte_length_object); 994 holder->set_byte_length(*byte_length_object);
995 995
996 size_t byte_offset = NumberToSize(isolate, *byte_offset_object); 996 size_t byte_offset = NumberToSize(isolate, *byte_offset_object);
997 size_t byte_length = NumberToSize(isolate, *byte_length_object); 997 size_t byte_length = NumberToSize(isolate, *byte_length_object);
998 998
999 CHECK_EQ(0, static_cast<int>(byte_length % element_size)); 999 CHECK_EQ(0, static_cast<int>(byte_length % element_size));
1000 size_t length = byte_length / element_size; 1000 size_t length = byte_length / element_size;
1001 1001
1002 if (length > static_cast<unsigned>(Smi::kMaxValue)) { 1002 if (length > static_cast<unsigned>(Smi::kMaxValue)) {
1003 return isolate->Throw(*isolate->factory()-> 1003 return isolate->Throw(
1004 NewRangeError("invalid_typed_array_length", 1004 *isolate->factory()->NewRangeError("invalid_typed_array_length",
1005 HandleVector<Object>(NULL, 0))); 1005 HandleVector<Object>(NULL, 0)));
1006 } 1006 }
1007 1007
1008 Handle<Object> length_obj = isolate->factory()->NewNumberFromSize(length); 1008 Handle<Object> length_obj = isolate->factory()->NewNumberFromSize(length);
1009 holder->set_length(*length_obj); 1009 holder->set_length(*length_obj);
1010 if (!maybe_buffer->IsNull()) { 1010 if (!maybe_buffer->IsNull()) {
1011 Handle<JSArrayBuffer> buffer(JSArrayBuffer::cast(*maybe_buffer)); 1011 Handle<JSArrayBuffer> buffer(JSArrayBuffer::cast(*maybe_buffer));
1012 1012
1013 size_t array_buffer_byte_length = 1013 size_t array_buffer_byte_length =
1014 NumberToSize(isolate, buffer->byte_length()); 1014 NumberToSize(isolate, buffer->byte_length());
1015 CHECK(byte_offset <= array_buffer_byte_length); 1015 CHECK(byte_offset <= array_buffer_byte_length);
(...skipping 14061 matching lines...) Expand 10 before | Expand all | Expand 10 after
15077 } 15077 }
15078 } 15078 }
15079 15079
15080 15080
15081 void Runtime::OutOfMemory() { 15081 void Runtime::OutOfMemory() {
15082 Heap::FatalProcessOutOfMemory("CALL_AND_RETRY_LAST", true); 15082 Heap::FatalProcessOutOfMemory("CALL_AND_RETRY_LAST", true);
15083 UNREACHABLE(); 15083 UNREACHABLE();
15084 } 15084 }
15085 15085
15086 } } // namespace v8::internal 15086 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/v8conversions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698