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 2661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |