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

Side by Side Diff: src/runtime/runtime-typedarray.cc

Issue 933533003: Version 4.2.70.1 (cherry-pick) (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@4.2.70
Patch Set: Created 5 years, 10 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
« no previous file with comments | « src/objects.cc ('k') | src/serialize.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/objects.cc ('k') | src/serialize.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698