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, bool is_shared) { |
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++) { |
42 array_buffer->SetInternalField(i, Smi::FromInt(0)); | 48 array_buffer->SetInternalField(i, Smi::FromInt(0)); |
43 } | 49 } |
44 array_buffer->set_backing_store(data); | 50 array_buffer->set_backing_store(data); |
45 array_buffer->set_flag(Smi::FromInt(0)); | 51 array_buffer->set_flag(Smi::FromInt(0)); |
46 array_buffer->set_is_external(is_external); | 52 array_buffer->set_is_external(is_external); |
47 array_buffer->set_is_neuterable(true); | 53 array_buffer->set_is_neuterable(true); |
| 54 array_buffer->set_is_shared(is_shared); |
48 | 55 |
49 Handle<Object> byte_length = | 56 Handle<Object> byte_length = |
50 isolate->factory()->NewNumberFromSize(allocated_length); | 57 isolate->factory()->NewNumberFromSize(allocated_length); |
51 CHECK(byte_length->IsSmi() || byte_length->IsHeapNumber()); | 58 CHECK(byte_length->IsSmi() || byte_length->IsHeapNumber()); |
52 array_buffer->set_byte_length(*byte_length); | 59 array_buffer->set_byte_length(*byte_length); |
53 | 60 |
54 array_buffer->set_weak_next(isolate->heap()->array_buffers_list()); | 61 array_buffer->set_weak_next(isolate->heap()->array_buffers_list()); |
55 isolate->heap()->set_array_buffers_list(*array_buffer); | 62 isolate->heap()->set_array_buffers_list(*array_buffer); |
56 array_buffer->set_weak_first_view(isolate->heap()->undefined_value()); | 63 array_buffer->set_weak_first_view(isolate->heap()->undefined_value()); |
57 } | 64 } |
58 | 65 |
59 | 66 |
60 bool Runtime::SetupArrayBufferAllocatingData(Isolate* isolate, | 67 bool Runtime::SetupArrayBufferAllocatingData(Isolate* isolate, |
61 Handle<JSArrayBuffer> array_buffer, | 68 Handle<JSArrayBuffer> array_buffer, |
62 size_t allocated_length, | 69 size_t allocated_length, |
63 bool initialize) { | 70 bool initialize, bool is_shared) { |
64 void* data; | 71 void* data; |
65 CHECK(V8::ArrayBufferAllocator() != NULL); | 72 CHECK(is_shared ? V8::SharedArrayBufferAllocator() != NULL |
| 73 : V8::ArrayBufferAllocator() != NULL); |
66 // Prevent creating array buffers when serializing. | 74 // Prevent creating array buffers when serializing. |
67 DCHECK(!isolate->serializer_enabled()); | 75 DCHECK(!isolate->serializer_enabled()); |
68 if (allocated_length != 0) { | 76 if (allocated_length != 0) { |
69 if (initialize) { | 77 if (is_shared) { |
70 data = V8::ArrayBufferAllocator()->Allocate(allocated_length); | 78 if (initialize) { |
| 79 data = V8::SharedArrayBufferAllocator()->Allocate(allocated_length); |
| 80 } else { |
| 81 data = V8::SharedArrayBufferAllocator()->AllocateUninitialized( |
| 82 allocated_length); |
| 83 } |
71 } else { | 84 } else { |
72 data = | 85 if (initialize) { |
73 V8::ArrayBufferAllocator()->AllocateUninitialized(allocated_length); | 86 data = V8::ArrayBufferAllocator()->Allocate(allocated_length); |
| 87 } else { |
| 88 data = |
| 89 V8::ArrayBufferAllocator()->AllocateUninitialized(allocated_length); |
| 90 } |
74 } | 91 } |
75 if (data == NULL) return false; | 92 if (data == NULL) return false; |
76 } else { | 93 } else { |
77 data = NULL; | 94 data = NULL; |
78 } | 95 } |
79 | 96 |
80 SetupArrayBuffer(isolate, array_buffer, false, data, allocated_length); | 97 SetupArrayBuffer(isolate, array_buffer, false, data, allocated_length, |
| 98 is_shared); |
81 | 99 |
82 reinterpret_cast<v8::Isolate*>(isolate) | 100 reinterpret_cast<v8::Isolate*>(isolate) |
83 ->AdjustAmountOfExternalAllocatedMemory(allocated_length); | 101 ->AdjustAmountOfExternalAllocatedMemory(allocated_length); |
84 | 102 |
85 return true; | 103 return true; |
86 } | 104 } |
87 | 105 |
88 | 106 |
89 void Runtime::NeuterArrayBuffer(Handle<JSArrayBuffer> array_buffer) { | 107 void Runtime::NeuterArrayBuffer(Handle<JSArrayBuffer> array_buffer) { |
90 Isolate* isolate = array_buffer->GetIsolate(); | 108 Isolate* isolate = array_buffer->GetIsolate(); |
(...skipping 28 matching lines...) Expand all Loading... |
119 } | 137 } |
120 } | 138 } |
121 view_obj = handle(view->weak_next(), isolate); | 139 view_obj = handle(view->weak_next(), isolate); |
122 } | 140 } |
123 array_buffer->Neuter(); | 141 array_buffer->Neuter(); |
124 } | 142 } |
125 | 143 |
126 | 144 |
127 RUNTIME_FUNCTION(Runtime_ArrayBufferInitialize) { | 145 RUNTIME_FUNCTION(Runtime_ArrayBufferInitialize) { |
128 HandleScope scope(isolate); | 146 HandleScope scope(isolate); |
129 DCHECK(args.length() == 2); | 147 DCHECK(args.length() == 3); |
130 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, holder, 0); | 148 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, holder, 0); |
131 CONVERT_NUMBER_ARG_HANDLE_CHECKED(byteLength, 1); | 149 CONVERT_NUMBER_ARG_HANDLE_CHECKED(byteLength, 1); |
| 150 CONVERT_BOOLEAN_ARG_CHECKED(isShared, 2); |
132 if (!holder->byte_length()->IsUndefined()) { | 151 if (!holder->byte_length()->IsUndefined()) { |
133 // ArrayBuffer is already initialized; probably a fuzz test. | 152 // ArrayBuffer is already initialized; probably a fuzz test. |
134 return *holder; | 153 return *holder; |
135 } | 154 } |
136 size_t allocated_length = 0; | 155 size_t allocated_length = 0; |
137 if (!TryNumberToSize(isolate, *byteLength, &allocated_length)) { | 156 if (!TryNumberToSize(isolate, *byteLength, &allocated_length)) { |
138 THROW_NEW_ERROR_RETURN_FAILURE( | 157 THROW_NEW_ERROR_RETURN_FAILURE( |
139 isolate, NewRangeError("invalid_array_buffer_length", | 158 isolate, NewRangeError("invalid_array_buffer_length", |
140 HandleVector<Object>(NULL, 0))); | 159 HandleVector<Object>(NULL, 0))); |
141 } | 160 } |
142 if (!Runtime::SetupArrayBufferAllocatingData(isolate, holder, | 161 if (!Runtime::SetupArrayBufferAllocatingData( |
143 allocated_length)) { | 162 isolate, holder, allocated_length, true, isShared)) { |
144 THROW_NEW_ERROR_RETURN_FAILURE( | 163 THROW_NEW_ERROR_RETURN_FAILURE( |
145 isolate, NewRangeError("invalid_array_buffer_length", | 164 isolate, NewRangeError("invalid_array_buffer_length", |
146 HandleVector<Object>(NULL, 0))); | 165 HandleVector<Object>(NULL, 0))); |
147 } | 166 } |
148 return *holder; | 167 return *holder; |
149 } | 168 } |
150 | 169 |
151 | 170 |
152 RUNTIME_FUNCTION(Runtime_ArrayBufferGetByteLength) { | 171 RUNTIME_FUNCTION(Runtime_ArrayBufferGetByteLength) { |
153 SealHandleScope shs(isolate); | 172 SealHandleScope shs(isolate); |
154 DCHECK(args.length() == 1); | 173 DCHECK(args.length() == 1); |
155 CONVERT_ARG_CHECKED(JSArrayBuffer, holder, 0); | 174 CONVERT_ARG_CHECKED(JSArrayBuffer, holder, 0); |
156 return holder->byte_length(); | 175 return holder->byte_length(); |
157 } | 176 } |
158 | 177 |
159 | 178 |
| 179 RUNTIME_FUNCTION(Runtime_ArrayBufferIsShared) { |
| 180 SealHandleScope shs(isolate); |
| 181 DCHECK(args.length() == 1); |
| 182 CONVERT_ARG_CHECKED(JSArrayBuffer, holder, 0); |
| 183 return isolate->heap()->ToBoolean(holder->is_shared()); |
| 184 } |
| 185 |
| 186 |
160 RUNTIME_FUNCTION(Runtime_ArrayBufferSliceImpl) { | 187 RUNTIME_FUNCTION(Runtime_ArrayBufferSliceImpl) { |
161 HandleScope scope(isolate); | 188 HandleScope scope(isolate); |
162 DCHECK(args.length() == 3); | 189 DCHECK(args.length() == 3); |
163 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, source, 0); | 190 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, source, 0); |
164 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, target, 1); | 191 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, target, 1); |
165 CONVERT_NUMBER_ARG_HANDLE_CHECKED(first, 2); | 192 CONVERT_NUMBER_ARG_HANDLE_CHECKED(first, 2); |
166 RUNTIME_ASSERT(!source.is_identical_to(target)); | 193 RUNTIME_ASSERT(!source.is_identical_to(target)); |
167 size_t start = 0; | 194 size_t start = 0; |
168 RUNTIME_ASSERT(TryNumberToSize(isolate, *first, &start)); | 195 RUNTIME_ASSERT(TryNumberToSize(isolate, *first, &start)); |
169 size_t target_length = NumberToSize(isolate, target->byte_length()); | 196 size_t target_length = NumberToSize(isolate, target->byte_length()); |
(...skipping 19 matching lines...) Expand all Loading... |
189 | 216 |
190 | 217 |
191 RUNTIME_FUNCTION(Runtime_ArrayBufferNeuter) { | 218 RUNTIME_FUNCTION(Runtime_ArrayBufferNeuter) { |
192 HandleScope scope(isolate); | 219 HandleScope scope(isolate); |
193 DCHECK(args.length() == 1); | 220 DCHECK(args.length() == 1); |
194 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, array_buffer, 0); | 221 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, array_buffer, 0); |
195 if (array_buffer->backing_store() == NULL) { | 222 if (array_buffer->backing_store() == NULL) { |
196 CHECK(Smi::FromInt(0) == array_buffer->byte_length()); | 223 CHECK(Smi::FromInt(0) == array_buffer->byte_length()); |
197 return isolate->heap()->undefined_value(); | 224 return isolate->heap()->undefined_value(); |
198 } | 225 } |
| 226 // Shared array buffers should never be neutered. |
| 227 DCHECK(!array_buffer->is_shared()); |
199 DCHECK(!array_buffer->is_external()); | 228 DCHECK(!array_buffer->is_external()); |
200 void* backing_store = array_buffer->backing_store(); | 229 void* backing_store = array_buffer->backing_store(); |
201 size_t byte_length = NumberToSize(isolate, array_buffer->byte_length()); | 230 size_t byte_length = NumberToSize(isolate, array_buffer->byte_length()); |
202 array_buffer->set_is_external(true); | 231 array_buffer->set_is_external(true); |
203 Runtime::NeuterArrayBuffer(array_buffer); | 232 Runtime::NeuterArrayBuffer(array_buffer); |
204 V8::ArrayBufferAllocator()->Free(backing_store, byte_length); | 233 V8::ArrayBufferAllocator()->Free(backing_store, byte_length); |
205 return isolate->heap()->undefined_value(); | 234 return isolate->heap()->undefined_value(); |
206 } | 235 } |
207 | 236 |
208 | 237 |
(...skipping 14 matching lines...) Expand all Loading... |
223 #undef ARRAY_ID_CASE | 252 #undef ARRAY_ID_CASE |
224 | 253 |
225 default: | 254 default: |
226 UNREACHABLE(); | 255 UNREACHABLE(); |
227 } | 256 } |
228 } | 257 } |
229 | 258 |
230 | 259 |
231 RUNTIME_FUNCTION(Runtime_TypedArrayInitialize) { | 260 RUNTIME_FUNCTION(Runtime_TypedArrayInitialize) { |
232 HandleScope scope(isolate); | 261 HandleScope scope(isolate); |
233 DCHECK(args.length() == 5); | 262 DCHECK(args.length() == 6); |
234 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0); | 263 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0); |
235 CONVERT_SMI_ARG_CHECKED(arrayId, 1); | 264 CONVERT_SMI_ARG_CHECKED(arrayId, 1); |
236 CONVERT_ARG_HANDLE_CHECKED(Object, maybe_buffer, 2); | 265 CONVERT_ARG_HANDLE_CHECKED(Object, maybe_buffer, 2); |
237 CONVERT_NUMBER_ARG_HANDLE_CHECKED(byte_offset_object, 3); | 266 CONVERT_NUMBER_ARG_HANDLE_CHECKED(byte_offset_object, 3); |
238 CONVERT_NUMBER_ARG_HANDLE_CHECKED(byte_length_object, 4); | 267 CONVERT_NUMBER_ARG_HANDLE_CHECKED(byte_length_object, 4); |
| 268 CONVERT_BOOLEAN_ARG_CHECKED(isShared, 5); |
239 | 269 |
240 RUNTIME_ASSERT(arrayId >= Runtime::ARRAY_ID_FIRST && | 270 RUNTIME_ASSERT(arrayId >= Runtime::ARRAY_ID_FIRST && |
241 arrayId <= Runtime::ARRAY_ID_LAST); | 271 arrayId <= Runtime::ARRAY_ID_LAST); |
242 | 272 |
243 ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization. | 273 ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization. |
244 size_t element_size = 1; // Bogus initialization. | 274 size_t element_size = 1; // Bogus initialization. |
245 ElementsKind external_elements_kind = | 275 ElementsKind external_elements_kind = |
246 EXTERNAL_INT8_ELEMENTS; // Bogus initialization. | 276 EXTERNAL_INT8_ELEMENTS; // Bogus initialization. |
247 ElementsKind fixed_elements_kind = INT8_ELEMENTS; // Bogus initialization. | 277 ElementsKind fixed_elements_kind = INT8_ELEMENTS; // Bogus initialization. |
248 Runtime::ArrayIdToTypeAndSize(arrayId, &array_type, &external_elements_kind, | 278 Runtime::ArrayIdToTypeAndSize(arrayId, &array_type, &external_elements_kind, |
249 &fixed_elements_kind, &element_size); | 279 &fixed_elements_kind, &element_size); |
250 RUNTIME_ASSERT(holder->map()->elements_kind() == fixed_elements_kind); | 280 RUNTIME_ASSERT(holder->map()->elements_kind() == fixed_elements_kind); |
251 | 281 |
252 size_t byte_offset = 0; | 282 size_t byte_offset = 0; |
253 size_t byte_length = 0; | 283 size_t byte_length = 0; |
254 RUNTIME_ASSERT(TryNumberToSize(isolate, *byte_offset_object, &byte_offset)); | 284 RUNTIME_ASSERT(TryNumberToSize(isolate, *byte_offset_object, &byte_offset)); |
255 RUNTIME_ASSERT(TryNumberToSize(isolate, *byte_length_object, &byte_length)); | 285 RUNTIME_ASSERT(TryNumberToSize(isolate, *byte_length_object, &byte_length)); |
256 | 286 |
257 if (maybe_buffer->IsJSArrayBuffer()) { | 287 if (maybe_buffer->IsJSArrayBuffer()) { |
258 Handle<JSArrayBuffer> buffer = Handle<JSArrayBuffer>::cast(maybe_buffer); | 288 Handle<JSArrayBuffer> buffer = Handle<JSArrayBuffer>::cast(maybe_buffer); |
259 size_t array_buffer_byte_length = | 289 size_t array_buffer_byte_length = |
260 NumberToSize(isolate, buffer->byte_length()); | 290 NumberToSize(isolate, buffer->byte_length()); |
261 RUNTIME_ASSERT(byte_offset <= array_buffer_byte_length); | 291 RUNTIME_ASSERT(byte_offset <= array_buffer_byte_length); |
262 RUNTIME_ASSERT(array_buffer_byte_length - byte_offset >= byte_length); | 292 RUNTIME_ASSERT(array_buffer_byte_length - byte_offset >= byte_length); |
| 293 RUNTIME_ASSERT(isShared == buffer->is_shared()); |
263 } else { | 294 } else { |
264 RUNTIME_ASSERT(maybe_buffer->IsNull()); | 295 RUNTIME_ASSERT(maybe_buffer->IsNull()); |
265 } | 296 } |
266 | 297 |
267 RUNTIME_ASSERT(byte_length % element_size == 0); | 298 RUNTIME_ASSERT(byte_length % element_size == 0); |
268 size_t length = byte_length / element_size; | 299 size_t length = byte_length / element_size; |
269 | 300 |
270 if (length > static_cast<unsigned>(Smi::kMaxValue)) { | 301 if (length > static_cast<unsigned>(Smi::kMaxValue)) { |
271 THROW_NEW_ERROR_RETURN_FAILURE( | 302 THROW_NEW_ERROR_RETURN_FAILURE( |
272 isolate, NewRangeError("invalid_typed_array_length", | 303 isolate, NewRangeError("invalid_typed_array_length", |
273 HandleVector<Object>(NULL, 0))); | 304 HandleVector<Object>(NULL, 0))); |
274 } | 305 } |
275 | 306 |
276 // All checks are done, now we can modify objects. | 307 // All checks are done, now we can modify objects. |
277 | 308 |
278 DCHECK(holder->GetInternalFieldCount() == | 309 DCHECK(holder->GetInternalFieldCount() == |
279 v8::ArrayBufferView::kInternalFieldCount); | 310 v8::ArrayBufferView::kInternalFieldCount); |
280 for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { | 311 for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { |
281 holder->SetInternalField(i, Smi::FromInt(0)); | 312 holder->SetInternalField(i, Smi::FromInt(0)); |
282 } | 313 } |
283 Handle<Object> length_obj = isolate->factory()->NewNumberFromSize(length); | 314 Handle<Object> length_obj = isolate->factory()->NewNumberFromSize(length); |
284 holder->set_length(*length_obj); | 315 holder->set_length(*length_obj); |
285 holder->set_byte_offset(*byte_offset_object); | 316 holder->set_byte_offset(*byte_offset_object); |
286 holder->set_byte_length(*byte_length_object); | 317 holder->set_byte_length(*byte_length_object); |
| 318 holder->set_is_shared(isShared); |
287 | 319 |
288 Heap* heap = isolate->heap(); | 320 Heap* heap = isolate->heap(); |
289 if (!maybe_buffer->IsNull()) { | 321 if (!maybe_buffer->IsNull()) { |
290 Handle<JSArrayBuffer> buffer = Handle<JSArrayBuffer>::cast(maybe_buffer); | 322 Handle<JSArrayBuffer> buffer = Handle<JSArrayBuffer>::cast(maybe_buffer); |
291 holder->set_buffer(*buffer); | 323 holder->set_buffer(*buffer); |
292 | 324 |
293 if (heap->InNewSpace(*holder)) { | 325 if (heap->InNewSpace(*holder)) { |
294 holder->set_weak_next(heap->new_array_buffer_views_list()); | 326 holder->set_weak_next(heap->new_array_buffer_views_list()); |
295 heap->set_new_array_buffer_views_list(*holder); | 327 heap->set_new_array_buffer_views_list(*holder); |
296 } else { | 328 } else { |
(...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
801 DATA_VIEW_SETTER(Uint16, uint16_t) | 833 DATA_VIEW_SETTER(Uint16, uint16_t) |
802 DATA_VIEW_SETTER(Int16, int16_t) | 834 DATA_VIEW_SETTER(Int16, int16_t) |
803 DATA_VIEW_SETTER(Uint32, uint32_t) | 835 DATA_VIEW_SETTER(Uint32, uint32_t) |
804 DATA_VIEW_SETTER(Int32, int32_t) | 836 DATA_VIEW_SETTER(Int32, int32_t) |
805 DATA_VIEW_SETTER(Float32, float) | 837 DATA_VIEW_SETTER(Float32, float) |
806 DATA_VIEW_SETTER(Float64, double) | 838 DATA_VIEW_SETTER(Float64, double) |
807 | 839 |
808 #undef DATA_VIEW_SETTER | 840 #undef DATA_VIEW_SETTER |
809 } | 841 } |
810 } // namespace v8::internal | 842 } // namespace v8::internal |
OLD | NEW |