| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
| 8 #include "src/messages.h" | 8 #include "src/messages.h" |
| 9 #include "src/runtime/runtime.h" | 9 #include "src/runtime/runtime.h" |
| 10 #include "src/runtime/runtime-utils.h" | 10 #include "src/runtime/runtime-utils.h" |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 size_t element_size = 1; // Bogus initialization. | 279 size_t element_size = 1; // Bogus initialization. |
| 280 ElementsKind external_elements_kind = | 280 ElementsKind external_elements_kind = |
| 281 EXTERNAL_INT8_ELEMENTS; // Bogus intialization. | 281 EXTERNAL_INT8_ELEMENTS; // Bogus intialization. |
| 282 ElementsKind fixed_elements_kind = INT8_ELEMENTS; // Bogus initialization. | 282 ElementsKind fixed_elements_kind = INT8_ELEMENTS; // Bogus initialization. |
| 283 Runtime::ArrayIdToTypeAndSize(arrayId, &array_type, &external_elements_kind, | 283 Runtime::ArrayIdToTypeAndSize(arrayId, &array_type, &external_elements_kind, |
| 284 &fixed_elements_kind, &element_size); | 284 &fixed_elements_kind, &element_size); |
| 285 | 285 |
| 286 RUNTIME_ASSERT(holder->map()->elements_kind() == fixed_elements_kind); | 286 RUNTIME_ASSERT(holder->map()->elements_kind() == fixed_elements_kind); |
| 287 | 287 |
| 288 Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer(); | 288 Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer(); |
| 289 size_t length = 0; |
| 289 if (source->IsJSTypedArray() && | 290 if (source->IsJSTypedArray() && |
| 290 JSTypedArray::cast(*source)->type() == array_type) { | 291 JSTypedArray::cast(*source)->type() == array_type) { |
| 291 length_obj = Handle<Object>(JSTypedArray::cast(*source)->length(), isolate); | 292 length_obj = handle(JSTypedArray::cast(*source)->length(), isolate); |
| 293 length = JSTypedArray::cast(*source)->length_value(); |
| 294 } else { |
| 295 RUNTIME_ASSERT(TryNumberToSize(isolate, *length_obj, &length)); |
| 292 } | 296 } |
| 293 size_t length = 0; | |
| 294 RUNTIME_ASSERT(TryNumberToSize(isolate, *length_obj, &length)); | |
| 295 | 297 |
| 296 if ((length > static_cast<unsigned>(Smi::kMaxValue)) || | 298 if ((length > static_cast<unsigned>(Smi::kMaxValue)) || |
| 297 (length > (kMaxInt / element_size))) { | 299 (length > (kMaxInt / element_size))) { |
| 298 THROW_NEW_ERROR_RETURN_FAILURE( | 300 THROW_NEW_ERROR_RETURN_FAILURE( |
| 299 isolate, NewRangeError(MessageTemplate::kInvalidTypedArrayLength)); | 301 isolate, NewRangeError(MessageTemplate::kInvalidTypedArrayLength)); |
| 300 } | 302 } |
| 301 size_t byte_length = length * element_size; | 303 size_t byte_length = length * element_size; |
| 302 | 304 |
| 303 DCHECK(holder->GetInternalFieldCount() == | 305 DCHECK(holder->GetInternalFieldCount() == |
| 304 v8::ArrayBufferView::kInternalFieldCount); | 306 v8::ArrayBufferView::kInternalFieldCount); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 } | 358 } |
| 357 } | 359 } |
| 358 | 360 |
| 359 return isolate->heap()->false_value(); | 361 return isolate->heap()->false_value(); |
| 360 } | 362 } |
| 361 | 363 |
| 362 | 364 |
| 363 #define BUFFER_VIEW_GETTER(Type, getter, accessor) \ | 365 #define BUFFER_VIEW_GETTER(Type, getter, accessor) \ |
| 364 RUNTIME_FUNCTION(Runtime_##Type##Get##getter) { \ | 366 RUNTIME_FUNCTION(Runtime_##Type##Get##getter) { \ |
| 365 HandleScope scope(isolate); \ | 367 HandleScope scope(isolate); \ |
| 366 DCHECK(args.length() == 1); \ | 368 DCHECK_EQ(1, args.length()); \ |
| 367 CONVERT_ARG_HANDLE_CHECKED(JS##Type, holder, 0); \ | 369 CONVERT_ARG_HANDLE_CHECKED(JS##Type, holder, 0); \ |
| 368 return holder->accessor(); \ | 370 return holder->accessor(); \ |
| 369 } | 371 } |
| 370 | 372 |
| 371 BUFFER_VIEW_GETTER(ArrayBufferView, ByteLength, byte_length) | 373 BUFFER_VIEW_GETTER(ArrayBufferView, ByteLength, byte_length) |
| 372 BUFFER_VIEW_GETTER(ArrayBufferView, ByteOffset, byte_offset) | 374 BUFFER_VIEW_GETTER(ArrayBufferView, ByteOffset, byte_offset) |
| 373 BUFFER_VIEW_GETTER(TypedArray, Length, length) | 375 BUFFER_VIEW_GETTER(TypedArray, Length, length) |
| 374 BUFFER_VIEW_GETTER(DataView, Buffer, buffer) | 376 BUFFER_VIEW_GETTER(DataView, Buffer, buffer) |
| 375 | 377 |
| 376 #undef BUFFER_VIEW_GETTER | 378 #undef BUFFER_VIEW_GETTER |
| 377 | 379 |
| 378 RUNTIME_FUNCTION(Runtime_TypedArrayGetBuffer) { | 380 RUNTIME_FUNCTION(Runtime_TypedArrayGetBuffer) { |
| 379 HandleScope scope(isolate); | 381 HandleScope scope(isolate); |
| 380 DCHECK(args.length() == 1); | 382 DCHECK_EQ(1, args.length()); |
| 381 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0); | 383 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0); |
| 382 return *holder->GetBuffer(); | 384 return *holder->GetBuffer(); |
| 383 } | 385 } |
| 384 | 386 |
| 385 | 387 |
| 386 // Return codes for Runtime_TypedArraySetFastCases. | 388 // Return codes for Runtime_TypedArraySetFastCases. |
| 387 // Should be synchronized with typedarray.js natives. | 389 // Should be synchronized with typedarray.js natives. |
| 388 enum TypedArraySetResultCodes { | 390 enum TypedArraySetResultCodes { |
| 389 // Set from typed array of the same type. | 391 // Set from typed array of the same type. |
| 390 // This is processed by TypedArraySetFastCases | 392 // This is processed by TypedArraySetFastCases |
| (...skipping 19 matching lines...) Expand all Loading... |
| 410 return Smi::FromInt(TYPED_ARRAY_SET_NON_TYPED_ARRAY); | 412 return Smi::FromInt(TYPED_ARRAY_SET_NON_TYPED_ARRAY); |
| 411 | 413 |
| 412 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, target_obj, 0); | 414 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, target_obj, 0); |
| 413 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, source_obj, 1); | 415 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, source_obj, 1); |
| 414 CONVERT_NUMBER_ARG_HANDLE_CHECKED(offset_obj, 2); | 416 CONVERT_NUMBER_ARG_HANDLE_CHECKED(offset_obj, 2); |
| 415 | 417 |
| 416 Handle<JSTypedArray> target(JSTypedArray::cast(*target_obj)); | 418 Handle<JSTypedArray> target(JSTypedArray::cast(*target_obj)); |
| 417 Handle<JSTypedArray> source(JSTypedArray::cast(*source_obj)); | 419 Handle<JSTypedArray> source(JSTypedArray::cast(*source_obj)); |
| 418 size_t offset = 0; | 420 size_t offset = 0; |
| 419 RUNTIME_ASSERT(TryNumberToSize(isolate, *offset_obj, &offset)); | 421 RUNTIME_ASSERT(TryNumberToSize(isolate, *offset_obj, &offset)); |
| 420 size_t target_length = NumberToSize(isolate, target->length()); | 422 size_t target_length = target->length_value(); |
| 421 size_t source_length = NumberToSize(isolate, source->length()); | 423 size_t source_length = source->length_value(); |
| 422 size_t target_byte_length = NumberToSize(isolate, target->byte_length()); | 424 size_t target_byte_length = NumberToSize(isolate, target->byte_length()); |
| 423 size_t source_byte_length = NumberToSize(isolate, source->byte_length()); | 425 size_t source_byte_length = NumberToSize(isolate, source->byte_length()); |
| 424 if (offset > target_length || offset + source_length > target_length || | 426 if (offset > target_length || offset + source_length > target_length || |
| 425 offset + source_length < offset) { // overflow | 427 offset + source_length < offset) { // overflow |
| 426 THROW_NEW_ERROR_RETURN_FAILURE( | 428 THROW_NEW_ERROR_RETURN_FAILURE( |
| 427 isolate, NewRangeError(MessageTemplate::kTypedArraySetSourceTooLarge)); | 429 isolate, NewRangeError(MessageTemplate::kTypedArraySetSourceTooLarge)); |
| 428 } | 430 } |
| 429 | 431 |
| 430 size_t target_offset = NumberToSize(isolate, target->byte_offset()); | 432 size_t target_offset = NumberToSize(isolate, target->byte_offset()); |
| 431 size_t source_offset = NumberToSize(isolate, source->byte_offset()); | 433 size_t source_offset = NumberToSize(isolate, source->byte_offset()); |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 721 DATA_VIEW_SETTER(Uint16, uint16_t) | 723 DATA_VIEW_SETTER(Uint16, uint16_t) |
| 722 DATA_VIEW_SETTER(Int16, int16_t) | 724 DATA_VIEW_SETTER(Int16, int16_t) |
| 723 DATA_VIEW_SETTER(Uint32, uint32_t) | 725 DATA_VIEW_SETTER(Uint32, uint32_t) |
| 724 DATA_VIEW_SETTER(Int32, int32_t) | 726 DATA_VIEW_SETTER(Int32, int32_t) |
| 725 DATA_VIEW_SETTER(Float32, float) | 727 DATA_VIEW_SETTER(Float32, float) |
| 726 DATA_VIEW_SETTER(Float64, double) | 728 DATA_VIEW_SETTER(Float64, double) |
| 727 | 729 |
| 728 #undef DATA_VIEW_SETTER | 730 #undef DATA_VIEW_SETTER |
| 729 } // namespace internal | 731 } // namespace internal |
| 730 } // namespace v8 | 732 } // namespace v8 |
| OLD | NEW |