| 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 |