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 2655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2666 bool Value::IsArrayBufferView() const { | 2666 bool Value::IsArrayBufferView() const { |
2667 return Utils::OpenHandle(this)->IsJSArrayBufferView(); | 2667 return Utils::OpenHandle(this)->IsJSArrayBufferView(); |
2668 } | 2668 } |
2669 | 2669 |
2670 | 2670 |
2671 bool Value::IsTypedArray() const { | 2671 bool Value::IsTypedArray() const { |
2672 return Utils::OpenHandle(this)->IsJSTypedArray(); | 2672 return Utils::OpenHandle(this)->IsJSTypedArray(); |
2673 } | 2673 } |
2674 | 2674 |
2675 | 2675 |
2676 #define VALUE_IS_TYPED_ARRAY(Type, typeName, TYPE, ctype, size) \ | 2676 #define VALUE_IS_TYPED_ARRAY(Type, typeName, TYPE, ctype, size) \ |
2677 bool Value::Is##Type##Array() const { \ | 2677 bool Value::Is##Type##Array() const { \ |
2678 i::Handle<i::Object> obj = Utils::OpenHandle(this); \ | 2678 i::Handle<i::Object> obj = Utils::OpenHandle(this); \ |
2679 return obj->IsJSTypedArray() && \ | 2679 return obj->IsJSTypedArray() && \ |
2680 i::JSTypedArray::cast(*obj)->type() == kExternal##Type##Array; \ | 2680 i::JSTypedArray::cast(*obj)->type() == i::kExternal##Type##Array; \ |
2681 } | 2681 } |
2682 | 2682 |
2683 TYPED_ARRAYS(VALUE_IS_TYPED_ARRAY) | 2683 TYPED_ARRAYS(VALUE_IS_TYPED_ARRAY) |
2684 | 2684 |
2685 #undef VALUE_IS_TYPED_ARRAY | 2685 #undef VALUE_IS_TYPED_ARRAY |
2686 | 2686 |
2687 | 2687 |
2688 bool Value::IsDataView() const { | 2688 bool Value::IsDataView() const { |
2689 return Utils::OpenHandle(this)->IsJSDataView(); | 2689 return Utils::OpenHandle(this)->IsJSDataView(); |
2690 } | 2690 } |
(...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3084 i::Handle<i::Object> obj = Utils::OpenHandle(that); | 3084 i::Handle<i::Object> obj = Utils::OpenHandle(that); |
3085 Utils::ApiCheck(obj->IsJSTypedArray(), | 3085 Utils::ApiCheck(obj->IsJSTypedArray(), |
3086 "v8::TypedArray::Cast()", | 3086 "v8::TypedArray::Cast()", |
3087 "Could not convert to TypedArray"); | 3087 "Could not convert to TypedArray"); |
3088 } | 3088 } |
3089 | 3089 |
3090 | 3090 |
3091 #define CHECK_TYPED_ARRAY_CAST(Type, typeName, TYPE, ctype, size) \ | 3091 #define CHECK_TYPED_ARRAY_CAST(Type, typeName, TYPE, ctype, size) \ |
3092 void v8::Type##Array::CheckCast(Value* that) { \ | 3092 void v8::Type##Array::CheckCast(Value* that) { \ |
3093 i::Handle<i::Object> obj = Utils::OpenHandle(that); \ | 3093 i::Handle<i::Object> obj = Utils::OpenHandle(that); \ |
3094 Utils::ApiCheck(obj->IsJSTypedArray() && \ | 3094 Utils::ApiCheck( \ |
3095 i::JSTypedArray::cast(*obj)->type() == \ | 3095 obj->IsJSTypedArray() && \ |
3096 kExternal##Type##Array, \ | 3096 i::JSTypedArray::cast(*obj)->type() == i::kExternal##Type##Array, \ |
3097 "v8::" #Type "Array::Cast()", \ | 3097 "v8::" #Type "Array::Cast()", "Could not convert to " #Type "Array"); \ |
3098 "Could not convert to " #Type "Array"); \ | |
3099 } | 3098 } |
3100 | 3099 |
3101 | 3100 |
3102 TYPED_ARRAYS(CHECK_TYPED_ARRAY_CAST) | 3101 TYPED_ARRAYS(CHECK_TYPED_ARRAY_CAST) |
3103 | 3102 |
3104 #undef CHECK_TYPED_ARRAY_CAST | 3103 #undef CHECK_TYPED_ARRAY_CAST |
3105 | 3104 |
3106 | 3105 |
3107 void v8::DataView::CheckCast(Value* that) { | 3106 void v8::DataView::CheckCast(Value* that) { |
3108 i::Handle<i::Object> obj = Utils::OpenHandle(that); | 3107 i::Handle<i::Object> obj = Utils::OpenHandle(that); |
(...skipping 1082 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4191 i::HandleScope scope(isolate); | 4190 i::HandleScope scope(isolate); |
4192 i::Handle<i::JSObject> self = Utils::OpenHandle(this); | 4191 i::Handle<i::JSObject> self = Utils::OpenHandle(this); |
4193 i::Handle<i::String> key_obj = Utils::OpenHandle(*key); | 4192 i::Handle<i::String> key_obj = Utils::OpenHandle(*key); |
4194 i::Handle<i::String> key_string = | 4193 i::Handle<i::String> key_string = |
4195 isolate->factory()->InternalizeString(key_obj); | 4194 isolate->factory()->InternalizeString(key_obj); |
4196 i::JSObject::DeleteHiddenProperty(self, key_string); | 4195 i::JSObject::DeleteHiddenProperty(self, key_string); |
4197 return true; | 4196 return true; |
4198 } | 4197 } |
4199 | 4198 |
4200 | 4199 |
4201 namespace { | |
4202 | |
4203 static i::ElementsKind GetElementsKindFromExternalArrayType( | |
4204 ExternalArrayType array_type) { | |
4205 switch (array_type) { | |
4206 #define ARRAY_TYPE_TO_ELEMENTS_KIND(Type, type, TYPE, ctype, size) \ | |
4207 case kExternal##Type##Array: \ | |
4208 return i::EXTERNAL_##TYPE##_ELEMENTS; | |
4209 | |
4210 TYPED_ARRAYS(ARRAY_TYPE_TO_ELEMENTS_KIND) | |
4211 #undef ARRAY_TYPE_TO_ELEMENTS_KIND | |
4212 } | |
4213 UNREACHABLE(); | |
4214 return i::DICTIONARY_ELEMENTS; | |
4215 } | |
4216 | |
4217 | |
4218 void PrepareExternalArrayElements(i::Handle<i::JSObject> object, | |
4219 void* data, | |
4220 ExternalArrayType array_type, | |
4221 int length) { | |
4222 i::Isolate* isolate = object->GetIsolate(); | |
4223 i::Handle<i::ExternalArray> array = | |
4224 isolate->factory()->NewExternalArray(length, array_type, data); | |
4225 | |
4226 i::Handle<i::Map> external_array_map = | |
4227 i::JSObject::GetElementsTransitionMap( | |
4228 object, | |
4229 GetElementsKindFromExternalArrayType(array_type)); | |
4230 | |
4231 i::JSObject::SetMapAndElements(object, external_array_map, array); | |
4232 } | |
4233 | |
4234 } // namespace | |
4235 | |
4236 | |
4237 void v8::Object::SetIndexedPropertiesToPixelData(uint8_t* data, int length) { | |
4238 auto self = Utils::OpenHandle(this); | |
4239 auto isolate = self->GetIsolate(); | |
4240 ENTER_V8(isolate); | |
4241 i::HandleScope scope(isolate); | |
4242 if (!Utils::ApiCheck(length >= 0 && | |
4243 length <= i::ExternalUint8ClampedArray::kMaxLength, | |
4244 "v8::Object::SetIndexedPropertiesToPixelData()", | |
4245 "length exceeds max acceptable value")) { | |
4246 return; | |
4247 } | |
4248 if (!Utils::ApiCheck(!self->IsJSArray(), | |
4249 "v8::Object::SetIndexedPropertiesToPixelData()", | |
4250 "JSArray is not supported")) { | |
4251 return; | |
4252 } | |
4253 PrepareExternalArrayElements(self, data, kExternalUint8ClampedArray, length); | |
4254 } | |
4255 | |
4256 | |
4257 bool v8::Object::HasIndexedPropertiesInPixelData() { | |
4258 auto self = Utils::OpenHandle(this); | |
4259 return self->HasExternalUint8ClampedElements(); | |
4260 } | |
4261 | |
4262 | |
4263 uint8_t* v8::Object::GetIndexedPropertiesPixelData() { | |
4264 auto self = Utils::OpenHandle(this); | |
4265 if (self->HasExternalUint8ClampedElements()) { | |
4266 return i::ExternalUint8ClampedArray::cast(self->elements())-> | |
4267 external_uint8_clamped_pointer(); | |
4268 } | |
4269 return nullptr; | |
4270 } | |
4271 | |
4272 | |
4273 int v8::Object::GetIndexedPropertiesPixelDataLength() { | |
4274 auto self = Utils::OpenHandle(this); | |
4275 if (self->HasExternalUint8ClampedElements()) { | |
4276 return i::ExternalUint8ClampedArray::cast(self->elements())->length(); | |
4277 } | |
4278 return -1; | |
4279 } | |
4280 | |
4281 | |
4282 void v8::Object::SetIndexedPropertiesToExternalArrayData( | |
4283 void* data, | |
4284 ExternalArrayType array_type, | |
4285 int length) { | |
4286 auto self = Utils::OpenHandle(this); | |
4287 auto isolate = self->GetIsolate(); | |
4288 ENTER_V8(isolate); | |
4289 i::HandleScope scope(isolate); | |
4290 if (!Utils::ApiCheck(length >= 0 && length <= i::ExternalArray::kMaxLength, | |
4291 "v8::Object::SetIndexedPropertiesToExternalArrayData()", | |
4292 "length exceeds max acceptable value")) { | |
4293 return; | |
4294 } | |
4295 if (!Utils::ApiCheck(!self->IsJSArray(), | |
4296 "v8::Object::SetIndexedPropertiesToExternalArrayData()", | |
4297 "JSArray is not supported")) { | |
4298 return; | |
4299 } | |
4300 PrepareExternalArrayElements(self, data, array_type, length); | |
4301 } | |
4302 | |
4303 | |
4304 bool v8::Object::HasIndexedPropertiesInExternalArrayData() { | |
4305 auto self = Utils::OpenHandle(this); | |
4306 return self->HasExternalArrayElements(); | |
4307 } | |
4308 | |
4309 | |
4310 void* v8::Object::GetIndexedPropertiesExternalArrayData() { | |
4311 auto self = Utils::OpenHandle(this); | |
4312 if (self->HasExternalArrayElements()) { | |
4313 return i::ExternalArray::cast(self->elements())->external_pointer(); | |
4314 } | |
4315 return nullptr; | |
4316 } | |
4317 | |
4318 | |
4319 ExternalArrayType v8::Object::GetIndexedPropertiesExternalArrayDataType() { | |
4320 auto self = Utils::OpenHandle(this); | |
4321 switch (self->elements()->map()->instance_type()) { | |
4322 #define INSTANCE_TYPE_TO_ARRAY_TYPE(Type, type, TYPE, ctype, size) \ | |
4323 case i::EXTERNAL_##TYPE##_ARRAY_TYPE: \ | |
4324 return kExternal##Type##Array; | |
4325 TYPED_ARRAYS(INSTANCE_TYPE_TO_ARRAY_TYPE) | |
4326 #undef INSTANCE_TYPE_TO_ARRAY_TYPE | |
4327 default: | |
4328 return static_cast<ExternalArrayType>(-1); | |
4329 } | |
4330 } | |
4331 | |
4332 | |
4333 int v8::Object::GetIndexedPropertiesExternalArrayDataLength() { | |
4334 auto self = Utils::OpenHandle(this); | |
4335 if (self->HasExternalArrayElements()) { | |
4336 return i::ExternalArray::cast(self->elements())->length(); | |
4337 } | |
4338 return -1; | |
4339 } | |
4340 | |
4341 | |
4342 bool v8::Object::IsCallable() { | 4200 bool v8::Object::IsCallable() { |
4343 auto self = Utils::OpenHandle(this); | 4201 auto self = Utils::OpenHandle(this); |
4344 return self->IsCallable(); | 4202 return self->IsCallable(); |
4345 } | 4203 } |
4346 | 4204 |
4347 | 4205 |
4348 MaybeLocal<Value> Object::CallAsFunction(Local<Context> context, | 4206 MaybeLocal<Value> Object::CallAsFunction(Local<Context> context, |
4349 Handle<Value> recv, int argc, | 4207 Handle<Value> recv, int argc, |
4350 Handle<Value> argv[]) { | 4208 Handle<Value> argv[]) { |
4351 PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, "v8::Object::CallAsFunction()", | 4209 PREPARE_FOR_EXECUTION_WITH_CALLBACK(context, "v8::Object::CallAsFunction()", |
(...skipping 2155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6507 "v8::" #Type "Array::New(Handle<ArrayBuffer>, size_t, size_t)"); \ | 6365 "v8::" #Type "Array::New(Handle<ArrayBuffer>, size_t, size_t)"); \ |
6508 ENTER_V8(isolate); \ | 6366 ENTER_V8(isolate); \ |
6509 if (!Utils::ApiCheck(length <= static_cast<size_t>(i::Smi::kMaxValue), \ | 6367 if (!Utils::ApiCheck(length <= static_cast<size_t>(i::Smi::kMaxValue), \ |
6510 "v8::" #Type \ | 6368 "v8::" #Type \ |
6511 "Array::New(Handle<ArrayBuffer>, size_t, size_t)", \ | 6369 "Array::New(Handle<ArrayBuffer>, size_t, size_t)", \ |
6512 "length exceeds max allowed value")) { \ | 6370 "length exceeds max allowed value")) { \ |
6513 return Local<Type##Array>(); \ | 6371 return Local<Type##Array>(); \ |
6514 } \ | 6372 } \ |
6515 i::Handle<i::JSArrayBuffer> buffer = Utils::OpenHandle(*array_buffer); \ | 6373 i::Handle<i::JSArrayBuffer> buffer = Utils::OpenHandle(*array_buffer); \ |
6516 i::Handle<i::JSTypedArray> obj = isolate->factory()->NewJSTypedArray( \ | 6374 i::Handle<i::JSTypedArray> obj = isolate->factory()->NewJSTypedArray( \ |
6517 v8::kExternal##Type##Array, buffer, byte_offset, length); \ | 6375 i::kExternal##Type##Array, buffer, byte_offset, length); \ |
6518 return Utils::ToLocal##Type##Array(obj); \ | 6376 return Utils::ToLocal##Type##Array(obj); \ |
6519 } | 6377 } |
6520 | 6378 |
6521 | 6379 |
6522 TYPED_ARRAYS(TYPED_ARRAY_NEW) | 6380 TYPED_ARRAYS(TYPED_ARRAY_NEW) |
6523 #undef TYPED_ARRAY_NEW | 6381 #undef TYPED_ARRAY_NEW |
6524 | 6382 |
6525 Local<DataView> DataView::New(Handle<ArrayBuffer> array_buffer, | 6383 Local<DataView> DataView::New(Handle<ArrayBuffer> array_buffer, |
6526 size_t byte_offset, size_t byte_length) { | 6384 size_t byte_offset, size_t byte_length) { |
6527 i::Handle<i::JSArrayBuffer> buffer = Utils::OpenHandle(*array_buffer); | 6385 i::Handle<i::JSArrayBuffer> buffer = Utils::OpenHandle(*array_buffer); |
(...skipping 1582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8110 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); | 7968 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); |
8111 Address callback_address = | 7969 Address callback_address = |
8112 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 7970 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
8113 VMState<EXTERNAL> state(isolate); | 7971 VMState<EXTERNAL> state(isolate); |
8114 ExternalCallbackScope call_scope(isolate, callback_address); | 7972 ExternalCallbackScope call_scope(isolate, callback_address); |
8115 callback(info); | 7973 callback(info); |
8116 } | 7974 } |
8117 | 7975 |
8118 | 7976 |
8119 } } // namespace v8::internal | 7977 } } // namespace v8::internal |
OLD | NEW |