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

Side by Side Diff: src/api.cc

Issue 1136553006: Implement SharedArrayBuffer (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/arraybuffer.js » ('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 2661 matching lines...) Expand 10 before | Expand all | Expand 10 after
2672 return Utils::OpenHandle(this)->IsSymbol(); 2672 return Utils::OpenHandle(this)->IsSymbol();
2673 } 2673 }
2674 2674
2675 2675
2676 bool Value::IsArray() const { 2676 bool Value::IsArray() const {
2677 return Utils::OpenHandle(this)->IsJSArray(); 2677 return Utils::OpenHandle(this)->IsJSArray();
2678 } 2678 }
2679 2679
2680 2680
2681 bool Value::IsArrayBuffer() const { 2681 bool Value::IsArrayBuffer() const {
2682 return Utils::OpenHandle(this)->IsJSArrayBuffer(); 2682 i::Handle<i::Object> obj = Utils::OpenHandle(this);
2683 return obj->IsJSArrayBuffer() && !i::JSArrayBuffer::cast(*obj)->is_shared();
2683 } 2684 }
2684 2685
2685 2686
2686 bool Value::IsArrayBufferView() const { 2687 bool Value::IsArrayBufferView() const {
2687 return Utils::OpenHandle(this)->IsJSArrayBufferView(); 2688 return Utils::OpenHandle(this)->IsJSArrayBufferView();
2688 } 2689 }
2689 2690
2690 2691
2691 bool Value::IsTypedArray() const { 2692 bool Value::IsTypedArray() const {
2692 return Utils::OpenHandle(this)->IsJSTypedArray(); 2693 return Utils::OpenHandle(this)->IsJSTypedArray();
2693 } 2694 }
2694 2695
2695 2696
2696 #define VALUE_IS_TYPED_ARRAY(Type, typeName, TYPE, ctype, size) \ 2697 #define VALUE_IS_TYPED_ARRAY(Type, typeName, TYPE, ctype, size) \
2697 bool Value::Is##Type##Array() const { \ 2698 bool Value::Is##Type##Array() const { \
2698 i::Handle<i::Object> obj = Utils::OpenHandle(this); \ 2699 i::Handle<i::Object> obj = Utils::OpenHandle(this); \
2699 return obj->IsJSTypedArray() && \ 2700 return obj->IsJSTypedArray() && \
2700 i::JSTypedArray::cast(*obj)->type() == i::kExternal##Type##Array; \ 2701 i::JSTypedArray::cast(*obj)->type() == i::kExternal##Type##Array; \
2701 } 2702 }
2702 2703
2704
2703 TYPED_ARRAYS(VALUE_IS_TYPED_ARRAY) 2705 TYPED_ARRAYS(VALUE_IS_TYPED_ARRAY)
2704 2706
2705 #undef VALUE_IS_TYPED_ARRAY 2707 #undef VALUE_IS_TYPED_ARRAY
2706 2708
2707 2709
2708 bool Value::IsDataView() const { 2710 bool Value::IsDataView() const {
2709 return Utils::OpenHandle(this)->IsJSDataView(); 2711 return Utils::OpenHandle(this)->IsJSDataView();
2710 } 2712 }
2711 2713
2712 2714
2715 bool Value::IsSharedArrayBuffer() const {
2716 i::Handle<i::Object> obj = Utils::OpenHandle(this);
2717 return obj->IsJSArrayBuffer() && i::JSArrayBuffer::cast(*obj)->is_shared();
2718 }
2719
2720
2713 bool Value::IsObject() const { 2721 bool Value::IsObject() const {
2714 return Utils::OpenHandle(this)->IsJSObject(); 2722 return Utils::OpenHandle(this)->IsJSObject();
2715 } 2723 }
2716 2724
2717 2725
2718 bool Value::IsNumber() const { 2726 bool Value::IsNumber() const {
2719 return Utils::OpenHandle(this)->IsNumber(); 2727 return Utils::OpenHandle(this)->IsNumber();
2720 } 2728 }
2721 2729
2722 2730
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after
3079 3087
3080 void v8::Promise::Resolver::CheckCast(Value* that) { 3088 void v8::Promise::Resolver::CheckCast(Value* that) {
3081 Utils::ApiCheck(that->IsPromise(), 3089 Utils::ApiCheck(that->IsPromise(),
3082 "v8::Promise::Resolver::Cast()", 3090 "v8::Promise::Resolver::Cast()",
3083 "Could not convert to promise resolver"); 3091 "Could not convert to promise resolver");
3084 } 3092 }
3085 3093
3086 3094
3087 void v8::ArrayBuffer::CheckCast(Value* that) { 3095 void v8::ArrayBuffer::CheckCast(Value* that) {
3088 i::Handle<i::Object> obj = Utils::OpenHandle(that); 3096 i::Handle<i::Object> obj = Utils::OpenHandle(that);
3089 Utils::ApiCheck(obj->IsJSArrayBuffer(), 3097 Utils::ApiCheck(
3090 "v8::ArrayBuffer::Cast()", 3098 obj->IsJSArrayBuffer() && !i::JSArrayBuffer::cast(*obj)->is_shared(),
3091 "Could not convert to ArrayBuffer"); 3099 "v8::ArrayBuffer::Cast()", "Could not convert to ArrayBuffer");
3092 } 3100 }
3093 3101
3094 3102
3095 void v8::ArrayBufferView::CheckCast(Value* that) { 3103 void v8::ArrayBufferView::CheckCast(Value* that) {
3096 i::Handle<i::Object> obj = Utils::OpenHandle(that); 3104 i::Handle<i::Object> obj = Utils::OpenHandle(that);
3097 Utils::ApiCheck(obj->IsJSArrayBufferView(), 3105 Utils::ApiCheck(obj->IsJSArrayBufferView(),
3098 "v8::ArrayBufferView::Cast()", 3106 "v8::ArrayBufferView::Cast()",
3099 "Could not convert to ArrayBufferView"); 3107 "Could not convert to ArrayBufferView");
3100 } 3108 }
3101 3109
(...skipping 22 matching lines...) Expand all
3124 3132
3125 3133
3126 void v8::DataView::CheckCast(Value* that) { 3134 void v8::DataView::CheckCast(Value* that) {
3127 i::Handle<i::Object> obj = Utils::OpenHandle(that); 3135 i::Handle<i::Object> obj = Utils::OpenHandle(that);
3128 Utils::ApiCheck(obj->IsJSDataView(), 3136 Utils::ApiCheck(obj->IsJSDataView(),
3129 "v8::DataView::Cast()", 3137 "v8::DataView::Cast()",
3130 "Could not convert to DataView"); 3138 "Could not convert to DataView");
3131 } 3139 }
3132 3140
3133 3141
3142 void v8::SharedArrayBuffer::CheckCast(Value* that) {
3143 i::Handle<i::Object> obj = Utils::OpenHandle(that);
3144 Utils::ApiCheck(
3145 obj->IsJSArrayBuffer() && i::JSArrayBuffer::cast(*obj)->is_shared(),
3146 "v8::SharedArrayBuffer::Cast()",
3147 "Could not convert to SharedArrayBuffer");
3148 }
3149
3150
3134 void v8::Date::CheckCast(v8::Value* that) { 3151 void v8::Date::CheckCast(v8::Value* that) {
3135 i::Handle<i::Object> obj = Utils::OpenHandle(that); 3152 i::Handle<i::Object> obj = Utils::OpenHandle(that);
3136 i::Isolate* isolate = NULL; 3153 i::Isolate* isolate = NULL;
3137 if (obj->IsHeapObject()) isolate = i::HeapObject::cast(*obj)->GetIsolate(); 3154 if (obj->IsHeapObject()) isolate = i::HeapObject::cast(*obj)->GetIsolate();
3138 Utils::ApiCheck(isolate != NULL && 3155 Utils::ApiCheck(isolate != NULL &&
3139 obj->HasSpecificClassOf(isolate->heap()->Date_string()), 3156 obj->HasSpecificClassOf(isolate->heap()->Date_string()),
3140 "v8::Date::Cast()", 3157 "v8::Date::Cast()",
3141 "Could not convert to date"); 3158 "Could not convert to date");
3142 } 3159 }
3143 3160
(...skipping 3126 matching lines...) Expand 10 before | Expand all | Expand 10 after
6270 i::Handle<i::JSArrayBuffer> obj = Utils::OpenHandle(this); 6287 i::Handle<i::JSArrayBuffer> obj = Utils::OpenHandle(this);
6271 return static_cast<size_t>(obj->byte_length()->Number()); 6288 return static_cast<size_t>(obj->byte_length()->Number());
6272 } 6289 }
6273 6290
6274 6291
6275 Local<ArrayBuffer> v8::ArrayBuffer::New(Isolate* isolate, size_t byte_length) { 6292 Local<ArrayBuffer> v8::ArrayBuffer::New(Isolate* isolate, size_t byte_length) {
6276 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 6293 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
6277 LOG_API(i_isolate, "v8::ArrayBuffer::New(size_t)"); 6294 LOG_API(i_isolate, "v8::ArrayBuffer::New(size_t)");
6278 ENTER_V8(i_isolate); 6295 ENTER_V8(i_isolate);
6279 i::Handle<i::JSArrayBuffer> obj = 6296 i::Handle<i::JSArrayBuffer> obj =
6280 i_isolate->factory()->NewJSArrayBuffer(); 6297 i_isolate->factory()->NewJSArrayBuffer(i::SharedFlag::kNotShared);
6281 i::Runtime::SetupArrayBufferAllocatingData(i_isolate, obj, byte_length); 6298 i::Runtime::SetupArrayBufferAllocatingData(i_isolate, obj, byte_length);
6282 return Utils::ToLocal(obj); 6299 return Utils::ToLocal(obj);
6283 } 6300 }
6284 6301
6285 6302
6286 Local<ArrayBuffer> v8::ArrayBuffer::New(Isolate* isolate, void* data, 6303 Local<ArrayBuffer> v8::ArrayBuffer::New(Isolate* isolate, void* data,
6287 size_t byte_length, 6304 size_t byte_length,
6288 ArrayBufferCreationMode mode) { 6305 ArrayBufferCreationMode mode) {
6289 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 6306 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
6290 LOG_API(i_isolate, "v8::ArrayBuffer::New(void*, size_t)"); 6307 LOG_API(i_isolate, "v8::ArrayBuffer::New(void*, size_t)");
6291 ENTER_V8(i_isolate); 6308 ENTER_V8(i_isolate);
6292 i::Handle<i::JSArrayBuffer> obj = 6309 i::Handle<i::JSArrayBuffer> obj =
6293 i_isolate->factory()->NewJSArrayBuffer(); 6310 i_isolate->factory()->NewJSArrayBuffer(i::SharedFlag::kNotShared);
6294 i::Runtime::SetupArrayBuffer(i_isolate, obj, 6311 i::Runtime::SetupArrayBuffer(i_isolate, obj,
6295 mode == ArrayBufferCreationMode::kExternalized, 6312 mode == ArrayBufferCreationMode::kExternalized,
6296 data, byte_length); 6313 data, byte_length);
6297 return Utils::ToLocal(obj); 6314 return Utils::ToLocal(obj);
6298 } 6315 }
6299 6316
6300 6317
6301 Local<ArrayBuffer> v8::ArrayBufferView::Buffer() { 6318 Local<ArrayBuffer> v8::ArrayBufferView::Buffer() {
6302 i::Handle<i::JSArrayBufferView> obj = Utils::OpenHandle(this); 6319 i::Handle<i::JSArrayBufferView> obj = Utils::OpenHandle(this);
6303 i::Handle<i::JSArrayBuffer> buffer; 6320 i::Handle<i::JSArrayBuffer> buffer;
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
6389 i::Handle<i::JSArrayBuffer> buffer = Utils::OpenHandle(*array_buffer); 6406 i::Handle<i::JSArrayBuffer> buffer = Utils::OpenHandle(*array_buffer);
6390 i::Isolate* isolate = buffer->GetIsolate(); 6407 i::Isolate* isolate = buffer->GetIsolate();
6391 LOG_API(isolate, "v8::DataView::New(void*, size_t, size_t)"); 6408 LOG_API(isolate, "v8::DataView::New(void*, size_t, size_t)");
6392 ENTER_V8(isolate); 6409 ENTER_V8(isolate);
6393 i::Handle<i::JSDataView> obj = 6410 i::Handle<i::JSDataView> obj =
6394 isolate->factory()->NewJSDataView(buffer, byte_offset, byte_length); 6411 isolate->factory()->NewJSDataView(buffer, byte_offset, byte_length);
6395 return Utils::ToLocal(obj); 6412 return Utils::ToLocal(obj);
6396 } 6413 }
6397 6414
6398 6415
6416 bool v8::SharedArrayBuffer::IsExternal() const {
6417 return Utils::OpenHandle(this)->is_external();
6418 }
6419
6420
6421 v8::SharedArrayBuffer::Contents v8::SharedArrayBuffer::Externalize() {
6422 i::Handle<i::JSArrayBuffer> self = Utils::OpenHandle(this);
6423 i::Isolate* isolate = self->GetIsolate();
6424 Utils::ApiCheck(!self->is_external(), "v8::SharedArrayBuffer::Externalize",
6425 "SharedArrayBuffer already externalized");
6426 self->set_is_external(true);
6427 isolate->heap()->UnregisterArrayBuffer(self->backing_store());
6428 return GetContents();
6429 }
6430
6431
6432 v8::SharedArrayBuffer::Contents v8::SharedArrayBuffer::GetContents() {
6433 i::Handle<i::JSArrayBuffer> self = Utils::OpenHandle(this);
6434 size_t byte_length = static_cast<size_t>(self->byte_length()->Number());
6435 Contents contents;
6436 contents.data_ = self->backing_store();
6437 contents.byte_length_ = byte_length;
6438 return contents;
6439 }
6440
6441
6442 size_t v8::SharedArrayBuffer::ByteLength() const {
6443 i::Handle<i::JSArrayBuffer> obj = Utils::OpenHandle(this);
6444 return static_cast<size_t>(obj->byte_length()->Number());
6445 }
6446
6447
6448 Local<SharedArrayBuffer> v8::SharedArrayBuffer::New(Isolate* isolate,
6449 size_t byte_length) {
6450 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
6451 LOG_API(i_isolate, "v8::SharedArrayBuffer::New(size_t)");
6452 ENTER_V8(i_isolate);
6453 i::Handle<i::JSArrayBuffer> obj =
6454 i_isolate->factory()->NewJSArrayBuffer(i::SharedFlag::kShared);
6455 i::Runtime::SetupArrayBufferAllocatingData(i_isolate, obj, byte_length, true,
6456 i::SharedFlag::kShared);
6457 return Utils::ToLocalShared(obj);
6458 }
6459
6460
6461 Local<SharedArrayBuffer> v8::SharedArrayBuffer::New(
6462 Isolate* isolate, void* data, size_t byte_length,
6463 ArrayBufferCreationMode mode) {
6464 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
6465 LOG_API(i_isolate, "v8::SharedArrayBuffer::New(void*, size_t)");
6466 ENTER_V8(i_isolate);
6467 i::Handle<i::JSArrayBuffer> obj =
6468 i_isolate->factory()->NewJSArrayBuffer(i::SharedFlag::kShared);
6469 i::Runtime::SetupArrayBuffer(i_isolate, obj,
6470 mode == ArrayBufferCreationMode::kExternalized,
6471 data, byte_length, i::SharedFlag::kShared);
6472 return Utils::ToLocalShared(obj);
6473 }
6474
6475
6399 Local<Symbol> v8::Symbol::New(Isolate* isolate, Local<String> name) { 6476 Local<Symbol> v8::Symbol::New(Isolate* isolate, Local<String> name) {
6400 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 6477 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
6401 LOG_API(i_isolate, "Symbol::New()"); 6478 LOG_API(i_isolate, "Symbol::New()");
6402 ENTER_V8(i_isolate); 6479 ENTER_V8(i_isolate);
6403 i::Handle<i::Symbol> result = i_isolate->factory()->NewSymbol(); 6480 i::Handle<i::Symbol> result = i_isolate->factory()->NewSymbol();
6404 if (!name.IsEmpty()) result->set_name(*Utils::OpenHandle(*name)); 6481 if (!name.IsEmpty()) result->set_name(*Utils::OpenHandle(*name));
6405 return Utils::ToLocal(result); 6482 return Utils::ToLocal(result);
6406 } 6483 }
6407 6484
6408 6485
(...skipping 1612 matching lines...) Expand 10 before | Expand all | Expand 10 after
8021 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); 8098 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate());
8022 Address callback_address = 8099 Address callback_address =
8023 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 8100 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
8024 VMState<EXTERNAL> state(isolate); 8101 VMState<EXTERNAL> state(isolate);
8025 ExternalCallbackScope call_scope(isolate, callback_address); 8102 ExternalCallbackScope call_scope(isolate, callback_address);
8026 callback(info); 8103 callback(info);
8027 } 8104 }
8028 8105
8029 8106
8030 } } // namespace v8::internal 8107 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/api.h ('k') | src/arraybuffer.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698