| 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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 | 81 |
| 82 reinterpret_cast<v8::Isolate*>(isolate) | 82 reinterpret_cast<v8::Isolate*>(isolate) |
| 83 ->AdjustAmountOfExternalAllocatedMemory(allocated_length); | 83 ->AdjustAmountOfExternalAllocatedMemory(allocated_length); |
| 84 | 84 |
| 85 return true; | 85 return true; |
| 86 } | 86 } |
| 87 | 87 |
| 88 | 88 |
| 89 void Runtime::NeuterArrayBuffer(Handle<JSArrayBuffer> array_buffer) { | 89 void Runtime::NeuterArrayBuffer(Handle<JSArrayBuffer> array_buffer) { |
| 90 Isolate* isolate = array_buffer->GetIsolate(); | 90 Isolate* isolate = array_buffer->GetIsolate(); |
| 91 // Firstly, iterate over the views which are referenced directly by the array | |
| 92 // buffer. | |
| 93 for (Handle<Object> view_obj(array_buffer->weak_first_view(), isolate); | 91 for (Handle<Object> view_obj(array_buffer->weak_first_view(), isolate); |
| 94 !view_obj->IsUndefined();) { | 92 !view_obj->IsUndefined();) { |
| 95 Handle<JSArrayBufferView> view(JSArrayBufferView::cast(*view_obj)); | 93 Handle<JSArrayBufferView> view(JSArrayBufferView::cast(*view_obj)); |
| 96 if (view->IsJSTypedArray()) { | 94 if (view->IsJSTypedArray()) { |
| 97 JSTypedArray::cast(*view)->Neuter(); | 95 JSTypedArray::cast(*view)->Neuter(); |
| 98 } else if (view->IsJSDataView()) { | 96 } else if (view->IsJSDataView()) { |
| 99 JSDataView::cast(*view)->Neuter(); | 97 JSDataView::cast(*view)->Neuter(); |
| 100 } else { | 98 } else { |
| 101 UNREACHABLE(); | 99 UNREACHABLE(); |
| 102 } | 100 } |
| 103 view_obj = handle(view->weak_next(), isolate); | 101 view_obj = handle(view->weak_next(), isolate); |
| 104 } | 102 } |
| 105 | |
| 106 // Secondly, iterate over the global list of new space views to find views | |
| 107 // that belong to the neutered array buffer. | |
| 108 Heap* heap = isolate->heap(); | |
| 109 for (Handle<Object> view_obj(heap->new_array_buffer_views_list(), isolate); | |
| 110 !view_obj->IsUndefined();) { | |
| 111 Handle<JSArrayBufferView> view(JSArrayBufferView::cast(*view_obj)); | |
| 112 if (view->buffer() == *array_buffer) { | |
| 113 if (view->IsJSTypedArray()) { | |
| 114 JSTypedArray::cast(*view)->Neuter(); | |
| 115 } else if (view->IsJSDataView()) { | |
| 116 JSDataView::cast(*view)->Neuter(); | |
| 117 } else { | |
| 118 UNREACHABLE(); | |
| 119 } | |
| 120 } | |
| 121 view_obj = handle(view->weak_next(), isolate); | |
| 122 } | |
| 123 array_buffer->Neuter(); | 103 array_buffer->Neuter(); |
| 124 } | 104 } |
| 125 | 105 |
| 126 | 106 |
| 127 RUNTIME_FUNCTION(Runtime_ArrayBufferInitialize) { | 107 RUNTIME_FUNCTION(Runtime_ArrayBufferInitialize) { |
| 128 HandleScope scope(isolate); | 108 HandleScope scope(isolate); |
| 129 DCHECK(args.length() == 2); | 109 DCHECK(args.length() == 2); |
| 130 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, holder, 0); | 110 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, holder, 0); |
| 131 CONVERT_NUMBER_ARG_HANDLE_CHECKED(byteLength, 1); | 111 CONVERT_NUMBER_ARG_HANDLE_CHECKED(byteLength, 1); |
| 132 if (!holder->byte_length()->IsUndefined()) { | 112 if (!holder->byte_length()->IsUndefined()) { |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 DCHECK(holder->GetInternalFieldCount() == | 258 DCHECK(holder->GetInternalFieldCount() == |
| 279 v8::ArrayBufferView::kInternalFieldCount); | 259 v8::ArrayBufferView::kInternalFieldCount); |
| 280 for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { | 260 for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { |
| 281 holder->SetInternalField(i, Smi::FromInt(0)); | 261 holder->SetInternalField(i, Smi::FromInt(0)); |
| 282 } | 262 } |
| 283 Handle<Object> length_obj = isolate->factory()->NewNumberFromSize(length); | 263 Handle<Object> length_obj = isolate->factory()->NewNumberFromSize(length); |
| 284 holder->set_length(*length_obj); | 264 holder->set_length(*length_obj); |
| 285 holder->set_byte_offset(*byte_offset_object); | 265 holder->set_byte_offset(*byte_offset_object); |
| 286 holder->set_byte_length(*byte_length_object); | 266 holder->set_byte_length(*byte_length_object); |
| 287 | 267 |
| 288 Heap* heap = isolate->heap(); | |
| 289 if (!maybe_buffer->IsNull()) { | 268 if (!maybe_buffer->IsNull()) { |
| 290 Handle<JSArrayBuffer> buffer = Handle<JSArrayBuffer>::cast(maybe_buffer); | 269 Handle<JSArrayBuffer> buffer = Handle<JSArrayBuffer>::cast(maybe_buffer); |
| 291 holder->set_buffer(*buffer); | 270 holder->set_buffer(*buffer); |
| 292 | 271 holder->set_weak_next(buffer->weak_first_view()); |
| 293 if (heap->InNewSpace(*holder)) { | 272 buffer->set_weak_first_view(*holder); |
| 294 holder->set_weak_next(heap->new_array_buffer_views_list()); | |
| 295 heap->set_new_array_buffer_views_list(*holder); | |
| 296 } else { | |
| 297 holder->set_weak_next(buffer->weak_first_view()); | |
| 298 buffer->set_weak_first_view(*holder); | |
| 299 } | |
| 300 | 273 |
| 301 Handle<ExternalArray> elements = isolate->factory()->NewExternalArray( | 274 Handle<ExternalArray> elements = isolate->factory()->NewExternalArray( |
| 302 static_cast<int>(length), array_type, | 275 static_cast<int>(length), array_type, |
| 303 static_cast<uint8_t*>(buffer->backing_store()) + byte_offset); | 276 static_cast<uint8_t*>(buffer->backing_store()) + byte_offset); |
| 304 Handle<Map> map = | 277 Handle<Map> map = |
| 305 JSObject::GetElementsTransitionMap(holder, external_elements_kind); | 278 JSObject::GetElementsTransitionMap(holder, external_elements_kind); |
| 306 JSObject::SetMapAndElements(holder, map, elements); | 279 JSObject::SetMapAndElements(holder, map, elements); |
| 307 DCHECK(IsExternalArrayElementsKind(holder->map()->elements_kind())); | 280 DCHECK(IsExternalArrayElementsKind(holder->map()->elements_kind())); |
| 308 } else { | 281 } else { |
| 309 holder->set_buffer(Smi::FromInt(0)); | 282 holder->set_buffer(Smi::FromInt(0)); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 isolate, NewRangeError("invalid_array_buffer_length", | 360 isolate, NewRangeError("invalid_array_buffer_length", |
| 388 HandleVector<Object>(NULL, 0))); | 361 HandleVector<Object>(NULL, 0))); |
| 389 } | 362 } |
| 390 | 363 |
| 391 holder->set_buffer(*buffer); | 364 holder->set_buffer(*buffer); |
| 392 holder->set_byte_offset(Smi::FromInt(0)); | 365 holder->set_byte_offset(Smi::FromInt(0)); |
| 393 Handle<Object> byte_length_obj( | 366 Handle<Object> byte_length_obj( |
| 394 isolate->factory()->NewNumberFromSize(byte_length)); | 367 isolate->factory()->NewNumberFromSize(byte_length)); |
| 395 holder->set_byte_length(*byte_length_obj); | 368 holder->set_byte_length(*byte_length_obj); |
| 396 holder->set_length(*length_obj); | 369 holder->set_length(*length_obj); |
| 397 | 370 holder->set_weak_next(buffer->weak_first_view()); |
| 398 Heap* heap = isolate->heap(); | 371 buffer->set_weak_first_view(*holder); |
| 399 if (heap->InNewSpace(*holder)) { | |
| 400 holder->set_weak_next(heap->new_array_buffer_views_list()); | |
| 401 heap->set_new_array_buffer_views_list(*holder); | |
| 402 } else { | |
| 403 holder->set_weak_next(buffer->weak_first_view()); | |
| 404 buffer->set_weak_first_view(*holder); | |
| 405 } | |
| 406 | 372 |
| 407 Handle<ExternalArray> elements = isolate->factory()->NewExternalArray( | 373 Handle<ExternalArray> elements = isolate->factory()->NewExternalArray( |
| 408 static_cast<int>(length), array_type, | 374 static_cast<int>(length), array_type, |
| 409 static_cast<uint8_t*>(buffer->backing_store())); | 375 static_cast<uint8_t*>(buffer->backing_store())); |
| 410 Handle<Map> map = | 376 Handle<Map> map = |
| 411 JSObject::GetElementsTransitionMap(holder, external_elements_kind); | 377 JSObject::GetElementsTransitionMap(holder, external_elements_kind); |
| 412 JSObject::SetMapAndElements(holder, map, elements); | 378 JSObject::SetMapAndElements(holder, map, elements); |
| 413 | 379 |
| 414 if (source->IsJSTypedArray()) { | 380 if (source->IsJSTypedArray()) { |
| 415 Handle<JSTypedArray> typed_array(JSTypedArray::cast(*source)); | 381 Handle<JSTypedArray> typed_array(JSTypedArray::cast(*source)); |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 569 // Entire range [offset, offset + length] must be in bounds. | 535 // Entire range [offset, offset + length] must be in bounds. |
| 570 RUNTIME_ASSERT(offset <= buffer_length); | 536 RUNTIME_ASSERT(offset <= buffer_length); |
| 571 RUNTIME_ASSERT(offset + length <= buffer_length); | 537 RUNTIME_ASSERT(offset + length <= buffer_length); |
| 572 // No overflow. | 538 // No overflow. |
| 573 RUNTIME_ASSERT(offset + length >= offset); | 539 RUNTIME_ASSERT(offset + length >= offset); |
| 574 | 540 |
| 575 holder->set_buffer(*buffer); | 541 holder->set_buffer(*buffer); |
| 576 holder->set_byte_offset(*byte_offset); | 542 holder->set_byte_offset(*byte_offset); |
| 577 holder->set_byte_length(*byte_length); | 543 holder->set_byte_length(*byte_length); |
| 578 | 544 |
| 579 Heap* heap = isolate->heap(); | 545 holder->set_weak_next(buffer->weak_first_view()); |
| 580 if (heap->InNewSpace(*holder)) { | 546 buffer->set_weak_first_view(*holder); |
| 581 holder->set_weak_next(heap->new_array_buffer_views_list()); | |
| 582 heap->set_new_array_buffer_views_list(*holder); | |
| 583 } else { | |
| 584 holder->set_weak_next(buffer->weak_first_view()); | |
| 585 buffer->set_weak_first_view(*holder); | |
| 586 } | |
| 587 | 547 |
| 588 return isolate->heap()->undefined_value(); | 548 return isolate->heap()->undefined_value(); |
| 589 } | 549 } |
| 590 | 550 |
| 591 | 551 |
| 592 inline static bool NeedToFlipBytes(bool is_little_endian) { | 552 inline static bool NeedToFlipBytes(bool is_little_endian) { |
| 593 #ifdef V8_TARGET_LITTLE_ENDIAN | 553 #ifdef V8_TARGET_LITTLE_ENDIAN |
| 594 return !is_little_endian; | 554 return !is_little_endian; |
| 595 #else | 555 #else |
| 596 return is_little_endian; | 556 return is_little_endian; |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 801 DATA_VIEW_SETTER(Uint16, uint16_t) | 761 DATA_VIEW_SETTER(Uint16, uint16_t) |
| 802 DATA_VIEW_SETTER(Int16, int16_t) | 762 DATA_VIEW_SETTER(Int16, int16_t) |
| 803 DATA_VIEW_SETTER(Uint32, uint32_t) | 763 DATA_VIEW_SETTER(Uint32, uint32_t) |
| 804 DATA_VIEW_SETTER(Int32, int32_t) | 764 DATA_VIEW_SETTER(Int32, int32_t) |
| 805 DATA_VIEW_SETTER(Float32, float) | 765 DATA_VIEW_SETTER(Float32, float) |
| 806 DATA_VIEW_SETTER(Float64, double) | 766 DATA_VIEW_SETTER(Float64, double) |
| 807 | 767 |
| 808 #undef DATA_VIEW_SETTER | 768 #undef DATA_VIEW_SETTER |
| 809 } | 769 } |
| 810 } // namespace v8::internal | 770 } // namespace v8::internal |
| OLD | NEW |