| 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/runtime/runtime.h" | 8 #include "src/runtime/runtime.h" |
| 9 #include "src/runtime/runtime-utils.h" | 9 #include "src/runtime/runtime-utils.h" |
| 10 | 10 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 array_buffer->set_weak_next(isolate->heap()->array_buffers_list()); | 56 array_buffer->set_weak_next(isolate->heap()->array_buffers_list()); |
| 57 isolate->heap()->set_array_buffers_list(*array_buffer); | 57 isolate->heap()->set_array_buffers_list(*array_buffer); |
| 58 if (isolate->heap()->last_array_buffer_in_list()->IsUndefined()) { | 58 if (isolate->heap()->last_array_buffer_in_list()->IsUndefined()) { |
| 59 isolate->heap()->set_last_array_buffer_in_list(*array_buffer); | 59 isolate->heap()->set_last_array_buffer_in_list(*array_buffer); |
| 60 } | 60 } |
| 61 } else { | 61 } else { |
| 62 JSArrayBuffer::cast(isolate->heap()->last_array_buffer_in_list()) | 62 JSArrayBuffer::cast(isolate->heap()->last_array_buffer_in_list()) |
| 63 ->set_weak_next(*array_buffer); | 63 ->set_weak_next(*array_buffer); |
| 64 isolate->heap()->set_last_array_buffer_in_list(*array_buffer); | 64 isolate->heap()->set_last_array_buffer_in_list(*array_buffer); |
| 65 } | 65 } |
| 66 array_buffer->set_weak_first_view(isolate->heap()->undefined_value()); | |
| 67 } | 66 } |
| 68 | 67 |
| 69 | 68 |
| 70 bool Runtime::SetupArrayBufferAllocatingData(Isolate* isolate, | 69 bool Runtime::SetupArrayBufferAllocatingData(Isolate* isolate, |
| 71 Handle<JSArrayBuffer> array_buffer, | 70 Handle<JSArrayBuffer> array_buffer, |
| 72 size_t allocated_length, | 71 size_t allocated_length, |
| 73 bool initialize) { | 72 bool initialize) { |
| 74 void* data; | 73 void* data; |
| 75 CHECK(V8::ArrayBufferAllocator() != NULL); | 74 CHECK(V8::ArrayBufferAllocator() != NULL); |
| 76 // Prevent creating array buffers when serializing. | 75 // Prevent creating array buffers when serializing. |
| (...skipping 13 matching lines...) Expand all Loading... |
| 90 SetupArrayBuffer(isolate, array_buffer, false, data, allocated_length); | 89 SetupArrayBuffer(isolate, array_buffer, false, data, allocated_length); |
| 91 | 90 |
| 92 reinterpret_cast<v8::Isolate*>(isolate) | 91 reinterpret_cast<v8::Isolate*>(isolate) |
| 93 ->AdjustAmountOfExternalAllocatedMemory(allocated_length); | 92 ->AdjustAmountOfExternalAllocatedMemory(allocated_length); |
| 94 | 93 |
| 95 return true; | 94 return true; |
| 96 } | 95 } |
| 97 | 96 |
| 98 | 97 |
| 99 void Runtime::NeuterArrayBuffer(Handle<JSArrayBuffer> array_buffer) { | 98 void Runtime::NeuterArrayBuffer(Handle<JSArrayBuffer> array_buffer) { |
| 100 Isolate* isolate = array_buffer->GetIsolate(); | |
| 101 // Firstly, iterate over the views which are referenced directly by the array | |
| 102 // buffer. | |
| 103 for (Handle<Object> view_obj(array_buffer->weak_first_view(), isolate); | |
| 104 !view_obj->IsUndefined();) { | |
| 105 Handle<JSArrayBufferView> view(JSArrayBufferView::cast(*view_obj)); | |
| 106 if (view->IsJSTypedArray()) { | |
| 107 JSTypedArray::cast(*view)->Neuter(); | |
| 108 } else if (view->IsJSDataView()) { | |
| 109 JSDataView::cast(*view)->Neuter(); | |
| 110 } else { | |
| 111 UNREACHABLE(); | |
| 112 } | |
| 113 view_obj = handle(view->weak_next(), isolate); | |
| 114 } | |
| 115 | |
| 116 // Secondly, iterate over the global list of new space views to find views | |
| 117 // that belong to the neutered array buffer. | |
| 118 Heap* heap = isolate->heap(); | |
| 119 for (Handle<Object> view_obj(heap->new_array_buffer_views_list(), isolate); | |
| 120 !view_obj->IsUndefined();) { | |
| 121 Handle<JSArrayBufferView> view(JSArrayBufferView::cast(*view_obj)); | |
| 122 if (view->buffer() == *array_buffer) { | |
| 123 if (view->IsJSTypedArray()) { | |
| 124 JSTypedArray::cast(*view)->Neuter(); | |
| 125 } else if (view->IsJSDataView()) { | |
| 126 JSDataView::cast(*view)->Neuter(); | |
| 127 } else { | |
| 128 UNREACHABLE(); | |
| 129 } | |
| 130 } | |
| 131 view_obj = handle(view->weak_next(), isolate); | |
| 132 } | |
| 133 array_buffer->Neuter(); | 99 array_buffer->Neuter(); |
| 134 } | 100 } |
| 135 | 101 |
| 136 | 102 |
| 137 RUNTIME_FUNCTION(Runtime_ArrayBufferInitialize) { | 103 RUNTIME_FUNCTION(Runtime_ArrayBufferInitialize) { |
| 138 HandleScope scope(isolate); | 104 HandleScope scope(isolate); |
| 139 DCHECK(args.length() == 2); | 105 DCHECK(args.length() == 2); |
| 140 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, holder, 0); | 106 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, holder, 0); |
| 141 CONVERT_NUMBER_ARG_HANDLE_CHECKED(byteLength, 1); | 107 CONVERT_NUMBER_ARG_HANDLE_CHECKED(byteLength, 1); |
| 142 if (!holder->byte_length()->IsUndefined()) { | 108 if (!holder->byte_length()->IsUndefined()) { |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 DCHECK(holder->GetInternalFieldCount() == | 254 DCHECK(holder->GetInternalFieldCount() == |
| 289 v8::ArrayBufferView::kInternalFieldCount); | 255 v8::ArrayBufferView::kInternalFieldCount); |
| 290 for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { | 256 for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { |
| 291 holder->SetInternalField(i, Smi::FromInt(0)); | 257 holder->SetInternalField(i, Smi::FromInt(0)); |
| 292 } | 258 } |
| 293 Handle<Object> length_obj = isolate->factory()->NewNumberFromSize(length); | 259 Handle<Object> length_obj = isolate->factory()->NewNumberFromSize(length); |
| 294 holder->set_length(*length_obj); | 260 holder->set_length(*length_obj); |
| 295 holder->set_byte_offset(*byte_offset_object); | 261 holder->set_byte_offset(*byte_offset_object); |
| 296 holder->set_byte_length(*byte_length_object); | 262 holder->set_byte_length(*byte_length_object); |
| 297 | 263 |
| 298 Heap* heap = isolate->heap(); | |
| 299 if (!maybe_buffer->IsNull()) { | 264 if (!maybe_buffer->IsNull()) { |
| 300 Handle<JSArrayBuffer> buffer = Handle<JSArrayBuffer>::cast(maybe_buffer); | 265 Handle<JSArrayBuffer> buffer = Handle<JSArrayBuffer>::cast(maybe_buffer); |
| 301 holder->set_buffer(*buffer); | 266 holder->set_buffer(*buffer); |
| 302 | 267 |
| 303 if (heap->InNewSpace(*holder)) { | |
| 304 holder->set_weak_next(heap->new_array_buffer_views_list()); | |
| 305 heap->set_new_array_buffer_views_list(*holder); | |
| 306 } else { | |
| 307 holder->set_weak_next(buffer->weak_first_view()); | |
| 308 buffer->set_weak_first_view(*holder); | |
| 309 } | |
| 310 | |
| 311 Handle<ExternalArray> elements = isolate->factory()->NewExternalArray( | 268 Handle<ExternalArray> elements = isolate->factory()->NewExternalArray( |
| 312 static_cast<int>(length), array_type, | 269 static_cast<int>(length), array_type, |
| 313 static_cast<uint8_t*>(buffer->backing_store()) + byte_offset); | 270 static_cast<uint8_t*>(buffer->backing_store()) + byte_offset); |
| 314 Handle<Map> map = | 271 Handle<Map> map = |
| 315 JSObject::GetElementsTransitionMap(holder, external_elements_kind); | 272 JSObject::GetElementsTransitionMap(holder, external_elements_kind); |
| 316 JSObject::SetMapAndElements(holder, map, elements); | 273 JSObject::SetMapAndElements(holder, map, elements); |
| 317 DCHECK(IsExternalArrayElementsKind(holder->map()->elements_kind())); | 274 DCHECK(IsExternalArrayElementsKind(holder->map()->elements_kind())); |
| 318 } else { | 275 } else { |
| 319 holder->set_buffer(Smi::FromInt(0)); | 276 holder->set_buffer(Smi::FromInt(0)); |
| 320 holder->set_weak_next(isolate->heap()->undefined_value()); | |
| 321 Handle<FixedTypedArrayBase> elements = | 277 Handle<FixedTypedArrayBase> elements = |
| 322 isolate->factory()->NewFixedTypedArray(static_cast<int>(length), | 278 isolate->factory()->NewFixedTypedArray(static_cast<int>(length), |
| 323 array_type); | 279 array_type); |
| 324 holder->set_elements(*elements); | 280 holder->set_elements(*elements); |
| 325 } | 281 } |
| 326 return isolate->heap()->undefined_value(); | 282 return isolate->heap()->undefined_value(); |
| 327 } | 283 } |
| 328 | 284 |
| 329 | 285 |
| 330 // Initializes a typed array from an array-like object. | 286 // Initializes a typed array from an array-like object. |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 398 HandleVector<Object>(NULL, 0))); | 354 HandleVector<Object>(NULL, 0))); |
| 399 } | 355 } |
| 400 | 356 |
| 401 holder->set_buffer(*buffer); | 357 holder->set_buffer(*buffer); |
| 402 holder->set_byte_offset(Smi::FromInt(0)); | 358 holder->set_byte_offset(Smi::FromInt(0)); |
| 403 Handle<Object> byte_length_obj( | 359 Handle<Object> byte_length_obj( |
| 404 isolate->factory()->NewNumberFromSize(byte_length)); | 360 isolate->factory()->NewNumberFromSize(byte_length)); |
| 405 holder->set_byte_length(*byte_length_obj); | 361 holder->set_byte_length(*byte_length_obj); |
| 406 holder->set_length(*length_obj); | 362 holder->set_length(*length_obj); |
| 407 | 363 |
| 408 Heap* heap = isolate->heap(); | |
| 409 if (heap->InNewSpace(*holder)) { | |
| 410 holder->set_weak_next(heap->new_array_buffer_views_list()); | |
| 411 heap->set_new_array_buffer_views_list(*holder); | |
| 412 } else { | |
| 413 holder->set_weak_next(buffer->weak_first_view()); | |
| 414 buffer->set_weak_first_view(*holder); | |
| 415 } | |
| 416 | |
| 417 Handle<ExternalArray> elements = isolate->factory()->NewExternalArray( | 364 Handle<ExternalArray> elements = isolate->factory()->NewExternalArray( |
| 418 static_cast<int>(length), array_type, | 365 static_cast<int>(length), array_type, |
| 419 static_cast<uint8_t*>(buffer->backing_store())); | 366 static_cast<uint8_t*>(buffer->backing_store())); |
| 420 Handle<Map> map = | 367 Handle<Map> map = |
| 421 JSObject::GetElementsTransitionMap(holder, external_elements_kind); | 368 JSObject::GetElementsTransitionMap(holder, external_elements_kind); |
| 422 JSObject::SetMapAndElements(holder, map, elements); | 369 JSObject::SetMapAndElements(holder, map, elements); |
| 423 | 370 |
| 424 if (source->IsJSTypedArray()) { | 371 if (source->IsJSTypedArray()) { |
| 425 Handle<JSTypedArray> typed_array(JSTypedArray::cast(*source)); | 372 Handle<JSTypedArray> typed_array(JSTypedArray::cast(*source)); |
| 426 | 373 |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 579 // Entire range [offset, offset + length] must be in bounds. | 526 // Entire range [offset, offset + length] must be in bounds. |
| 580 RUNTIME_ASSERT(offset <= buffer_length); | 527 RUNTIME_ASSERT(offset <= buffer_length); |
| 581 RUNTIME_ASSERT(offset + length <= buffer_length); | 528 RUNTIME_ASSERT(offset + length <= buffer_length); |
| 582 // No overflow. | 529 // No overflow. |
| 583 RUNTIME_ASSERT(offset + length >= offset); | 530 RUNTIME_ASSERT(offset + length >= offset); |
| 584 | 531 |
| 585 holder->set_buffer(*buffer); | 532 holder->set_buffer(*buffer); |
| 586 holder->set_byte_offset(*byte_offset); | 533 holder->set_byte_offset(*byte_offset); |
| 587 holder->set_byte_length(*byte_length); | 534 holder->set_byte_length(*byte_length); |
| 588 | 535 |
| 589 Heap* heap = isolate->heap(); | |
| 590 if (heap->InNewSpace(*holder)) { | |
| 591 holder->set_weak_next(heap->new_array_buffer_views_list()); | |
| 592 heap->set_new_array_buffer_views_list(*holder); | |
| 593 } else { | |
| 594 holder->set_weak_next(buffer->weak_first_view()); | |
| 595 buffer->set_weak_first_view(*holder); | |
| 596 } | |
| 597 | |
| 598 return isolate->heap()->undefined_value(); | 536 return isolate->heap()->undefined_value(); |
| 599 } | 537 } |
| 600 | 538 |
| 601 | 539 |
| 602 inline static bool NeedToFlipBytes(bool is_little_endian) { | 540 inline static bool NeedToFlipBytes(bool is_little_endian) { |
| 603 #ifdef V8_TARGET_LITTLE_ENDIAN | 541 #ifdef V8_TARGET_LITTLE_ENDIAN |
| 604 return !is_little_endian; | 542 return !is_little_endian; |
| 605 #else | 543 #else |
| 606 return is_little_endian; | 544 return is_little_endian; |
| 607 #endif | 545 #endif |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 811 DATA_VIEW_SETTER(Uint16, uint16_t) | 749 DATA_VIEW_SETTER(Uint16, uint16_t) |
| 812 DATA_VIEW_SETTER(Int16, int16_t) | 750 DATA_VIEW_SETTER(Int16, int16_t) |
| 813 DATA_VIEW_SETTER(Uint32, uint32_t) | 751 DATA_VIEW_SETTER(Uint32, uint32_t) |
| 814 DATA_VIEW_SETTER(Int32, int32_t) | 752 DATA_VIEW_SETTER(Int32, int32_t) |
| 815 DATA_VIEW_SETTER(Float32, float) | 753 DATA_VIEW_SETTER(Float32, float) |
| 816 DATA_VIEW_SETTER(Float64, double) | 754 DATA_VIEW_SETTER(Float64, double) |
| 817 | 755 |
| 818 #undef DATA_VIEW_SETTER | 756 #undef DATA_VIEW_SETTER |
| 819 } | 757 } |
| 820 } // namespace v8::internal | 758 } // namespace v8::internal |
| OLD | NEW |