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 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
271 size_t element_size = 1; // Bogus initialization. | 271 size_t element_size = 1; // Bogus initialization. |
272 ElementsKind external_elements_kind = | 272 ElementsKind external_elements_kind = |
273 EXTERNAL_INT8_ELEMENTS; // Bogus intialization. | 273 EXTERNAL_INT8_ELEMENTS; // Bogus intialization. |
274 ElementsKind fixed_elements_kind = INT8_ELEMENTS; // Bogus initialization. | 274 ElementsKind fixed_elements_kind = INT8_ELEMENTS; // Bogus initialization. |
275 Runtime::ArrayIdToTypeAndSize(arrayId, &array_type, &external_elements_kind, | 275 Runtime::ArrayIdToTypeAndSize(arrayId, &array_type, &external_elements_kind, |
276 &fixed_elements_kind, &element_size); | 276 &fixed_elements_kind, &element_size); |
277 | 277 |
278 RUNTIME_ASSERT(holder->map()->elements_kind() == fixed_elements_kind); | 278 RUNTIME_ASSERT(holder->map()->elements_kind() == fixed_elements_kind); |
279 | 279 |
280 Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer(); | 280 Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer(); |
| 281 size_t length = 0; |
281 if (source->IsJSTypedArray() && | 282 if (source->IsJSTypedArray() && |
282 JSTypedArray::cast(*source)->type() == array_type) { | 283 JSTypedArray::cast(*source)->type() == array_type) { |
283 length_obj = Handle<Object>(JSTypedArray::cast(*source)->length(), isolate); | 284 length_obj = handle(JSTypedArray::cast(*source)->length(), isolate); |
| 285 length = JSTypedArray::cast(*source)->length_value(); |
| 286 } else { |
| 287 RUNTIME_ASSERT(TryNumberToSize(isolate, *length_obj, &length)); |
284 } | 288 } |
285 size_t length = 0; | |
286 RUNTIME_ASSERT(TryNumberToSize(isolate, *length_obj, &length)); | |
287 | 289 |
288 if ((length > static_cast<unsigned>(Smi::kMaxValue)) || | 290 if ((length > static_cast<unsigned>(Smi::kMaxValue)) || |
289 (length > (kMaxInt / element_size))) { | 291 (length > (kMaxInt / element_size))) { |
290 THROW_NEW_ERROR_RETURN_FAILURE( | 292 THROW_NEW_ERROR_RETURN_FAILURE( |
291 isolate, NewRangeError(MessageTemplate::kInvalidTypedArrayLength)); | 293 isolate, NewRangeError(MessageTemplate::kInvalidTypedArrayLength)); |
292 } | 294 } |
293 size_t byte_length = length * element_size; | 295 size_t byte_length = length * element_size; |
294 | 296 |
295 DCHECK(holder->GetInternalFieldCount() == | 297 DCHECK(holder->GetInternalFieldCount() == |
296 v8::ArrayBufferView::kInternalFieldCount); | 298 v8::ArrayBufferView::kInternalFieldCount); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
348 } | 350 } |
349 } | 351 } |
350 | 352 |
351 return isolate->heap()->false_value(); | 353 return isolate->heap()->false_value(); |
352 } | 354 } |
353 | 355 |
354 | 356 |
355 #define BUFFER_VIEW_GETTER(Type, getter, accessor) \ | 357 #define BUFFER_VIEW_GETTER(Type, getter, accessor) \ |
356 RUNTIME_FUNCTION(Runtime_##Type##Get##getter) { \ | 358 RUNTIME_FUNCTION(Runtime_##Type##Get##getter) { \ |
357 HandleScope scope(isolate); \ | 359 HandleScope scope(isolate); \ |
358 DCHECK(args.length() == 1); \ | 360 DCHECK_EQ(1, args.length()); \ |
359 CONVERT_ARG_HANDLE_CHECKED(JS##Type, holder, 0); \ | 361 CONVERT_ARG_HANDLE_CHECKED(JS##Type, holder, 0); \ |
360 return holder->accessor(); \ | 362 return holder->accessor(); \ |
361 } | 363 } |
362 | 364 |
363 BUFFER_VIEW_GETTER(ArrayBufferView, ByteLength, byte_length) | 365 BUFFER_VIEW_GETTER(ArrayBufferView, ByteLength, byte_length) |
364 BUFFER_VIEW_GETTER(ArrayBufferView, ByteOffset, byte_offset) | 366 BUFFER_VIEW_GETTER(ArrayBufferView, ByteOffset, byte_offset) |
365 BUFFER_VIEW_GETTER(TypedArray, Length, length) | 367 BUFFER_VIEW_GETTER(TypedArray, Length, length) |
366 BUFFER_VIEW_GETTER(DataView, Buffer, buffer) | 368 BUFFER_VIEW_GETTER(DataView, Buffer, buffer) |
367 | 369 |
368 #undef BUFFER_VIEW_GETTER | 370 #undef BUFFER_VIEW_GETTER |
369 | 371 |
370 RUNTIME_FUNCTION(Runtime_TypedArrayGetBuffer) { | 372 RUNTIME_FUNCTION(Runtime_TypedArrayGetBuffer) { |
371 HandleScope scope(isolate); | 373 HandleScope scope(isolate); |
372 DCHECK(args.length() == 1); | 374 DCHECK_EQ(1, args.length()); |
373 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0); | 375 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0); |
374 return *holder->GetBuffer(); | 376 return *holder->GetBuffer(); |
375 } | 377 } |
376 | 378 |
377 | 379 |
378 // Return codes for Runtime_TypedArraySetFastCases. | 380 // Return codes for Runtime_TypedArraySetFastCases. |
379 // Should be synchronized with typedarray.js natives. | 381 // Should be synchronized with typedarray.js natives. |
380 enum TypedArraySetResultCodes { | 382 enum TypedArraySetResultCodes { |
381 // Set from typed array of the same type. | 383 // Set from typed array of the same type. |
382 // This is processed by TypedArraySetFastCases | 384 // This is processed by TypedArraySetFastCases |
(...skipping 19 matching lines...) Expand all Loading... |
402 return Smi::FromInt(TYPED_ARRAY_SET_NON_TYPED_ARRAY); | 404 return Smi::FromInt(TYPED_ARRAY_SET_NON_TYPED_ARRAY); |
403 | 405 |
404 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, target_obj, 0); | 406 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, target_obj, 0); |
405 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, source_obj, 1); | 407 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, source_obj, 1); |
406 CONVERT_NUMBER_ARG_HANDLE_CHECKED(offset_obj, 2); | 408 CONVERT_NUMBER_ARG_HANDLE_CHECKED(offset_obj, 2); |
407 | 409 |
408 Handle<JSTypedArray> target(JSTypedArray::cast(*target_obj)); | 410 Handle<JSTypedArray> target(JSTypedArray::cast(*target_obj)); |
409 Handle<JSTypedArray> source(JSTypedArray::cast(*source_obj)); | 411 Handle<JSTypedArray> source(JSTypedArray::cast(*source_obj)); |
410 size_t offset = 0; | 412 size_t offset = 0; |
411 RUNTIME_ASSERT(TryNumberToSize(isolate, *offset_obj, &offset)); | 413 RUNTIME_ASSERT(TryNumberToSize(isolate, *offset_obj, &offset)); |
412 size_t target_length = NumberToSize(isolate, target->length()); | 414 size_t target_length = target->length_value(); |
413 size_t source_length = NumberToSize(isolate, source->length()); | 415 size_t source_length = source->length_value(); |
414 size_t target_byte_length = NumberToSize(isolate, target->byte_length()); | 416 size_t target_byte_length = NumberToSize(isolate, target->byte_length()); |
415 size_t source_byte_length = NumberToSize(isolate, source->byte_length()); | 417 size_t source_byte_length = NumberToSize(isolate, source->byte_length()); |
416 if (offset > target_length || offset + source_length > target_length || | 418 if (offset > target_length || offset + source_length > target_length || |
417 offset + source_length < offset) { // overflow | 419 offset + source_length < offset) { // overflow |
418 THROW_NEW_ERROR_RETURN_FAILURE( | 420 THROW_NEW_ERROR_RETURN_FAILURE( |
419 isolate, NewRangeError(MessageTemplate::kTypedArraySetSourceTooLarge)); | 421 isolate, NewRangeError(MessageTemplate::kTypedArraySetSourceTooLarge)); |
420 } | 422 } |
421 | 423 |
422 size_t target_offset = NumberToSize(isolate, target->byte_offset()); | 424 size_t target_offset = NumberToSize(isolate, target->byte_offset()); |
423 size_t source_offset = NumberToSize(isolate, source->byte_offset()); | 425 size_t source_offset = NumberToSize(isolate, source->byte_offset()); |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
713 DATA_VIEW_SETTER(Uint16, uint16_t) | 715 DATA_VIEW_SETTER(Uint16, uint16_t) |
714 DATA_VIEW_SETTER(Int16, int16_t) | 716 DATA_VIEW_SETTER(Int16, int16_t) |
715 DATA_VIEW_SETTER(Uint32, uint32_t) | 717 DATA_VIEW_SETTER(Uint32, uint32_t) |
716 DATA_VIEW_SETTER(Int32, int32_t) | 718 DATA_VIEW_SETTER(Int32, int32_t) |
717 DATA_VIEW_SETTER(Float32, float) | 719 DATA_VIEW_SETTER(Float32, float) |
718 DATA_VIEW_SETTER(Float64, double) | 720 DATA_VIEW_SETTER(Float64, double) |
719 | 721 |
720 #undef DATA_VIEW_SETTER | 722 #undef DATA_VIEW_SETTER |
721 } // namespace internal | 723 } // namespace internal |
722 } // namespace v8 | 724 } // namespace v8 |
OLD | NEW |