OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/api.h" | 5 #include "src/api.h" |
6 | 6 |
7 #include <string.h> // For memcpy, strlen. | 7 #include <string.h> // For memcpy, strlen. |
8 #ifdef V8_USE_ADDRESS_SANITIZER | 8 #ifdef V8_USE_ADDRESS_SANITIZER |
9 #include <sanitizer/asan_interface.h> | 9 #include <sanitizer/asan_interface.h> |
10 #endif // V8_USE_ADDRESS_SANITIZER | 10 #endif // V8_USE_ADDRESS_SANITIZER |
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
332 virtual void Free(void* data, size_t) { free(data); } | 332 virtual void Free(void* data, size_t) { free(data); } |
333 }; | 333 }; |
334 | 334 |
335 } // namespace | 335 } // namespace |
336 | 336 |
337 | 337 |
338 StartupData V8::CreateSnapshotDataBlob(const char* custom_source) { | 338 StartupData V8::CreateSnapshotDataBlob(const char* custom_source) { |
339 i::Isolate* internal_isolate = new i::Isolate(true); | 339 i::Isolate* internal_isolate = new i::Isolate(true); |
340 ArrayBufferAllocator allocator; | 340 ArrayBufferAllocator allocator; |
341 internal_isolate->set_array_buffer_allocator(&allocator); | 341 internal_isolate->set_array_buffer_allocator(&allocator); |
| 342 internal_isolate->set_shared_array_buffer_allocator(&allocator); |
342 Isolate* isolate = reinterpret_cast<Isolate*>(internal_isolate); | 343 Isolate* isolate = reinterpret_cast<Isolate*>(internal_isolate); |
343 StartupData result = {NULL, 0}; | 344 StartupData result = {NULL, 0}; |
344 { | 345 { |
345 base::ElapsedTimer timer; | 346 base::ElapsedTimer timer; |
346 timer.Start(); | 347 timer.Start(); |
347 Isolate::Scope isolate_scope(isolate); | 348 Isolate::Scope isolate_scope(isolate); |
348 internal_isolate->Init(NULL); | 349 internal_isolate->Init(NULL); |
349 Persistent<Context> context; | 350 Persistent<Context> context; |
350 i::Snapshot::Metadata metadata; | 351 i::Snapshot::Metadata metadata; |
351 { | 352 { |
(...skipping 2321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2673 return Utils::OpenHandle(this)->IsSymbol(); | 2674 return Utils::OpenHandle(this)->IsSymbol(); |
2674 } | 2675 } |
2675 | 2676 |
2676 | 2677 |
2677 bool Value::IsArray() const { | 2678 bool Value::IsArray() const { |
2678 return Utils::OpenHandle(this)->IsJSArray(); | 2679 return Utils::OpenHandle(this)->IsJSArray(); |
2679 } | 2680 } |
2680 | 2681 |
2681 | 2682 |
2682 bool Value::IsArrayBuffer() const { | 2683 bool Value::IsArrayBuffer() const { |
2683 return Utils::OpenHandle(this)->IsJSArrayBuffer(); | 2684 i::Handle<i::Object> obj = Utils::OpenHandle(this); |
| 2685 return obj->IsJSArrayBuffer() && !i::JSArrayBuffer::cast(*obj)->is_shared(); |
2684 } | 2686 } |
2685 | 2687 |
2686 | 2688 |
2687 bool Value::IsArrayBufferView() const { | 2689 bool Value::IsArrayBufferView() const { |
2688 return Utils::OpenHandle(this)->IsJSArrayBufferView(); | 2690 i::Handle<i::Object> obj = Utils::OpenHandle(this); |
| 2691 return obj->IsJSArrayBufferView() && |
| 2692 !i::JSArrayBufferView::cast(*obj)->is_shared(); |
2689 } | 2693 } |
2690 | 2694 |
2691 | 2695 |
2692 bool Value::IsTypedArray() const { | 2696 bool Value::IsTypedArray() const { |
2693 return Utils::OpenHandle(this)->IsJSTypedArray(); | 2697 i::Handle<i::Object> obj = Utils::OpenHandle(this); |
| 2698 return obj->IsJSTypedArray() && !i::JSTypedArray::cast(*obj)->is_shared(); |
2694 } | 2699 } |
2695 | 2700 |
2696 | 2701 |
2697 #define VALUE_IS_TYPED_ARRAY(Type, typeName, TYPE, ctype, size) \ | 2702 #define VALUE_IS_TYPED_ARRAY(Type, typeName, TYPE, ctype, size) \ |
2698 bool Value::Is##Type##Array() const { \ | 2703 bool Value::Is##Type##Array() const { \ |
2699 i::Handle<i::Object> obj = Utils::OpenHandle(this); \ | 2704 i::Handle<i::Object> obj = Utils::OpenHandle(this); \ |
2700 return obj->IsJSTypedArray() && \ | 2705 if (!obj->IsJSTypedArray()) return false; \ |
2701 i::JSTypedArray::cast(*obj)->type() == i::kExternal##Type##Array; \ | 2706 i::JSTypedArray* typed_array = i::JSTypedArray::cast(*obj); \ |
| 2707 return typed_array->type() == i::kExternal##Type##Array && \ |
| 2708 !typed_array->is_shared(); \ |
2702 } | 2709 } |
2703 | 2710 |
| 2711 |
2704 TYPED_ARRAYS(VALUE_IS_TYPED_ARRAY) | 2712 TYPED_ARRAYS(VALUE_IS_TYPED_ARRAY) |
2705 | 2713 |
2706 #undef VALUE_IS_TYPED_ARRAY | 2714 #undef VALUE_IS_TYPED_ARRAY |
2707 | 2715 |
2708 | 2716 |
2709 bool Value::IsDataView() const { | 2717 bool Value::IsDataView() const { |
2710 return Utils::OpenHandle(this)->IsJSDataView(); | 2718 return Utils::OpenHandle(this)->IsJSDataView(); |
2711 } | 2719 } |
2712 | 2720 |
2713 | 2721 |
| 2722 bool Value::IsSharedArrayBuffer() const { |
| 2723 i::Handle<i::Object> obj = Utils::OpenHandle(this); |
| 2724 return obj->IsJSArrayBuffer() && i::JSArrayBuffer::cast(*obj)->is_shared(); |
| 2725 } |
| 2726 |
| 2727 |
| 2728 bool Value::IsSharedTypedArray() const { |
| 2729 i::Handle<i::Object> obj = Utils::OpenHandle(this); |
| 2730 return obj->IsJSTypedArray() && i::JSTypedArray::cast(*obj)->is_shared(); |
| 2731 } |
| 2732 |
| 2733 |
| 2734 #define VALUE_IS_SHARED_TYPED_ARRAY(Type, typeName, TYPE, ctype, size) \ |
| 2735 bool Value::IsShared##Type##Array() const { \ |
| 2736 i::Handle<i::Object> obj = Utils::OpenHandle(this); \ |
| 2737 if (!obj->IsJSTypedArray()) return false; \ |
| 2738 i::JSTypedArray* typed_array = i::JSTypedArray::cast(*obj); \ |
| 2739 return typed_array->type() == v8::internal::kExternal##Type##Array && \ |
| 2740 typed_array->is_shared(); \ |
| 2741 } |
| 2742 |
| 2743 |
| 2744 TYPED_ARRAYS(VALUE_IS_SHARED_TYPED_ARRAY) |
| 2745 |
| 2746 #undef VALUE_IS_SHARED_TYPED_ARRAY |
| 2747 |
| 2748 |
2714 bool Value::IsObject() const { | 2749 bool Value::IsObject() const { |
2715 return Utils::OpenHandle(this)->IsJSObject(); | 2750 return Utils::OpenHandle(this)->IsJSObject(); |
2716 } | 2751 } |
2717 | 2752 |
2718 | 2753 |
2719 bool Value::IsNumber() const { | 2754 bool Value::IsNumber() const { |
2720 return Utils::OpenHandle(this)->IsNumber(); | 2755 return Utils::OpenHandle(this)->IsNumber(); |
2721 } | 2756 } |
2722 | 2757 |
2723 | 2758 |
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3080 | 3115 |
3081 void v8::Promise::Resolver::CheckCast(Value* that) { | 3116 void v8::Promise::Resolver::CheckCast(Value* that) { |
3082 Utils::ApiCheck(that->IsPromise(), | 3117 Utils::ApiCheck(that->IsPromise(), |
3083 "v8::Promise::Resolver::Cast()", | 3118 "v8::Promise::Resolver::Cast()", |
3084 "Could not convert to promise resolver"); | 3119 "Could not convert to promise resolver"); |
3085 } | 3120 } |
3086 | 3121 |
3087 | 3122 |
3088 void v8::ArrayBuffer::CheckCast(Value* that) { | 3123 void v8::ArrayBuffer::CheckCast(Value* that) { |
3089 i::Handle<i::Object> obj = Utils::OpenHandle(that); | 3124 i::Handle<i::Object> obj = Utils::OpenHandle(that); |
3090 Utils::ApiCheck(obj->IsJSArrayBuffer(), | 3125 Utils::ApiCheck( |
3091 "v8::ArrayBuffer::Cast()", | 3126 obj->IsJSArrayBuffer() && !i::JSArrayBuffer::cast(*obj)->is_shared(), |
3092 "Could not convert to ArrayBuffer"); | 3127 "v8::ArrayBuffer::Cast()", "Could not convert to ArrayBuffer"); |
3093 } | 3128 } |
3094 | 3129 |
3095 | 3130 |
3096 void v8::ArrayBufferView::CheckCast(Value* that) { | 3131 void v8::ArrayBufferView::CheckCast(Value* that) { |
3097 i::Handle<i::Object> obj = Utils::OpenHandle(that); | 3132 i::Handle<i::Object> obj = Utils::OpenHandle(that); |
3098 Utils::ApiCheck(obj->IsJSArrayBufferView(), | 3133 Utils::ApiCheck(obj->IsJSArrayBufferView(), |
3099 "v8::ArrayBufferView::Cast()", | 3134 "v8::ArrayBufferView::Cast()", |
3100 "Could not convert to ArrayBufferView"); | 3135 "Could not convert to ArrayBufferView"); |
3101 } | 3136 } |
3102 | 3137 |
3103 | 3138 |
3104 void v8::TypedArray::CheckCast(Value* that) { | 3139 void v8::TypedArray::CheckCast(Value* that) { |
3105 i::Handle<i::Object> obj = Utils::OpenHandle(that); | 3140 i::Handle<i::Object> obj = Utils::OpenHandle(that); |
3106 Utils::ApiCheck(obj->IsJSTypedArray(), | 3141 Utils::ApiCheck( |
3107 "v8::TypedArray::Cast()", | 3142 obj->IsJSTypedArray() && !i::JSTypedArray::cast(*obj)->is_shared(), |
3108 "Could not convert to TypedArray"); | 3143 "v8::TypedArray::Cast()", "Could not convert to TypedArray"); |
3109 } | 3144 } |
3110 | 3145 |
3111 | 3146 |
3112 #define CHECK_TYPED_ARRAY_CAST(Type, typeName, TYPE, ctype, size) \ | 3147 #define CHECK_TYPED_ARRAY_CAST(Type, typeName, TYPE, ctype, size) \ |
3113 void v8::Type##Array::CheckCast(Value* that) { \ | 3148 void v8::Type##Array::CheckCast(Value* that) { \ |
3114 i::Handle<i::Object> obj = Utils::OpenHandle(that); \ | 3149 i::Handle<i::Object> obj = Utils::OpenHandle(that); \ |
3115 Utils::ApiCheck( \ | 3150 Utils::ApiCheck(obj->IsJSTypedArray() && \ |
3116 obj->IsJSTypedArray() && \ | 3151 i::JSTypedArray::cast(*obj)->type() == \ |
3117 i::JSTypedArray::cast(*obj)->type() == i::kExternal##Type##Array, \ | 3152 i::kExternal##Type##Array && \ |
3118 "v8::" #Type "Array::Cast()", "Could not convert to " #Type "Array"); \ | 3153 !i::JSTypedArray::cast(*obj)->is_shared(), \ |
| 3154 "v8::" #Type "Array::Cast()", \ |
| 3155 "Could not convert to " #Type "Array"); \ |
3119 } | 3156 } |
3120 | 3157 |
3121 | 3158 |
3122 TYPED_ARRAYS(CHECK_TYPED_ARRAY_CAST) | 3159 TYPED_ARRAYS(CHECK_TYPED_ARRAY_CAST) |
3123 | 3160 |
3124 #undef CHECK_TYPED_ARRAY_CAST | 3161 #undef CHECK_TYPED_ARRAY_CAST |
3125 | 3162 |
3126 | 3163 |
3127 void v8::DataView::CheckCast(Value* that) { | 3164 void v8::DataView::CheckCast(Value* that) { |
3128 i::Handle<i::Object> obj = Utils::OpenHandle(that); | 3165 i::Handle<i::Object> obj = Utils::OpenHandle(that); |
3129 Utils::ApiCheck(obj->IsJSDataView(), | 3166 Utils::ApiCheck(obj->IsJSDataView(), |
3130 "v8::DataView::Cast()", | 3167 "v8::DataView::Cast()", |
3131 "Could not convert to DataView"); | 3168 "Could not convert to DataView"); |
3132 } | 3169 } |
3133 | 3170 |
3134 | 3171 |
| 3172 void v8::SharedArrayBuffer::CheckCast(Value* that) { |
| 3173 i::Handle<i::Object> obj = Utils::OpenHandle(that); |
| 3174 Utils::ApiCheck( |
| 3175 obj->IsJSArrayBuffer() && i::JSArrayBuffer::cast(*obj)->is_shared(), |
| 3176 "v8::SharedArrayBuffer::Cast()", |
| 3177 "Could not convert to SharedArrayBuffer"); |
| 3178 } |
| 3179 |
| 3180 |
| 3181 void v8::SharedTypedArray::CheckCast(Value* that) { |
| 3182 i::Handle<i::Object> obj = Utils::OpenHandle(that); |
| 3183 Utils::ApiCheck( |
| 3184 obj->IsJSTypedArray() && i::JSTypedArray::cast(*obj)->is_shared(), |
| 3185 "v8::SharedTypedArray::Cast()", "Could not convert to SharedTypedArray"); |
| 3186 } |
| 3187 |
| 3188 |
| 3189 #define CHECK_SHARED_TYPED_ARRAY_CAST(Type, typeName, TYPE, ctype, size) \ |
| 3190 void v8::Shared##Type##Array::CheckCast(Value* that) { \ |
| 3191 i::Handle<i::Object> obj = Utils::OpenHandle(that); \ |
| 3192 Utils::ApiCheck(obj->IsJSTypedArray() && \ |
| 3193 i::JSTypedArray::cast(*obj)->type() == \ |
| 3194 i::kExternal##Type##Array && \ |
| 3195 i::JSTypedArray::cast(*obj)->is_shared(), \ |
| 3196 "v8::Shared" #Type "Array::Cast()", \ |
| 3197 "Could not convert to Shared" #Type "Array"); \ |
| 3198 } |
| 3199 |
| 3200 |
| 3201 TYPED_ARRAYS(CHECK_SHARED_TYPED_ARRAY_CAST) |
| 3202 |
| 3203 #undef CHECK_SHARED_TYPED_ARRAY_CAST |
| 3204 |
| 3205 |
3135 void v8::Date::CheckCast(v8::Value* that) { | 3206 void v8::Date::CheckCast(v8::Value* that) { |
3136 i::Handle<i::Object> obj = Utils::OpenHandle(that); | 3207 i::Handle<i::Object> obj = Utils::OpenHandle(that); |
3137 i::Isolate* isolate = NULL; | 3208 i::Isolate* isolate = NULL; |
3138 if (obj->IsHeapObject()) isolate = i::HeapObject::cast(*obj)->GetIsolate(); | 3209 if (obj->IsHeapObject()) isolate = i::HeapObject::cast(*obj)->GetIsolate(); |
3139 Utils::ApiCheck(isolate != NULL && | 3210 Utils::ApiCheck(isolate != NULL && |
3140 obj->HasSpecificClassOf(isolate->heap()->Date_string()), | 3211 obj->HasSpecificClassOf(isolate->heap()->Date_string()), |
3141 "v8::Date::Cast()", | 3212 "v8::Date::Cast()", |
3142 "Could not convert to date"); | 3213 "Could not convert to date"); |
3143 } | 3214 } |
3144 | 3215 |
(...skipping 2173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5318 | 5389 |
5319 void v8::V8::SetArrayBufferAllocator( | 5390 void v8::V8::SetArrayBufferAllocator( |
5320 ArrayBuffer::Allocator* allocator) { | 5391 ArrayBuffer::Allocator* allocator) { |
5321 if (!Utils::ApiCheck(i::V8::ArrayBufferAllocator() == NULL, | 5392 if (!Utils::ApiCheck(i::V8::ArrayBufferAllocator() == NULL, |
5322 "v8::V8::SetArrayBufferAllocator", | 5393 "v8::V8::SetArrayBufferAllocator", |
5323 "ArrayBufferAllocator might only be set once")) | 5394 "ArrayBufferAllocator might only be set once")) |
5324 return; | 5395 return; |
5325 i::V8::SetArrayBufferAllocator(allocator); | 5396 i::V8::SetArrayBufferAllocator(allocator); |
5326 } | 5397 } |
5327 | 5398 |
5328 | |
5329 bool v8::V8::Dispose() { | 5399 bool v8::V8::Dispose() { |
5330 i::V8::TearDown(); | 5400 i::V8::TearDown(); |
5331 #ifdef V8_USE_EXTERNAL_STARTUP_DATA | 5401 #ifdef V8_USE_EXTERNAL_STARTUP_DATA |
5332 i::DisposeNatives(); | 5402 i::DisposeNatives(); |
5333 #endif | 5403 #endif |
5334 return true; | 5404 return true; |
5335 } | 5405 } |
5336 | 5406 |
5337 | 5407 |
5338 HeapStatistics::HeapStatistics(): total_heap_size_(0), | 5408 HeapStatistics::HeapStatistics(): total_heap_size_(0), |
(...skipping 945 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6284 i::Handle<i::JSArrayBuffer> obj = Utils::OpenHandle(this); | 6354 i::Handle<i::JSArrayBuffer> obj = Utils::OpenHandle(this); |
6285 return static_cast<size_t>(obj->byte_length()->Number()); | 6355 return static_cast<size_t>(obj->byte_length()->Number()); |
6286 } | 6356 } |
6287 | 6357 |
6288 | 6358 |
6289 Local<ArrayBuffer> v8::ArrayBuffer::New(Isolate* isolate, size_t byte_length) { | 6359 Local<ArrayBuffer> v8::ArrayBuffer::New(Isolate* isolate, size_t byte_length) { |
6290 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 6360 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
6291 LOG_API(i_isolate, "v8::ArrayBuffer::New(size_t)"); | 6361 LOG_API(i_isolate, "v8::ArrayBuffer::New(size_t)"); |
6292 ENTER_V8(i_isolate); | 6362 ENTER_V8(i_isolate); |
6293 i::Handle<i::JSArrayBuffer> obj = | 6363 i::Handle<i::JSArrayBuffer> obj = |
6294 i_isolate->factory()->NewJSArrayBuffer(); | 6364 i_isolate->factory()->NewJSArrayBuffer(i::NOT_SHARED); |
6295 i::Runtime::SetupArrayBufferAllocatingData(i_isolate, obj, byte_length); | 6365 i::Runtime::SetupArrayBufferAllocatingData(i_isolate, obj, byte_length); |
6296 return Utils::ToLocal(obj); | 6366 return Utils::ToLocal(obj); |
6297 } | 6367 } |
6298 | 6368 |
6299 | 6369 |
6300 Local<ArrayBuffer> v8::ArrayBuffer::New(Isolate* isolate, void* data, | 6370 Local<ArrayBuffer> v8::ArrayBuffer::New(Isolate* isolate, void* data, |
6301 size_t byte_length, | 6371 size_t byte_length, |
6302 ArrayBufferCreationMode mode) { | 6372 ArrayBufferCreationMode mode) { |
6303 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 6373 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
6304 LOG_API(i_isolate, "v8::ArrayBuffer::New(void*, size_t)"); | 6374 LOG_API(i_isolate, "v8::ArrayBuffer::New(void*, size_t)"); |
6305 ENTER_V8(i_isolate); | 6375 ENTER_V8(i_isolate); |
6306 i::Handle<i::JSArrayBuffer> obj = | 6376 i::Handle<i::JSArrayBuffer> obj = |
6307 i_isolate->factory()->NewJSArrayBuffer(); | 6377 i_isolate->factory()->NewJSArrayBuffer(i::NOT_SHARED); |
6308 i::Runtime::SetupArrayBuffer(i_isolate, obj, | 6378 i::Runtime::SetupArrayBuffer(i_isolate, obj, |
6309 mode == ArrayBufferCreationMode::kExternalized, | 6379 mode == ArrayBufferCreationMode::kExternalized, |
6310 data, byte_length); | 6380 data, byte_length); |
6311 return Utils::ToLocal(obj); | 6381 return Utils::ToLocal(obj); |
6312 } | 6382 } |
6313 | 6383 |
6314 | 6384 |
6315 Local<ArrayBuffer> v8::ArrayBufferView::Buffer() { | 6385 Local<ArrayBuffer> v8::ArrayBufferView::Buffer() { |
6316 i::Handle<i::JSArrayBufferView> obj = Utils::OpenHandle(this); | 6386 i::Handle<i::JSArrayBufferView> obj = Utils::OpenHandle(this); |
6317 i::Handle<i::JSArrayBuffer> buffer; | 6387 i::Handle<i::JSArrayBuffer> buffer; |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6383 "v8::" #Type "Array::New(Handle<ArrayBuffer>, size_t, size_t)"); \ | 6453 "v8::" #Type "Array::New(Handle<ArrayBuffer>, size_t, size_t)"); \ |
6384 ENTER_V8(isolate); \ | 6454 ENTER_V8(isolate); \ |
6385 if (!Utils::ApiCheck(length <= static_cast<size_t>(i::Smi::kMaxValue), \ | 6455 if (!Utils::ApiCheck(length <= static_cast<size_t>(i::Smi::kMaxValue), \ |
6386 "v8::" #Type \ | 6456 "v8::" #Type \ |
6387 "Array::New(Handle<ArrayBuffer>, size_t, size_t)", \ | 6457 "Array::New(Handle<ArrayBuffer>, size_t, size_t)", \ |
6388 "length exceeds max allowed value")) { \ | 6458 "length exceeds max allowed value")) { \ |
6389 return Local<Type##Array>(); \ | 6459 return Local<Type##Array>(); \ |
6390 } \ | 6460 } \ |
6391 i::Handle<i::JSArrayBuffer> buffer = Utils::OpenHandle(*array_buffer); \ | 6461 i::Handle<i::JSArrayBuffer> buffer = Utils::OpenHandle(*array_buffer); \ |
6392 i::Handle<i::JSTypedArray> obj = isolate->factory()->NewJSTypedArray( \ | 6462 i::Handle<i::JSTypedArray> obj = isolate->factory()->NewJSTypedArray( \ |
6393 i::kExternal##Type##Array, buffer, byte_offset, length); \ | 6463 i::kExternal##Type##Array, buffer, byte_offset, length, \ |
| 6464 i::NOT_SHARED); \ |
6394 return Utils::ToLocal##Type##Array(obj); \ | 6465 return Utils::ToLocal##Type##Array(obj); \ |
6395 } | 6466 } |
6396 | 6467 |
6397 | 6468 |
6398 TYPED_ARRAYS(TYPED_ARRAY_NEW) | 6469 TYPED_ARRAYS(TYPED_ARRAY_NEW) |
6399 #undef TYPED_ARRAY_NEW | 6470 #undef TYPED_ARRAY_NEW |
6400 | 6471 |
6401 Local<DataView> DataView::New(Handle<ArrayBuffer> array_buffer, | 6472 Local<DataView> DataView::New(Handle<ArrayBuffer> array_buffer, |
6402 size_t byte_offset, size_t byte_length) { | 6473 size_t byte_offset, size_t byte_length) { |
6403 i::Handle<i::JSArrayBuffer> buffer = Utils::OpenHandle(*array_buffer); | 6474 i::Handle<i::JSArrayBuffer> buffer = Utils::OpenHandle(*array_buffer); |
6404 i::Isolate* isolate = buffer->GetIsolate(); | 6475 i::Isolate* isolate = buffer->GetIsolate(); |
6405 LOG_API(isolate, "v8::DataView::New(void*, size_t, size_t)"); | 6476 LOG_API(isolate, "v8::DataView::New(void*, size_t, size_t)"); |
6406 ENTER_V8(isolate); | 6477 ENTER_V8(isolate); |
6407 i::Handle<i::JSDataView> obj = | 6478 i::Handle<i::JSDataView> obj = |
6408 isolate->factory()->NewJSDataView(buffer, byte_offset, byte_length); | 6479 isolate->factory()->NewJSDataView(buffer, byte_offset, byte_length); |
6409 return Utils::ToLocal(obj); | 6480 return Utils::ToLocal(obj); |
6410 } | 6481 } |
6411 | 6482 |
6412 | 6483 |
| 6484 bool v8::SharedArrayBuffer::IsExternal() const { |
| 6485 return Utils::OpenHandle(this)->is_external(); |
| 6486 } |
| 6487 |
| 6488 |
| 6489 v8::SharedArrayBuffer::Contents v8::SharedArrayBuffer::Externalize() { |
| 6490 i::Handle<i::JSArrayBuffer> self = Utils::OpenHandle(this); |
| 6491 i::Isolate* isolate = self->GetIsolate(); |
| 6492 Utils::ApiCheck(!self->is_external(), "v8::SharedArrayBuffer::Externalize", |
| 6493 "SharedArrayBuffer already externalized"); |
| 6494 self->set_is_external(true); |
| 6495 isolate->heap()->UnregisterArrayBuffer(self->backing_store()); |
| 6496 return GetContents(); |
| 6497 } |
| 6498 |
| 6499 |
| 6500 v8::SharedArrayBuffer::Contents v8::SharedArrayBuffer::GetContents() { |
| 6501 i::Handle<i::JSArrayBuffer> self = Utils::OpenHandle(this); |
| 6502 size_t byte_length = static_cast<size_t>(self->byte_length()->Number()); |
| 6503 Contents contents; |
| 6504 contents.data_ = self->backing_store(); |
| 6505 contents.byte_length_ = byte_length; |
| 6506 return contents; |
| 6507 } |
| 6508 |
| 6509 |
| 6510 size_t v8::SharedArrayBuffer::ByteLength() const { |
| 6511 i::Handle<i::JSArrayBuffer> obj = Utils::OpenHandle(this); |
| 6512 return static_cast<size_t>(obj->byte_length()->Number()); |
| 6513 } |
| 6514 |
| 6515 |
| 6516 Local<SharedArrayBuffer> v8::SharedArrayBuffer::New(Isolate* isolate, |
| 6517 size_t byte_length) { |
| 6518 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 6519 LOG_API(i_isolate, "v8::SharedArrayBuffer::New(size_t)"); |
| 6520 ENTER_V8(i_isolate); |
| 6521 i::Handle<i::JSArrayBuffer> obj = |
| 6522 i_isolate->factory()->NewJSArrayBuffer(i::SHARED); |
| 6523 i::Runtime::SetupArrayBufferAllocatingData(i_isolate, obj, byte_length); |
| 6524 return Utils::ToLocalShared(obj); |
| 6525 } |
| 6526 |
| 6527 |
| 6528 Local<SharedArrayBuffer> v8::SharedArrayBuffer::New( |
| 6529 Isolate* isolate, void* data, size_t byte_length, |
| 6530 ArrayBufferCreationMode mode) { |
| 6531 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 6532 LOG_API(i_isolate, "v8::SharedArrayBuffer::New(void*, size_t)"); |
| 6533 ENTER_V8(i_isolate); |
| 6534 i::Handle<i::JSArrayBuffer> obj = |
| 6535 i_isolate->factory()->NewJSArrayBuffer(i::SHARED); |
| 6536 i::Runtime::SetupArrayBuffer(i_isolate, obj, |
| 6537 mode == ArrayBufferCreationMode::kExternalized, |
| 6538 data, byte_length); |
| 6539 return Utils::ToLocalShared(obj); |
| 6540 } |
| 6541 |
| 6542 |
| 6543 Local<SharedArrayBuffer> v8::SharedTypedArray::Buffer() { |
| 6544 i::Handle<i::JSTypedArray> obj = Utils::OpenHandle(this); |
| 6545 i::Handle<i::JSArrayBuffer> buffer = i::JSTypedArray::cast(*obj)->GetBuffer(); |
| 6546 return Utils::ToLocalShared(buffer); |
| 6547 } |
| 6548 |
| 6549 |
| 6550 size_t v8::SharedTypedArray::ByteOffset() { |
| 6551 i::Handle<i::JSTypedArray> obj = Utils::OpenHandle(this); |
| 6552 return static_cast<size_t>(obj->byte_offset()->Number()); |
| 6553 } |
| 6554 |
| 6555 |
| 6556 size_t v8::SharedTypedArray::ByteLength() { |
| 6557 i::Handle<i::JSTypedArray> obj = Utils::OpenHandle(this); |
| 6558 return static_cast<size_t>(obj->byte_length()->Number()); |
| 6559 } |
| 6560 |
| 6561 |
| 6562 size_t v8::SharedTypedArray::Length() { |
| 6563 i::Handle<i::JSTypedArray> obj = Utils::OpenHandle(this); |
| 6564 return static_cast<size_t>(obj->length()->Number()); |
| 6565 } |
| 6566 |
| 6567 |
| 6568 #define SHARED_TYPED_ARRAY_NEW(Type, type, TYPE, ctype, size) \ |
| 6569 Local<Shared##Type##Array> Shared##Type##Array::New( \ |
| 6570 Handle<SharedArrayBuffer> array_buffer, size_t byte_offset, \ |
| 6571 size_t length) { \ |
| 6572 i::Isolate* isolate = Utils::OpenHandle(*array_buffer)->GetIsolate(); \ |
| 6573 LOG_API(isolate, "v8::Shared" #Type \ |
| 6574 "Array::New(Handle<SharedArrayBuffer>, size_t, size_t)"); \ |
| 6575 ENTER_V8(isolate); \ |
| 6576 if (!Utils::ApiCheck( \ |
| 6577 length <= static_cast<size_t>(i::Smi::kMaxValue), \ |
| 6578 "v8::Shared" #Type \ |
| 6579 "Array::New(Handle<SharedArrayBuffer>, size_t, size_t)", \ |
| 6580 "length exceeds max allowed value")) { \ |
| 6581 return Local<Shared##Type##Array>(); \ |
| 6582 } \ |
| 6583 i::Handle<i::JSArrayBuffer> buffer = Utils::OpenHandle(*array_buffer); \ |
| 6584 i::Handle<i::JSTypedArray> obj = isolate->factory()->NewJSTypedArray( \ |
| 6585 i::kExternal##Type##Array, buffer, byte_offset, length, i::SHARED); \ |
| 6586 return Utils::ToLocalShared##Type##Array(obj); \ |
| 6587 } |
| 6588 |
| 6589 |
| 6590 TYPED_ARRAYS(SHARED_TYPED_ARRAY_NEW) |
| 6591 #undef SHARED_TYPED_ARRAY_NEW |
| 6592 |
| 6593 |
6413 Local<Symbol> v8::Symbol::New(Isolate* isolate, Local<String> name) { | 6594 Local<Symbol> v8::Symbol::New(Isolate* isolate, Local<String> name) { |
6414 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 6595 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
6415 LOG_API(i_isolate, "Symbol::New()"); | 6596 LOG_API(i_isolate, "Symbol::New()"); |
6416 ENTER_V8(i_isolate); | 6597 ENTER_V8(i_isolate); |
6417 i::Handle<i::Symbol> result = i_isolate->factory()->NewSymbol(); | 6598 i::Handle<i::Symbol> result = i_isolate->factory()->NewSymbol(); |
6418 if (!name.IsEmpty()) result->set_name(*Utils::OpenHandle(*name)); | 6599 if (!name.IsEmpty()) result->set_name(*Utils::OpenHandle(*name)); |
6419 return Utils::ToLocal(result); | 6600 return Utils::ToLocal(result); |
6420 } | 6601 } |
6421 | 6602 |
6422 | 6603 |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6749 | 6930 |
6750 | 6931 |
6751 Isolate* Isolate::New(const Isolate::CreateParams& params) { | 6932 Isolate* Isolate::New(const Isolate::CreateParams& params) { |
6752 i::Isolate* isolate = new i::Isolate(false); | 6933 i::Isolate* isolate = new i::Isolate(false); |
6753 Isolate* v8_isolate = reinterpret_cast<Isolate*>(isolate); | 6934 Isolate* v8_isolate = reinterpret_cast<Isolate*>(isolate); |
6754 if (params.array_buffer_allocator != NULL) { | 6935 if (params.array_buffer_allocator != NULL) { |
6755 isolate->set_array_buffer_allocator(params.array_buffer_allocator); | 6936 isolate->set_array_buffer_allocator(params.array_buffer_allocator); |
6756 } else { | 6937 } else { |
6757 isolate->set_array_buffer_allocator(i::V8::ArrayBufferAllocator()); | 6938 isolate->set_array_buffer_allocator(i::V8::ArrayBufferAllocator()); |
6758 } | 6939 } |
| 6940 if (params.shared_array_buffer_allocator) { |
| 6941 isolate->set_shared_array_buffer_allocator( |
| 6942 params.shared_array_buffer_allocator); |
| 6943 } else { |
| 6944 // Default to using the same allocator as the array_buffer_allocator. |
| 6945 isolate->set_shared_array_buffer_allocator( |
| 6946 isolate->array_buffer_allocator()); |
| 6947 } |
6759 if (params.snapshot_blob != NULL) { | 6948 if (params.snapshot_blob != NULL) { |
6760 isolate->set_snapshot_blob(params.snapshot_blob); | 6949 isolate->set_snapshot_blob(params.snapshot_blob); |
6761 } else { | 6950 } else { |
6762 isolate->set_snapshot_blob(i::Snapshot::DefaultSnapshotBlob()); | 6951 isolate->set_snapshot_blob(i::Snapshot::DefaultSnapshotBlob()); |
6763 } | 6952 } |
6764 if (params.entry_hook) { | 6953 if (params.entry_hook) { |
6765 isolate->set_function_entry_hook(params.entry_hook); | 6954 isolate->set_function_entry_hook(params.entry_hook); |
6766 } | 6955 } |
6767 if (params.code_event_handler) { | 6956 if (params.code_event_handler) { |
6768 isolate->InitializeLoggingAndCounters(); | 6957 isolate->InitializeLoggingAndCounters(); |
(...skipping 1266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8035 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); | 8224 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); |
8036 Address callback_address = | 8225 Address callback_address = |
8037 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 8226 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
8038 VMState<EXTERNAL> state(isolate); | 8227 VMState<EXTERNAL> state(isolate); |
8039 ExternalCallbackScope call_scope(isolate, callback_address); | 8228 ExternalCallbackScope call_scope(isolate, callback_address); |
8040 callback(info); | 8229 callback(info); |
8041 } | 8230 } |
8042 | 8231 |
8043 | 8232 |
8044 } } // namespace v8::internal | 8233 } } // namespace v8::internal |
OLD | NEW |