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

Side by Side Diff: src/api.cc

Issue 1069883002: WIP SharedArrayBuffer implementation (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: merge master Created 5 years, 7 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/api.h ('k') | src/bootstrapper.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 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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/api.h ('k') | src/bootstrapper.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698