| 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 1057 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1068 | 1068 |
| 1069 static Local<ObjectTemplate> ObjectTemplateNew( | 1069 static Local<ObjectTemplate> ObjectTemplateNew( |
| 1070 i::Isolate* isolate, v8::Local<FunctionTemplate> constructor, | 1070 i::Isolate* isolate, v8::Local<FunctionTemplate> constructor, |
| 1071 bool do_not_cache); | 1071 bool do_not_cache); |
| 1072 | 1072 |
| 1073 Local<ObjectTemplate> FunctionTemplate::PrototypeTemplate() { | 1073 Local<ObjectTemplate> FunctionTemplate::PrototypeTemplate() { |
| 1074 i::Isolate* i_isolate = Utils::OpenHandle(this)->GetIsolate(); | 1074 i::Isolate* i_isolate = Utils::OpenHandle(this)->GetIsolate(); |
| 1075 ENTER_V8(i_isolate); | 1075 ENTER_V8(i_isolate); |
| 1076 i::Handle<i::Object> result(Utils::OpenHandle(this)->prototype_template(), | 1076 i::Handle<i::Object> result(Utils::OpenHandle(this)->prototype_template(), |
| 1077 i_isolate); | 1077 i_isolate); |
| 1078 if (result->IsUndefined()) { | 1078 if (result->IsUndefined(i_isolate)) { |
| 1079 // Do not cache prototype objects. | 1079 // Do not cache prototype objects. |
| 1080 result = Utils::OpenHandle( | 1080 result = Utils::OpenHandle( |
| 1081 *ObjectTemplateNew(i_isolate, Local<FunctionTemplate>(), true)); | 1081 *ObjectTemplateNew(i_isolate, Local<FunctionTemplate>(), true)); |
| 1082 Utils::OpenHandle(this)->set_prototype_template(*result); | 1082 Utils::OpenHandle(this)->set_prototype_template(*result); |
| 1083 } | 1083 } |
| 1084 return ToApiHandle<ObjectTemplate>(result); | 1084 return ToApiHandle<ObjectTemplate>(result); |
| 1085 } | 1085 } |
| 1086 | 1086 |
| 1087 | 1087 |
| 1088 static void EnsureNotInstantiated(i::Handle<i::FunctionTemplateInfo> info, | 1088 static void EnsureNotInstantiated(i::Handle<i::FunctionTemplateInfo> info, |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1248 | 1248 |
| 1249 Local<ObjectTemplate> FunctionTemplate::InstanceTemplate() { | 1249 Local<ObjectTemplate> FunctionTemplate::InstanceTemplate() { |
| 1250 i::Handle<i::FunctionTemplateInfo> handle = Utils::OpenHandle(this, true); | 1250 i::Handle<i::FunctionTemplateInfo> handle = Utils::OpenHandle(this, true); |
| 1251 if (!Utils::ApiCheck(!handle.is_null(), | 1251 if (!Utils::ApiCheck(!handle.is_null(), |
| 1252 "v8::FunctionTemplate::InstanceTemplate()", | 1252 "v8::FunctionTemplate::InstanceTemplate()", |
| 1253 "Reading from empty handle")) { | 1253 "Reading from empty handle")) { |
| 1254 return Local<ObjectTemplate>(); | 1254 return Local<ObjectTemplate>(); |
| 1255 } | 1255 } |
| 1256 i::Isolate* isolate = handle->GetIsolate(); | 1256 i::Isolate* isolate = handle->GetIsolate(); |
| 1257 ENTER_V8(isolate); | 1257 ENTER_V8(isolate); |
| 1258 if (handle->instance_template()->IsUndefined()) { | 1258 if (handle->instance_template()->IsUndefined(isolate)) { |
| 1259 Local<ObjectTemplate> templ = | 1259 Local<ObjectTemplate> templ = |
| 1260 ObjectTemplate::New(isolate, ToApiHandle<FunctionTemplate>(handle)); | 1260 ObjectTemplate::New(isolate, ToApiHandle<FunctionTemplate>(handle)); |
| 1261 handle->set_instance_template(*Utils::OpenHandle(*templ)); | 1261 handle->set_instance_template(*Utils::OpenHandle(*templ)); |
| 1262 } | 1262 } |
| 1263 i::Handle<i::ObjectTemplateInfo> result( | 1263 i::Handle<i::ObjectTemplateInfo> result( |
| 1264 i::ObjectTemplateInfo::cast(handle->instance_template())); | 1264 i::ObjectTemplateInfo::cast(handle->instance_template())); |
| 1265 return Utils::ToLocal(result); | 1265 return Utils::ToLocal(result); |
| 1266 } | 1266 } |
| 1267 | 1267 |
| 1268 | 1268 |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1362 i::Isolate* isolate, v8::Local<FunctionTemplate> constructor) { | 1362 i::Isolate* isolate, v8::Local<FunctionTemplate> constructor) { |
| 1363 return ObjectTemplateNew(isolate, constructor, false); | 1363 return ObjectTemplateNew(isolate, constructor, false); |
| 1364 } | 1364 } |
| 1365 | 1365 |
| 1366 // Ensure that the object template has a constructor. If no | 1366 // Ensure that the object template has a constructor. If no |
| 1367 // constructor is available we create one. | 1367 // constructor is available we create one. |
| 1368 static i::Handle<i::FunctionTemplateInfo> EnsureConstructor( | 1368 static i::Handle<i::FunctionTemplateInfo> EnsureConstructor( |
| 1369 i::Isolate* isolate, | 1369 i::Isolate* isolate, |
| 1370 ObjectTemplate* object_template) { | 1370 ObjectTemplate* object_template) { |
| 1371 i::Object* obj = Utils::OpenHandle(object_template)->constructor(); | 1371 i::Object* obj = Utils::OpenHandle(object_template)->constructor(); |
| 1372 if (!obj ->IsUndefined()) { | 1372 if (!obj->IsUndefined(isolate)) { |
| 1373 i::FunctionTemplateInfo* info = i::FunctionTemplateInfo::cast(obj); | 1373 i::FunctionTemplateInfo* info = i::FunctionTemplateInfo::cast(obj); |
| 1374 return i::Handle<i::FunctionTemplateInfo>(info, isolate); | 1374 return i::Handle<i::FunctionTemplateInfo>(info, isolate); |
| 1375 } | 1375 } |
| 1376 Local<FunctionTemplate> templ = | 1376 Local<FunctionTemplate> templ = |
| 1377 FunctionTemplate::New(reinterpret_cast<Isolate*>(isolate)); | 1377 FunctionTemplate::New(reinterpret_cast<Isolate*>(isolate)); |
| 1378 i::Handle<i::FunctionTemplateInfo> constructor = Utils::OpenHandle(*templ); | 1378 i::Handle<i::FunctionTemplateInfo> constructor = Utils::OpenHandle(*templ); |
| 1379 constructor->set_instance_template(*Utils::OpenHandle(object_template)); | 1379 constructor->set_instance_template(*Utils::OpenHandle(object_template)); |
| 1380 Utils::OpenHandle(object_template)->set_constructor(*constructor); | 1380 Utils::OpenHandle(object_template)->set_constructor(*constructor); |
| 1381 return constructor; | 1381 return constructor; |
| 1382 } | 1382 } |
| (...skipping 928 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2311 | 2311 |
| 2312 v8::Local<Value> v8::TryCatch::StackTrace() const { | 2312 v8::Local<Value> v8::TryCatch::StackTrace() const { |
| 2313 auto context = reinterpret_cast<v8::Isolate*>(isolate_)->GetCurrentContext(); | 2313 auto context = reinterpret_cast<v8::Isolate*>(isolate_)->GetCurrentContext(); |
| 2314 RETURN_TO_LOCAL_UNCHECKED(StackTrace(context), Value); | 2314 RETURN_TO_LOCAL_UNCHECKED(StackTrace(context), Value); |
| 2315 } | 2315 } |
| 2316 | 2316 |
| 2317 | 2317 |
| 2318 v8::Local<v8::Message> v8::TryCatch::Message() const { | 2318 v8::Local<v8::Message> v8::TryCatch::Message() const { |
| 2319 i::Object* message = reinterpret_cast<i::Object*>(message_obj_); | 2319 i::Object* message = reinterpret_cast<i::Object*>(message_obj_); |
| 2320 DCHECK(message->IsJSMessageObject() || message->IsTheHole()); | 2320 DCHECK(message->IsJSMessageObject() || message->IsTheHole()); |
| 2321 if (HasCaught() && !message->IsTheHole()) { | 2321 if (HasCaught() && !message->IsTheHole(isolate_)) { |
| 2322 return v8::Utils::MessageToLocal(i::Handle<i::Object>(message, isolate_)); | 2322 return v8::Utils::MessageToLocal(i::Handle<i::Object>(message, isolate_)); |
| 2323 } else { | 2323 } else { |
| 2324 return v8::Local<v8::Message>(); | 2324 return v8::Local<v8::Message>(); |
| 2325 } | 2325 } |
| 2326 } | 2326 } |
| 2327 | 2327 |
| 2328 | 2328 |
| 2329 void v8::TryCatch::Reset() { | 2329 void v8::TryCatch::Reset() { |
| 2330 if (!rethrow_ && HasCaught() && isolate_->has_scheduled_exception()) { | 2330 if (!rethrow_ && HasCaught() && isolate_->has_scheduled_exception()) { |
| 2331 // If an exception was caught but is still scheduled because no API call | 2331 // If an exception was caught but is still scheduled because no API call |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2680 DCHECK(false); | 2680 DCHECK(false); |
| 2681 return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); | 2681 return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); |
| 2682 } | 2682 } |
| 2683 i::Handle<i::ObjectHashTable> table( | 2683 i::Handle<i::ObjectHashTable> table( |
| 2684 i::ObjectHashTable::cast(weak_collection->table())); | 2684 i::ObjectHashTable::cast(weak_collection->table())); |
| 2685 if (!table->IsKey(*key)) { | 2685 if (!table->IsKey(*key)) { |
| 2686 DCHECK(false); | 2686 DCHECK(false); |
| 2687 return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); | 2687 return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); |
| 2688 } | 2688 } |
| 2689 i::Handle<i::Object> lookup(table->Lookup(key), isolate); | 2689 i::Handle<i::Object> lookup(table->Lookup(key), isolate); |
| 2690 if (lookup->IsTheHole()) | 2690 if (lookup->IsTheHole(isolate)) |
| 2691 return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); | 2691 return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); |
| 2692 return Utils::ToLocal(lookup); | 2692 return Utils::ToLocal(lookup); |
| 2693 } | 2693 } |
| 2694 | 2694 |
| 2695 | 2695 |
| 2696 bool NativeWeakMap::Has(Local<Value> v8_key) { | 2696 bool NativeWeakMap::Has(Local<Value> v8_key) { |
| 2697 i::Handle<i::JSWeakMap> weak_collection = Utils::OpenHandle(this); | 2697 i::Handle<i::JSWeakMap> weak_collection = Utils::OpenHandle(this); |
| 2698 i::Isolate* isolate = weak_collection->GetIsolate(); | 2698 i::Isolate* isolate = weak_collection->GetIsolate(); |
| 2699 ENTER_V8(isolate); | 2699 ENTER_V8(isolate); |
| 2700 i::HandleScope scope(isolate); | 2700 i::HandleScope scope(isolate); |
| 2701 i::Handle<i::Object> key = Utils::OpenHandle(*v8_key); | 2701 i::Handle<i::Object> key = Utils::OpenHandle(*v8_key); |
| 2702 if (!key->IsJSReceiver() && !key->IsSymbol()) { | 2702 if (!key->IsJSReceiver() && !key->IsSymbol()) { |
| 2703 DCHECK(false); | 2703 DCHECK(false); |
| 2704 return false; | 2704 return false; |
| 2705 } | 2705 } |
| 2706 i::Handle<i::ObjectHashTable> table( | 2706 i::Handle<i::ObjectHashTable> table( |
| 2707 i::ObjectHashTable::cast(weak_collection->table())); | 2707 i::ObjectHashTable::cast(weak_collection->table())); |
| 2708 if (!table->IsKey(*key)) { | 2708 if (!table->IsKey(*key)) { |
| 2709 DCHECK(false); | 2709 DCHECK(false); |
| 2710 return false; | 2710 return false; |
| 2711 } | 2711 } |
| 2712 i::Handle<i::Object> lookup(table->Lookup(key), isolate); | 2712 i::Handle<i::Object> lookup(table->Lookup(key), isolate); |
| 2713 return !lookup->IsTheHole(); | 2713 return !lookup->IsTheHole(isolate); |
| 2714 } | 2714 } |
| 2715 | 2715 |
| 2716 | 2716 |
| 2717 bool NativeWeakMap::Delete(Local<Value> v8_key) { | 2717 bool NativeWeakMap::Delete(Local<Value> v8_key) { |
| 2718 i::Handle<i::JSWeakMap> weak_collection = Utils::OpenHandle(this); | 2718 i::Handle<i::JSWeakMap> weak_collection = Utils::OpenHandle(this); |
| 2719 i::Isolate* isolate = weak_collection->GetIsolate(); | 2719 i::Isolate* isolate = weak_collection->GetIsolate(); |
| 2720 ENTER_V8(isolate); | 2720 ENTER_V8(isolate); |
| 2721 i::HandleScope scope(isolate); | 2721 i::HandleScope scope(isolate); |
| 2722 i::Handle<i::Object> key = Utils::OpenHandle(*v8_key); | 2722 i::Handle<i::Object> key = Utils::OpenHandle(*v8_key); |
| 2723 if (!key->IsJSReceiver() && !key->IsSymbol()) { | 2723 if (!key->IsJSReceiver() && !key->IsSymbol()) { |
| (...skipping 2837 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5561 proxy_constructor = EnsureConstructor(isolate, *proxy_template); | 5561 proxy_constructor = EnsureConstructor(isolate, *proxy_template); |
| 5562 | 5562 |
| 5563 // Set the global template to be the prototype template of | 5563 // Set the global template to be the prototype template of |
| 5564 // global proxy template. | 5564 // global proxy template. |
| 5565 proxy_constructor->set_prototype_template( | 5565 proxy_constructor->set_prototype_template( |
| 5566 *Utils::OpenHandle(*global_template)); | 5566 *Utils::OpenHandle(*global_template)); |
| 5567 | 5567 |
| 5568 // Migrate security handlers from global_template to | 5568 // Migrate security handlers from global_template to |
| 5569 // proxy_template. Temporarily removing access check | 5569 // proxy_template. Temporarily removing access check |
| 5570 // information from the global template. | 5570 // information from the global template. |
| 5571 if (!global_constructor->access_check_info()->IsUndefined()) { | 5571 if (!global_constructor->access_check_info()->IsUndefined(isolate)) { |
| 5572 proxy_constructor->set_access_check_info( | 5572 proxy_constructor->set_access_check_info( |
| 5573 global_constructor->access_check_info()); | 5573 global_constructor->access_check_info()); |
| 5574 proxy_constructor->set_needs_access_check( | 5574 proxy_constructor->set_needs_access_check( |
| 5575 global_constructor->needs_access_check()); | 5575 global_constructor->needs_access_check()); |
| 5576 global_constructor->set_needs_access_check(false); | 5576 global_constructor->set_needs_access_check(false); |
| 5577 global_constructor->set_access_check_info( | 5577 global_constructor->set_access_check_info( |
| 5578 isolate->heap()->undefined_value()); | 5578 isolate->heap()->undefined_value()); |
| 5579 } | 5579 } |
| 5580 } | 5580 } |
| 5581 | 5581 |
| (...skipping 1353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6935 i::Handle<i::String> name, | 6935 i::Handle<i::String> name, |
| 6936 i::Handle<i::String> part, | 6936 i::Handle<i::String> part, |
| 6937 bool private_symbol) { | 6937 bool private_symbol) { |
| 6938 i::Handle<i::JSObject> registry = isolate->GetSymbolRegistry(); | 6938 i::Handle<i::JSObject> registry = isolate->GetSymbolRegistry(); |
| 6939 i::Handle<i::JSObject> symbols = | 6939 i::Handle<i::JSObject> symbols = |
| 6940 i::Handle<i::JSObject>::cast( | 6940 i::Handle<i::JSObject>::cast( |
| 6941 i::Object::GetPropertyOrElement(registry, part).ToHandleChecked()); | 6941 i::Object::GetPropertyOrElement(registry, part).ToHandleChecked()); |
| 6942 i::Handle<i::Object> symbol = | 6942 i::Handle<i::Object> symbol = |
| 6943 i::Object::GetPropertyOrElement(symbols, name).ToHandleChecked(); | 6943 i::Object::GetPropertyOrElement(symbols, name).ToHandleChecked(); |
| 6944 if (!symbol->IsSymbol()) { | 6944 if (!symbol->IsSymbol()) { |
| 6945 DCHECK(symbol->IsUndefined()); | 6945 DCHECK(symbol->IsUndefined(isolate)); |
| 6946 if (private_symbol) | 6946 if (private_symbol) |
| 6947 symbol = isolate->factory()->NewPrivateSymbol(); | 6947 symbol = isolate->factory()->NewPrivateSymbol(); |
| 6948 else | 6948 else |
| 6949 symbol = isolate->factory()->NewSymbol(); | 6949 symbol = isolate->factory()->NewSymbol(); |
| 6950 i::Handle<i::Symbol>::cast(symbol)->set_name(*name); | 6950 i::Handle<i::Symbol>::cast(symbol)->set_name(*name); |
| 6951 i::Object::SetPropertyOrElement(symbols, name, symbol, i::STRICT).Assert(); | 6951 i::Object::SetPropertyOrElement(symbols, name, symbol, i::STRICT).Assert(); |
| 6952 } | 6952 } |
| 6953 return i::Handle<i::Symbol>::cast(symbol); | 6953 return i::Handle<i::Symbol>::cast(symbol); |
| 6954 } | 6954 } |
| 6955 | 6955 |
| (...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7755 return true; | 7755 return true; |
| 7756 } | 7756 } |
| 7757 | 7757 |
| 7758 | 7758 |
| 7759 void Isolate::RemoveMessageListeners(MessageCallback that) { | 7759 void Isolate::RemoveMessageListeners(MessageCallback that) { |
| 7760 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); | 7760 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); |
| 7761 ENTER_V8(isolate); | 7761 ENTER_V8(isolate); |
| 7762 i::HandleScope scope(isolate); | 7762 i::HandleScope scope(isolate); |
| 7763 NeanderArray listeners(isolate->factory()->message_listeners()); | 7763 NeanderArray listeners(isolate->factory()->message_listeners()); |
| 7764 for (int i = 0; i < listeners.length(); i++) { | 7764 for (int i = 0; i < listeners.length(); i++) { |
| 7765 if (listeners.get(i)->IsUndefined()) continue; // skip deleted ones | 7765 if (listeners.get(i)->IsUndefined(isolate)) continue; // skip deleted ones |
| 7766 | 7766 |
| 7767 NeanderObject listener(i::JSObject::cast(listeners.get(i))); | 7767 NeanderObject listener(i::JSObject::cast(listeners.get(i))); |
| 7768 i::Handle<i::Foreign> callback_obj(i::Foreign::cast(listener.get(0))); | 7768 i::Handle<i::Foreign> callback_obj(i::Foreign::cast(listener.get(0))); |
| 7769 if (callback_obj->foreign_address() == FUNCTION_ADDR(that)) { | 7769 if (callback_obj->foreign_address() == FUNCTION_ADDR(that)) { |
| 7770 listeners.set(i, isolate->heap()->undefined_value()); | 7770 listeners.set(i, isolate->heap()->undefined_value()); |
| 7771 } | 7771 } |
| 7772 } | 7772 } |
| 7773 } | 7773 } |
| 7774 | 7774 |
| 7775 | 7775 |
| (...skipping 1041 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8817 Address callback_address = | 8817 Address callback_address = |
| 8818 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 8818 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
| 8819 VMState<EXTERNAL> state(isolate); | 8819 VMState<EXTERNAL> state(isolate); |
| 8820 ExternalCallbackScope call_scope(isolate, callback_address); | 8820 ExternalCallbackScope call_scope(isolate, callback_address); |
| 8821 callback(info); | 8821 callback(info); |
| 8822 } | 8822 } |
| 8823 | 8823 |
| 8824 | 8824 |
| 8825 } // namespace internal | 8825 } // namespace internal |
| 8826 } // namespace v8 | 8826 } // namespace v8 |
| OLD | NEW |