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

Side by Side Diff: src/runtime.cc

Issue 150813004: In-heap small typed arrays (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: CR feedback Created 6 years, 9 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
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 885 matching lines...) Expand 10 before | Expand all | Expand 10 after
896 void* backing_store = array_buffer->backing_store(); 896 void* backing_store = array_buffer->backing_store();
897 size_t byte_length = NumberToSize(isolate, array_buffer->byte_length()); 897 size_t byte_length = NumberToSize(isolate, array_buffer->byte_length());
898 array_buffer->set_is_external(true); 898 array_buffer->set_is_external(true);
899 Runtime::NeuterArrayBuffer(array_buffer); 899 Runtime::NeuterArrayBuffer(array_buffer);
900 V8::ArrayBufferAllocator()->Free(backing_store, byte_length); 900 V8::ArrayBufferAllocator()->Free(backing_store, byte_length);
901 return isolate->heap()->undefined_value(); 901 return isolate->heap()->undefined_value();
902 } 902 }
903 903
904 904
905 void Runtime::ArrayIdToTypeAndSize( 905 void Runtime::ArrayIdToTypeAndSize(
906 int arrayId, ExternalArrayType* array_type, size_t* element_size) { 906 int arrayId,
907 ExternalArrayType* array_type,
908 ElementsKind* external_elements_kind,
909 ElementsKind* fixed_elements_kind,
910 size_t* element_size) {
907 switch (arrayId) { 911 switch (arrayId) {
908 #define ARRAY_ID_CASE(Type, type, TYPE, ctype, size) \ 912 #define ARRAY_ID_CASE(Type, type, TYPE, ctype, size) \
909 case ARRAY_ID_##TYPE: \ 913 case ARRAY_ID_##TYPE: \
910 *array_type = kExternal##Type##Array; \ 914 *array_type = kExternal##Type##Array; \
915 *external_elements_kind = EXTERNAL_##TYPE##_ELEMENTS; \
916 *fixed_elements_kind = TYPE##_ELEMENTS; \
911 *element_size = size; \ 917 *element_size = size; \
912 break; 918 break;
913 919
914 TYPED_ARRAYS(ARRAY_ID_CASE) 920 TYPED_ARRAYS(ARRAY_ID_CASE)
915 #undef ARRAY_ID_CASE 921 #undef ARRAY_ID_CASE
916 922
917 default: 923 default:
918 UNREACHABLE(); 924 UNREACHABLE();
919 } 925 }
920 } 926 }
921 927
922 928
923 RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitialize) { 929 RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitialize) {
924 HandleScope scope(isolate); 930 HandleScope scope(isolate);
925 ASSERT(args.length() == 5); 931 ASSERT(args.length() == 5);
926 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0); 932 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0);
927 CONVERT_SMI_ARG_CHECKED(arrayId, 1); 933 CONVERT_SMI_ARG_CHECKED(arrayId, 1);
928 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, buffer, 2); 934 CONVERT_ARG_HANDLE_CHECKED(Object, maybe_buffer, 2);
929 CONVERT_ARG_HANDLE_CHECKED(Object, byte_offset_object, 3); 935 CONVERT_ARG_HANDLE_CHECKED(Object, byte_offset_object, 3);
930 CONVERT_ARG_HANDLE_CHECKED(Object, byte_length_object, 4); 936 CONVERT_ARG_HANDLE_CHECKED(Object, byte_length_object, 4);
931 937
932 ASSERT(holder->GetInternalFieldCount() == 938 ASSERT(holder->GetInternalFieldCount() ==
933 v8::ArrayBufferView::kInternalFieldCount); 939 v8::ArrayBufferView::kInternalFieldCount);
934 for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { 940 for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) {
935 holder->SetInternalField(i, Smi::FromInt(0)); 941 holder->SetInternalField(i, Smi::FromInt(0));
936 } 942 }
937 943
938 ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization. 944 ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization.
939 size_t element_size = 1; // Bogus initialization. 945 size_t element_size = 1; // Bogus initialization.
940 Runtime::ArrayIdToTypeAndSize(arrayId, &array_type, &element_size); 946 ElementsKind external_elements_kind = EXTERNAL_INT8_ELEMENTS;
947 ElementsKind fixed_elements_kind = INT8_ELEMENTS;
948 Runtime::ArrayIdToTypeAndSize(arrayId,
949 &array_type,
950 &external_elements_kind,
951 &fixed_elements_kind,
952 &element_size);
941 953
942 holder->set_buffer(*buffer);
943 holder->set_byte_offset(*byte_offset_object); 954 holder->set_byte_offset(*byte_offset_object);
944 holder->set_byte_length(*byte_length_object); 955 holder->set_byte_length(*byte_length_object);
945 956
946 size_t byte_offset = NumberToSize(isolate, *byte_offset_object); 957 size_t byte_offset = NumberToSize(isolate, *byte_offset_object);
947 size_t byte_length = NumberToSize(isolate, *byte_length_object); 958 size_t byte_length = NumberToSize(isolate, *byte_length_object);
948 size_t array_buffer_byte_length =
949 NumberToSize(isolate, buffer->byte_length());
950 CHECK(byte_offset <= array_buffer_byte_length);
951 CHECK(array_buffer_byte_length - byte_offset >= byte_length);
952 959
953 CHECK_EQ(0, static_cast<int>(byte_length % element_size)); 960 CHECK_EQ(0, static_cast<int>(byte_length % element_size));
954 size_t length = byte_length / element_size; 961 size_t length = byte_length / element_size;
955 962
956 if (length > static_cast<unsigned>(Smi::kMaxValue)) { 963 if (length > static_cast<unsigned>(Smi::kMaxValue)) {
957 return isolate->Throw(*isolate->factory()-> 964 return isolate->Throw(*isolate->factory()->
958 NewRangeError("invalid_typed_array_length", 965 NewRangeError("invalid_typed_array_length",
959 HandleVector<Object>(NULL, 0))); 966 HandleVector<Object>(NULL, 0)));
960 } 967 }
961 968
962 Handle<Object> length_obj = isolate->factory()->NewNumberFromSize(length); 969 Handle<Object> length_obj = isolate->factory()->NewNumberFromSize(length);
963 holder->set_length(*length_obj); 970 holder->set_length(*length_obj);
964 holder->set_weak_next(buffer->weak_first_view()); 971 if (!maybe_buffer->IsNull()) {
965 buffer->set_weak_first_view(*holder); 972 Handle<JSArrayBuffer> buffer(JSArrayBuffer::cast(*maybe_buffer));
966 973
967 Handle<ExternalArray> elements = 974 size_t array_buffer_byte_length =
968 isolate->factory()->NewExternalArray( 975 NumberToSize(isolate, buffer->byte_length());
969 static_cast<int>(length), array_type, 976 CHECK(byte_offset <= array_buffer_byte_length);
970 static_cast<uint8_t*>(buffer->backing_store()) + byte_offset); 977 CHECK(array_buffer_byte_length - byte_offset >= byte_length);
971 holder->set_elements(*elements); 978
979 holder->set_buffer(*buffer);
980 holder->set_weak_next(buffer->weak_first_view());
981 buffer->set_weak_first_view(*holder);
982
983 Handle<ExternalArray> elements =
984 isolate->factory()->NewExternalArray(
985 static_cast<int>(length), array_type,
986 static_cast<uint8_t*>(buffer->backing_store()) + byte_offset);
987 Handle<Map> map =
988 isolate->factory()->GetElementsTransitionMap(
989 holder, external_elements_kind);
990 holder->set_map_and_elements(*map, *elements);
991 ASSERT(IsExternalArrayElementsKind(holder->map()->elements_kind()));
992 } else {
993 holder->set_buffer(Smi::FromInt(0));
994 holder->set_weak_next(isolate->heap()->undefined_value());
995 Handle<FixedTypedArrayBase> elements =
996 isolate->factory()->NewFixedTypedArray(
997 static_cast<int>(length), array_type);
998 holder->set_elements(*elements);
999 }
972 return isolate->heap()->undefined_value(); 1000 return isolate->heap()->undefined_value();
973 } 1001 }
974 1002
975 1003
976 // Initializes a typed array from an array-like object. 1004 // Initializes a typed array from an array-like object.
977 // If an array-like object happens to be a typed array of the same type, 1005 // If an array-like object happens to be a typed array of the same type,
978 // initializes backing store using memove. 1006 // initializes backing store using memove.
979 // 1007 //
980 // Returns true if backing store was initialized or false otherwise. 1008 // Returns true if backing store was initialized or false otherwise.
981 RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitializeFromArrayLike) { 1009 RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitializeFromArrayLike) {
982 HandleScope scope(isolate); 1010 HandleScope scope(isolate);
983 ASSERT(args.length() == 4); 1011 ASSERT(args.length() == 4);
984 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0); 1012 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0);
985 CONVERT_SMI_ARG_CHECKED(arrayId, 1); 1013 CONVERT_SMI_ARG_CHECKED(arrayId, 1);
986 CONVERT_ARG_HANDLE_CHECKED(Object, source, 2); 1014 CONVERT_ARG_HANDLE_CHECKED(Object, source, 2);
987 CONVERT_ARG_HANDLE_CHECKED(Object, length_obj, 3); 1015 CONVERT_ARG_HANDLE_CHECKED(Object, length_obj, 3);
988 1016
989 ASSERT(holder->GetInternalFieldCount() == 1017 ASSERT(holder->GetInternalFieldCount() ==
990 v8::ArrayBufferView::kInternalFieldCount); 1018 v8::ArrayBufferView::kInternalFieldCount);
991 for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { 1019 for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) {
992 holder->SetInternalField(i, Smi::FromInt(0)); 1020 holder->SetInternalField(i, Smi::FromInt(0));
993 } 1021 }
994 1022
995 ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization. 1023 ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization.
996 size_t element_size = 1; // Bogus initialization. 1024 size_t element_size = 1; // Bogus initialization.
997 Runtime::ArrayIdToTypeAndSize(arrayId, &array_type, &element_size); 1025 ElementsKind external_elements_kind;
1026 ElementsKind fixed_elements_kind;
1027 Runtime::ArrayIdToTypeAndSize(arrayId,
1028 &array_type,
1029 &external_elements_kind,
1030 &fixed_elements_kind,
1031 &element_size);
998 1032
999 Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer(); 1033 Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer();
1000 if (source->IsJSTypedArray() && 1034 if (source->IsJSTypedArray() &&
1001 JSTypedArray::cast(*source)->type() == array_type) { 1035 JSTypedArray::cast(*source)->type() == array_type) {
1002 length_obj = Handle<Object>(JSTypedArray::cast(*source)->length(), isolate); 1036 length_obj = Handle<Object>(JSTypedArray::cast(*source)->length(), isolate);
1003 } 1037 }
1004 size_t length = NumberToSize(isolate, *length_obj); 1038 size_t length = NumberToSize(isolate, *length_obj);
1005 1039
1006 if ((length > static_cast<unsigned>(Smi::kMaxValue)) || 1040 if ((length > static_cast<unsigned>(Smi::kMaxValue)) ||
1007 (length > (kMaxInt / element_size))) { 1041 (length > (kMaxInt / element_size))) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1040 isolate->factory()->NewNumberFromSize(byte_length)); 1074 isolate->factory()->NewNumberFromSize(byte_length));
1041 holder->set_byte_length(*byte_length_obj); 1075 holder->set_byte_length(*byte_length_obj);
1042 holder->set_length(*length_obj); 1076 holder->set_length(*length_obj);
1043 holder->set_weak_next(buffer->weak_first_view()); 1077 holder->set_weak_next(buffer->weak_first_view());
1044 buffer->set_weak_first_view(*holder); 1078 buffer->set_weak_first_view(*holder);
1045 1079
1046 Handle<ExternalArray> elements = 1080 Handle<ExternalArray> elements =
1047 isolate->factory()->NewExternalArray( 1081 isolate->factory()->NewExternalArray(
1048 static_cast<int>(length), array_type, 1082 static_cast<int>(length), array_type,
1049 static_cast<uint8_t*>(buffer->backing_store())); 1083 static_cast<uint8_t*>(buffer->backing_store()));
1050 holder->set_elements(*elements); 1084 Handle<Map> map =
1085 isolate->factory()->GetElementsTransitionMap(
1086 holder, external_elements_kind);
1087 holder->set_map_and_elements(*map, *elements);
1051 1088
1052 if (source->IsJSTypedArray()) { 1089 if (source->IsJSTypedArray()) {
1053 Handle<JSTypedArray> typed_array(JSTypedArray::cast(*source)); 1090 Handle<JSTypedArray> typed_array(JSTypedArray::cast(*source));
1054 1091
1055 if (typed_array->type() == holder->type()) { 1092 if (typed_array->type() == holder->type()) {
1056 uint8_t* backing_store = 1093 uint8_t* backing_store =
1057 static_cast<uint8_t*>( 1094 static_cast<uint8_t*>(
1058 JSArrayBuffer::cast(typed_array->buffer())->backing_store()); 1095 typed_array->GetBuffer()->backing_store());
1059 size_t source_byte_offset = 1096 size_t source_byte_offset =
1060 NumberToSize(isolate, typed_array->byte_offset()); 1097 NumberToSize(isolate, typed_array->byte_offset());
1061 memcpy( 1098 memcpy(
1062 buffer->backing_store(), 1099 buffer->backing_store(),
1063 backing_store + source_byte_offset, 1100 backing_store + source_byte_offset,
1064 byte_length); 1101 byte_length);
1065 return *isolate->factory()->true_value(); 1102 return *isolate->factory()->true_value();
1066 } else { 1103 } else {
1067 return *isolate->factory()->false_value(); 1104 return *isolate->factory()->false_value();
1068 } 1105 }
1069 } 1106 }
1070 1107
1071 return *isolate->factory()->false_value(); 1108 return *isolate->factory()->false_value();
1072 } 1109 }
1073 1110
1074 1111
1075 #define TYPED_ARRAY_GETTER(getter, accessor) \ 1112 #define TYPED_ARRAY_GETTER(getter, accessor) \
1076 RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayGet##getter) { \ 1113 RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayGet##getter) { \
1077 HandleScope scope(isolate); \ 1114 HandleScope scope(isolate); \
1078 ASSERT(args.length() == 1); \ 1115 ASSERT(args.length() == 1); \
1079 CONVERT_ARG_HANDLE_CHECKED(Object, holder, 0); \ 1116 CONVERT_ARG_HANDLE_CHECKED(Object, holder, 0); \
1080 if (!holder->IsJSTypedArray()) \ 1117 if (!holder->IsJSTypedArray()) \
1081 return isolate->Throw(*isolate->factory()->NewTypeError( \ 1118 return isolate->Throw(*isolate->factory()->NewTypeError( \
1082 "not_typed_array", HandleVector<Object>(NULL, 0))); \ 1119 "not_typed_array", HandleVector<Object>(NULL, 0))); \
1083 Handle<JSTypedArray> typed_array(JSTypedArray::cast(*holder)); \ 1120 Handle<JSTypedArray> typed_array(JSTypedArray::cast(*holder)); \
1084 return typed_array->accessor(); \ 1121 return typed_array->accessor(); \
1085 } 1122 }
1086 1123
1087 TYPED_ARRAY_GETTER(Buffer, buffer)
1088 TYPED_ARRAY_GETTER(ByteLength, byte_length) 1124 TYPED_ARRAY_GETTER(ByteLength, byte_length)
1089 TYPED_ARRAY_GETTER(ByteOffset, byte_offset) 1125 TYPED_ARRAY_GETTER(ByteOffset, byte_offset)
1090 TYPED_ARRAY_GETTER(Length, length) 1126 TYPED_ARRAY_GETTER(Length, length)
1091 1127
1092 #undef TYPED_ARRAY_GETTER 1128 #undef TYPED_ARRAY_GETTER
1093 1129
1130 RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayGetBuffer) {
1131 HandleScope scope(isolate);
1132 ASSERT(args.length() == 1);
1133 CONVERT_ARG_HANDLE_CHECKED(Object, holder, 0);
1134 if (!holder->IsJSTypedArray())
1135 return isolate->Throw(*isolate->factory()->NewTypeError(
1136 "not_typed_array", HandleVector<Object>(NULL, 0)));
1137 Handle<JSTypedArray> typed_array(JSTypedArray::cast(*holder));
1138 return *typed_array->GetBuffer();
1139 }
1140
1141
1094 // Return codes for Runtime_TypedArraySetFastCases. 1142 // Return codes for Runtime_TypedArraySetFastCases.
1095 // Should be synchronized with typedarray.js natives. 1143 // Should be synchronized with typedarray.js natives.
1096 enum TypedArraySetResultCodes { 1144 enum TypedArraySetResultCodes {
1097 // Set from typed array of the same type. 1145 // Set from typed array of the same type.
1098 // This is processed by TypedArraySetFastCases 1146 // This is processed by TypedArraySetFastCases
1099 TYPED_ARRAY_SET_TYPED_ARRAY_SAME_TYPE = 0, 1147 TYPED_ARRAY_SET_TYPED_ARRAY_SAME_TYPE = 0,
1100 // Set from typed array of the different type, overlapping in memory. 1148 // Set from typed array of the different type, overlapping in memory.
1101 TYPED_ARRAY_SET_TYPED_ARRAY_OVERLAPPING = 1, 1149 TYPED_ARRAY_SET_TYPED_ARRAY_OVERLAPPING = 1,
1102 // Set from typed array of the different type, non-overlapping. 1150 // Set from typed array of the different type, non-overlapping.
1103 TYPED_ARRAY_SET_TYPED_ARRAY_NONOVERLAPPING = 2, 1151 TYPED_ARRAY_SET_TYPED_ARRAY_NONOVERLAPPING = 2,
(...skipping 25 matching lines...) Expand all
1129 if (offset > target_length || 1177 if (offset > target_length ||
1130 offset + source_length > target_length || 1178 offset + source_length > target_length ||
1131 offset + source_length < offset) // overflow 1179 offset + source_length < offset) // overflow
1132 return isolate->Throw(*isolate->factory()->NewRangeError( 1180 return isolate->Throw(*isolate->factory()->NewRangeError(
1133 "typed_array_set_source_too_large", HandleVector<Object>(NULL, 0))); 1181 "typed_array_set_source_too_large", HandleVector<Object>(NULL, 0)));
1134 1182
1135 size_t target_offset = NumberToSize(isolate, target->byte_offset()); 1183 size_t target_offset = NumberToSize(isolate, target->byte_offset());
1136 size_t source_offset = NumberToSize(isolate, source->byte_offset()); 1184 size_t source_offset = NumberToSize(isolate, source->byte_offset());
1137 uint8_t* target_base = 1185 uint8_t* target_base =
1138 static_cast<uint8_t*>( 1186 static_cast<uint8_t*>(
1139 JSArrayBuffer::cast(target->buffer())->backing_store()) + target_offset; 1187 target->GetBuffer()->backing_store()) + target_offset;
1140 uint8_t* source_base = 1188 uint8_t* source_base =
1141 static_cast<uint8_t*>( 1189 static_cast<uint8_t*>(
1142 JSArrayBuffer::cast(source->buffer())->backing_store()) + source_offset; 1190 source->GetBuffer()->backing_store()) + source_offset;
1143 1191
1144 // Typed arrays of the same type: use memmove. 1192 // Typed arrays of the same type: use memmove.
1145 if (target->type() == source->type()) { 1193 if (target->type() == source->type()) {
1146 memmove(target_base + offset * target->element_size(), 1194 memmove(target_base + offset * target->element_size(),
1147 source_base, source_byte_length); 1195 source_base, source_byte_length);
1148 return Smi::FromInt(TYPED_ARRAY_SET_TYPED_ARRAY_SAME_TYPE); 1196 return Smi::FromInt(TYPED_ARRAY_SET_TYPED_ARRAY_SAME_TYPE);
1149 } 1197 }
1150 1198
1151 // Typed arrays of different types over the same backing store 1199 // Typed arrays of different types over the same backing store
1152 if ((source_base <= target_base && 1200 if ((source_base <= target_base &&
1153 source_base + source_byte_length > target_base) || 1201 source_base + source_byte_length > target_base) ||
1154 (target_base <= source_base && 1202 (target_base <= source_base &&
1155 target_base + target_byte_length > source_base)) { 1203 target_base + target_byte_length > source_base)) {
1156 // We do not support overlapping ArrayBuffers 1204 // We do not support overlapping ArrayBuffers
1157 ASSERT( 1205 ASSERT(
1158 JSArrayBuffer::cast(target->buffer())->backing_store() == 1206 target->GetBuffer()->backing_store() ==
1159 JSArrayBuffer::cast(source->buffer())->backing_store()); 1207 source->GetBuffer()->backing_store());
1160 return Smi::FromInt(TYPED_ARRAY_SET_TYPED_ARRAY_OVERLAPPING); 1208 return Smi::FromInt(TYPED_ARRAY_SET_TYPED_ARRAY_OVERLAPPING);
1161 } else { // Non-overlapping typed arrays 1209 } else { // Non-overlapping typed arrays
1162 return Smi::FromInt(TYPED_ARRAY_SET_TYPED_ARRAY_NONOVERLAPPING); 1210 return Smi::FromInt(TYPED_ARRAY_SET_TYPED_ARRAY_NONOVERLAPPING);
1163 } 1211 }
1164 } 1212 }
1165 1213
1166 1214
1215 RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayMaxSizeInHeap) {
1216 ASSERT_OBJECT_SIZE(FLAG_typed_array_max_size_in_heap);
1217 return Smi::FromInt(FLAG_typed_array_max_size_in_heap);
1218 }
1219
1220
1167 RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewInitialize) { 1221 RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewInitialize) {
1168 HandleScope scope(isolate); 1222 HandleScope scope(isolate);
1169 ASSERT(args.length() == 4); 1223 ASSERT(args.length() == 4);
1170 CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0); 1224 CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
1171 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, buffer, 1); 1225 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, buffer, 1);
1172 CONVERT_ARG_HANDLE_CHECKED(Object, byte_offset, 2); 1226 CONVERT_ARG_HANDLE_CHECKED(Object, byte_offset, 2);
1173 CONVERT_ARG_HANDLE_CHECKED(Object, byte_length, 3); 1227 CONVERT_ARG_HANDLE_CHECKED(Object, byte_length, 3);
1174 1228
1175 ASSERT(holder->GetInternalFieldCount() == 1229 ASSERT(holder->GetInternalFieldCount() ==
1176 v8::ArrayBufferView::kInternalFieldCount); 1230 v8::ArrayBufferView::kInternalFieldCount);
(...skipping 13510 matching lines...) Expand 10 before | Expand all | Expand 10 after
14687 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasExternal##Type##Elements) { \ 14741 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasExternal##Type##Elements) { \
14688 CONVERT_ARG_CHECKED(JSObject, obj, 0); \ 14742 CONVERT_ARG_CHECKED(JSObject, obj, 0); \
14689 return isolate->heap()->ToBoolean(obj->HasExternal##Type##Elements()); \ 14743 return isolate->heap()->ToBoolean(obj->HasExternal##Type##Elements()); \
14690 } 14744 }
14691 14745
14692 TYPED_ARRAYS(TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION) 14746 TYPED_ARRAYS(TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION)
14693 14747
14694 #undef TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION 14748 #undef TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION
14695 14749
14696 14750
14751 #define FIXED_TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION(Type, type, TYPE, ctype, s) \
14752 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasFixed##Type##Elements) { \
14753 CONVERT_ARG_CHECKED(JSObject, obj, 0); \
14754 return isolate->heap()->ToBoolean(obj->HasFixed##Type##Elements()); \
14755 }
14756
14757 TYPED_ARRAYS(FIXED_TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION)
14758
14759 #undef FIXED_TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION
14760
14761
14697 RUNTIME_FUNCTION(MaybeObject*, Runtime_HaveSameMap) { 14762 RUNTIME_FUNCTION(MaybeObject*, Runtime_HaveSameMap) {
14698 SealHandleScope shs(isolate); 14763 SealHandleScope shs(isolate);
14699 ASSERT(args.length() == 2); 14764 ASSERT(args.length() == 2);
14700 CONVERT_ARG_CHECKED(JSObject, obj1, 0); 14765 CONVERT_ARG_CHECKED(JSObject, obj1, 0);
14701 CONVERT_ARG_CHECKED(JSObject, obj2, 1); 14766 CONVERT_ARG_CHECKED(JSObject, obj2, 1);
14702 return isolate->heap()->ToBoolean(obj1->map() == obj2->map()); 14767 return isolate->heap()->ToBoolean(obj1->map() == obj2->map());
14703 } 14768 }
14704 14769
14705 14770
14706 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsAccessCheckNeeded) { 14771 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsAccessCheckNeeded) {
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
15060 // Handle last resort GC and make sure to allow future allocations 15125 // Handle last resort GC and make sure to allow future allocations
15061 // to grow the heap without causing GCs (if possible). 15126 // to grow the heap without causing GCs (if possible).
15062 isolate->counters()->gc_last_resort_from_js()->Increment(); 15127 isolate->counters()->gc_last_resort_from_js()->Increment();
15063 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, 15128 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags,
15064 "Runtime::PerformGC"); 15129 "Runtime::PerformGC");
15065 } 15130 }
15066 } 15131 }
15067 15132
15068 15133
15069 } } // namespace v8::internal 15134 } } // namespace v8::internal
OLDNEW
« src/hydrogen.cc ('K') | « src/runtime.h ('k') | src/typedarray.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698