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 |
11 | 11 |
12 namespace v8 { | 12 namespace v8 { |
13 namespace internal { | 13 namespace internal { |
14 | 14 |
15 void Runtime::FreeArrayBuffer(Isolate* isolate, | 15 void Runtime::FreeArrayBuffer(Isolate* isolate, |
16 JSArrayBuffer* phantom_array_buffer) { | 16 JSArrayBuffer* phantom_array_buffer) { |
17 if (phantom_array_buffer->should_be_freed()) { | 17 if (phantom_array_buffer->should_be_freed()) { |
18 DCHECK(phantom_array_buffer->is_external()); | 18 DCHECK(phantom_array_buffer->is_external()); |
19 free(phantom_array_buffer->backing_store()); | 19 free(phantom_array_buffer->backing_store()); |
20 } | 20 } |
21 if (phantom_array_buffer->is_external()) return; | 21 if (phantom_array_buffer->is_external()) return; |
22 | 22 |
23 size_t allocated_length = | 23 size_t allocated_length = |
24 NumberToSize(isolate, phantom_array_buffer->byte_length()); | 24 NumberToSize(isolate, phantom_array_buffer->byte_length()); |
25 | 25 |
26 reinterpret_cast<v8::Isolate*>(isolate) | 26 reinterpret_cast<v8::Isolate*>(isolate) |
27 ->AdjustAmountOfExternalAllocatedMemory( | 27 ->AdjustAmountOfExternalAllocatedMemory( |
28 -static_cast<int64_t>(allocated_length)); | 28 -static_cast<int64_t>(allocated_length)); |
29 CHECK(V8::ArrayBufferAllocator() != NULL); | 29 if (phantom_array_buffer->is_shared()) { |
30 V8::ArrayBufferAllocator()->Free(phantom_array_buffer->backing_store(), | 30 CHECK(V8::SharedArrayBufferAllocator() != NULL); |
31 allocated_length); | 31 V8::SharedArrayBufferAllocator()->Free( |
32 phantom_array_buffer->backing_store(), allocated_length); | |
33 } else { | |
34 CHECK(V8::ArrayBufferAllocator() != NULL); | |
35 V8::ArrayBufferAllocator()->Free(phantom_array_buffer->backing_store(), | |
36 allocated_length); | |
37 } | |
32 } | 38 } |
33 | 39 |
34 | 40 |
35 void Runtime::SetupArrayBuffer(Isolate* isolate, | 41 void Runtime::SetupArrayBuffer(Isolate* isolate, |
36 Handle<JSArrayBuffer> array_buffer, | 42 Handle<JSArrayBuffer> array_buffer, |
37 bool is_external, void* data, | 43 bool is_external, void* data, |
38 size_t allocated_length) { | 44 size_t allocated_length) { |
39 DCHECK(array_buffer->GetInternalFieldCount() == | 45 DCHECK(array_buffer->GetInternalFieldCount() == |
40 v8::ArrayBuffer::kInternalFieldCount); | 46 v8::ArrayBuffer::kInternalFieldCount); |
41 for (int i = 0; i < v8::ArrayBuffer::kInternalFieldCount; i++) { | 47 for (int i = 0; i < v8::ArrayBuffer::kInternalFieldCount; i++) { |
(...skipping 21 matching lines...) Expand all Loading... | |
63 ->set_weak_next(*array_buffer); | 69 ->set_weak_next(*array_buffer); |
64 isolate->heap()->set_last_array_buffer_in_list(*array_buffer); | 70 isolate->heap()->set_last_array_buffer_in_list(*array_buffer); |
65 } | 71 } |
66 } | 72 } |
67 | 73 |
68 | 74 |
69 bool Runtime::SetupArrayBufferAllocatingData(Isolate* isolate, | 75 bool Runtime::SetupArrayBufferAllocatingData(Isolate* isolate, |
70 Handle<JSArrayBuffer> array_buffer, | 76 Handle<JSArrayBuffer> array_buffer, |
71 size_t allocated_length, | 77 size_t allocated_length, |
72 bool initialize) { | 78 bool initialize) { |
79 bool is_shared = array_buffer->is_shared(); | |
Jarin
2015/04/29 04:46:01
This should be array_buffer->is_shared() == SHARED
binji
2015/04/29 18:27:22
Done.
| |
73 void* data; | 80 void* data; |
74 CHECK(V8::ArrayBufferAllocator() != NULL); | 81 CHECK(is_shared ? V8::SharedArrayBufferAllocator() != NULL |
82 : V8::ArrayBufferAllocator() != NULL); | |
75 // Prevent creating array buffers when serializing. | 83 // Prevent creating array buffers when serializing. |
76 DCHECK(!isolate->serializer_enabled()); | 84 DCHECK(!isolate->serializer_enabled()); |
77 if (allocated_length != 0) { | 85 if (allocated_length != 0) { |
78 if (initialize) { | 86 if (is_shared) { |
79 data = V8::ArrayBufferAllocator()->Allocate(allocated_length); | 87 if (initialize) { |
88 data = V8::SharedArrayBufferAllocator()->Allocate(allocated_length); | |
89 } else { | |
90 data = V8::SharedArrayBufferAllocator()->AllocateUninitialized( | |
91 allocated_length); | |
92 } | |
80 } else { | 93 } else { |
81 data = | 94 if (initialize) { |
82 V8::ArrayBufferAllocator()->AllocateUninitialized(allocated_length); | 95 data = V8::ArrayBufferAllocator()->Allocate(allocated_length); |
96 } else { | |
97 data = | |
98 V8::ArrayBufferAllocator()->AllocateUninitialized(allocated_length); | |
99 } | |
83 } | 100 } |
84 if (data == NULL) return false; | 101 if (data == NULL) return false; |
85 } else { | 102 } else { |
86 data = NULL; | 103 data = NULL; |
87 } | 104 } |
88 | 105 |
89 SetupArrayBuffer(isolate, array_buffer, false, data, allocated_length); | 106 SetupArrayBuffer(isolate, array_buffer, false, data, allocated_length); |
90 | 107 |
91 reinterpret_cast<v8::Isolate*>(isolate) | 108 reinterpret_cast<v8::Isolate*>(isolate) |
92 ->AdjustAmountOfExternalAllocatedMemory(allocated_length); | 109 ->AdjustAmountOfExternalAllocatedMemory(allocated_length); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
126 | 143 |
127 | 144 |
128 RUNTIME_FUNCTION(Runtime_ArrayBufferGetByteLength) { | 145 RUNTIME_FUNCTION(Runtime_ArrayBufferGetByteLength) { |
129 SealHandleScope shs(isolate); | 146 SealHandleScope shs(isolate); |
130 DCHECK(args.length() == 1); | 147 DCHECK(args.length() == 1); |
131 CONVERT_ARG_CHECKED(JSArrayBuffer, holder, 0); | 148 CONVERT_ARG_CHECKED(JSArrayBuffer, holder, 0); |
132 return holder->byte_length(); | 149 return holder->byte_length(); |
133 } | 150 } |
134 | 151 |
135 | 152 |
153 RUNTIME_FUNCTION(Runtime_ArrayBufferIsShared) { | |
154 SealHandleScope shs(isolate); | |
155 DCHECK(args.length() == 1); | |
156 CONVERT_ARG_CHECKED(JSArrayBuffer, holder, 0); | |
157 return isolate->heap()->ToBoolean(holder->is_shared()); | |
158 } | |
159 | |
160 | |
136 RUNTIME_FUNCTION(Runtime_ArrayBufferSliceImpl) { | 161 RUNTIME_FUNCTION(Runtime_ArrayBufferSliceImpl) { |
137 HandleScope scope(isolate); | 162 HandleScope scope(isolate); |
138 DCHECK(args.length() == 3); | 163 DCHECK(args.length() == 3); |
139 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, source, 0); | 164 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, source, 0); |
140 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, target, 1); | 165 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, target, 1); |
141 CONVERT_NUMBER_ARG_HANDLE_CHECKED(first, 2); | 166 CONVERT_NUMBER_ARG_HANDLE_CHECKED(first, 2); |
142 RUNTIME_ASSERT(!source.is_identical_to(target)); | 167 RUNTIME_ASSERT(!source.is_identical_to(target)); |
143 size_t start = 0; | 168 size_t start = 0; |
144 RUNTIME_ASSERT(TryNumberToSize(isolate, *first, &start)); | 169 RUNTIME_ASSERT(TryNumberToSize(isolate, *first, &start)); |
145 size_t target_length = NumberToSize(isolate, target->byte_length()); | 170 size_t target_length = NumberToSize(isolate, target->byte_length()); |
(...skipping 19 matching lines...) Expand all Loading... | |
165 | 190 |
166 | 191 |
167 RUNTIME_FUNCTION(Runtime_ArrayBufferNeuter) { | 192 RUNTIME_FUNCTION(Runtime_ArrayBufferNeuter) { |
168 HandleScope scope(isolate); | 193 HandleScope scope(isolate); |
169 DCHECK(args.length() == 1); | 194 DCHECK(args.length() == 1); |
170 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, array_buffer, 0); | 195 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, array_buffer, 0); |
171 if (array_buffer->backing_store() == NULL) { | 196 if (array_buffer->backing_store() == NULL) { |
172 CHECK(Smi::FromInt(0) == array_buffer->byte_length()); | 197 CHECK(Smi::FromInt(0) == array_buffer->byte_length()); |
173 return isolate->heap()->undefined_value(); | 198 return isolate->heap()->undefined_value(); |
174 } | 199 } |
200 // Shared array buffers should never be neutered. | |
201 DCHECK(!array_buffer->is_shared()); | |
jochen (gone - plz use gerrit)
2015/04/28 18:31:46
why? What about ArrayBuffer.transfer?
Jarin
2015/04/29 04:46:01
The whole idea of SharedArrayBuffer is that it can
binji
2015/04/29 18:27:22
I asked about this on the spec doc, but I think it
| |
175 DCHECK(!array_buffer->is_external()); | 202 DCHECK(!array_buffer->is_external()); |
176 void* backing_store = array_buffer->backing_store(); | 203 void* backing_store = array_buffer->backing_store(); |
177 size_t byte_length = NumberToSize(isolate, array_buffer->byte_length()); | 204 size_t byte_length = NumberToSize(isolate, array_buffer->byte_length()); |
178 array_buffer->set_is_external(true); | 205 array_buffer->set_is_external(true); |
179 Runtime::NeuterArrayBuffer(array_buffer); | 206 Runtime::NeuterArrayBuffer(array_buffer); |
180 V8::ArrayBufferAllocator()->Free(backing_store, byte_length); | 207 V8::ArrayBufferAllocator()->Free(backing_store, byte_length); |
181 return isolate->heap()->undefined_value(); | 208 return isolate->heap()->undefined_value(); |
182 } | 209 } |
183 | 210 |
184 | 211 |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
435 | 462 |
436 if (!args[1]->IsJSTypedArray()) | 463 if (!args[1]->IsJSTypedArray()) |
437 return Smi::FromInt(TYPED_ARRAY_SET_NON_TYPED_ARRAY); | 464 return Smi::FromInt(TYPED_ARRAY_SET_NON_TYPED_ARRAY); |
438 | 465 |
439 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, target_obj, 0); | 466 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, target_obj, 0); |
440 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, source_obj, 1); | 467 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, source_obj, 1); |
441 CONVERT_NUMBER_ARG_HANDLE_CHECKED(offset_obj, 2); | 468 CONVERT_NUMBER_ARG_HANDLE_CHECKED(offset_obj, 2); |
442 | 469 |
443 Handle<JSTypedArray> target(JSTypedArray::cast(*target_obj)); | 470 Handle<JSTypedArray> target(JSTypedArray::cast(*target_obj)); |
444 Handle<JSTypedArray> source(JSTypedArray::cast(*source_obj)); | 471 Handle<JSTypedArray> source(JSTypedArray::cast(*source_obj)); |
472 | |
473 if (target->is_shared() != source->is_shared()) { | |
474 THROW_NEW_ERROR_RETURN_FAILURE( | |
475 isolate, | |
476 NewTypeError("invalid_argument", HandleVector<Object>(NULL, 0))); | |
477 } | |
478 | |
445 size_t offset = 0; | 479 size_t offset = 0; |
446 RUNTIME_ASSERT(TryNumberToSize(isolate, *offset_obj, &offset)); | 480 RUNTIME_ASSERT(TryNumberToSize(isolate, *offset_obj, &offset)); |
447 size_t target_length = NumberToSize(isolate, target->length()); | 481 size_t target_length = NumberToSize(isolate, target->length()); |
448 size_t source_length = NumberToSize(isolate, source->length()); | 482 size_t source_length = NumberToSize(isolate, source->length()); |
449 size_t target_byte_length = NumberToSize(isolate, target->byte_length()); | 483 size_t target_byte_length = NumberToSize(isolate, target->byte_length()); |
450 size_t source_byte_length = NumberToSize(isolate, source->byte_length()); | 484 size_t source_byte_length = NumberToSize(isolate, source->byte_length()); |
451 if (offset > target_length || offset + source_length > target_length || | 485 if (offset > target_length || offset + source_length > target_length || |
452 offset + source_length < offset) { // overflow | 486 offset + source_length < offset) { // overflow |
453 THROW_NEW_ERROR_RETURN_FAILURE( | 487 THROW_NEW_ERROR_RETURN_FAILURE( |
454 isolate, NewRangeError("typed_array_set_source_too_large", | 488 isolate, NewRangeError("typed_array_set_source_too_large", |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
749 DATA_VIEW_SETTER(Uint16, uint16_t) | 783 DATA_VIEW_SETTER(Uint16, uint16_t) |
750 DATA_VIEW_SETTER(Int16, int16_t) | 784 DATA_VIEW_SETTER(Int16, int16_t) |
751 DATA_VIEW_SETTER(Uint32, uint32_t) | 785 DATA_VIEW_SETTER(Uint32, uint32_t) |
752 DATA_VIEW_SETTER(Int32, int32_t) | 786 DATA_VIEW_SETTER(Int32, int32_t) |
753 DATA_VIEW_SETTER(Float32, float) | 787 DATA_VIEW_SETTER(Float32, float) |
754 DATA_VIEW_SETTER(Float64, double) | 788 DATA_VIEW_SETTER(Float64, double) |
755 | 789 |
756 #undef DATA_VIEW_SETTER | 790 #undef DATA_VIEW_SETTER |
757 } | 791 } |
758 } // namespace v8::internal | 792 } // namespace v8::internal |
OLD | NEW |