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 1277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1288 } | 1288 } |
1289 return obj; | 1289 return obj; |
1290 } | 1290 } |
1291 | 1291 |
1292 namespace { | 1292 namespace { |
1293 | 1293 |
1294 template <typename Getter, typename Setter> | 1294 template <typename Getter, typename Setter> |
1295 i::Handle<i::AccessorInfo> MakeAccessorInfo( | 1295 i::Handle<i::AccessorInfo> MakeAccessorInfo( |
1296 v8::Local<Name> name, Getter getter, Setter setter, v8::Local<Value> data, | 1296 v8::Local<Name> name, Getter getter, Setter setter, v8::Local<Value> data, |
1297 v8::AccessControl settings, v8::PropertyAttribute attributes, | 1297 v8::AccessControl settings, v8::PropertyAttribute attributes, |
1298 v8::Local<AccessorSignature> signature, bool is_special_data_property) { | 1298 v8::Local<AccessorSignature> signature, bool is_special_data_property, |
| 1299 bool replace_on_access) { |
1299 i::Isolate* isolate = Utils::OpenHandle(*name)->GetIsolate(); | 1300 i::Isolate* isolate = Utils::OpenHandle(*name)->GetIsolate(); |
1300 i::Handle<i::AccessorInfo> obj = isolate->factory()->NewAccessorInfo(); | 1301 i::Handle<i::AccessorInfo> obj = isolate->factory()->NewAccessorInfo(); |
1301 SET_FIELD_WRAPPED(obj, set_getter, getter); | 1302 SET_FIELD_WRAPPED(obj, set_getter, getter); |
| 1303 DCHECK_IMPLIES(replace_on_access, |
| 1304 is_special_data_property && setter == nullptr); |
1302 if (is_special_data_property && setter == nullptr) { | 1305 if (is_special_data_property && setter == nullptr) { |
1303 setter = reinterpret_cast<Setter>(&i::Accessors::ReconfigureToDataProperty); | 1306 setter = reinterpret_cast<Setter>(&i::Accessors::ReconfigureToDataProperty); |
1304 } | 1307 } |
1305 SET_FIELD_WRAPPED(obj, set_setter, setter); | 1308 SET_FIELD_WRAPPED(obj, set_setter, setter); |
1306 i::Address redirected = obj->redirected_getter(); | 1309 i::Address redirected = obj->redirected_getter(); |
1307 if (redirected != nullptr) SET_FIELD_WRAPPED(obj, set_js_getter, redirected); | 1310 if (redirected != nullptr) SET_FIELD_WRAPPED(obj, set_js_getter, redirected); |
1308 if (data.IsEmpty()) { | 1311 if (data.IsEmpty()) { |
1309 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); | 1312 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); |
1310 } | 1313 } |
1311 obj->set_data(*Utils::OpenHandle(*data)); | 1314 obj->set_data(*Utils::OpenHandle(*data)); |
1312 obj->set_is_special_data_property(is_special_data_property); | 1315 obj->set_is_special_data_property(is_special_data_property); |
| 1316 obj->set_replace_on_access(replace_on_access); |
1313 return SetAccessorInfoProperties(obj, name, settings, attributes, signature); | 1317 return SetAccessorInfoProperties(obj, name, settings, attributes, signature); |
1314 } | 1318 } |
1315 | 1319 |
1316 } // namespace | 1320 } // namespace |
1317 | 1321 |
1318 Local<ObjectTemplate> FunctionTemplate::InstanceTemplate() { | 1322 Local<ObjectTemplate> FunctionTemplate::InstanceTemplate() { |
1319 i::Handle<i::FunctionTemplateInfo> handle = Utils::OpenHandle(this, true); | 1323 i::Handle<i::FunctionTemplateInfo> handle = Utils::OpenHandle(this, true); |
1320 if (!Utils::ApiCheck(!handle.is_null(), | 1324 if (!Utils::ApiCheck(!handle.is_null(), |
1321 "v8::FunctionTemplate::InstanceTemplate()", | 1325 "v8::FunctionTemplate::InstanceTemplate()", |
1322 "Reading from empty handle")) { | 1326 "Reading from empty handle")) { |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1454 return i::Handle<i::FunctionTemplateInfo>(info, isolate); | 1458 return i::Handle<i::FunctionTemplateInfo>(info, isolate); |
1455 } | 1459 } |
1456 Local<FunctionTemplate> templ = | 1460 Local<FunctionTemplate> templ = |
1457 FunctionTemplate::New(reinterpret_cast<Isolate*>(isolate)); | 1461 FunctionTemplate::New(reinterpret_cast<Isolate*>(isolate)); |
1458 i::Handle<i::FunctionTemplateInfo> constructor = Utils::OpenHandle(*templ); | 1462 i::Handle<i::FunctionTemplateInfo> constructor = Utils::OpenHandle(*templ); |
1459 constructor->set_instance_template(*Utils::OpenHandle(object_template)); | 1463 constructor->set_instance_template(*Utils::OpenHandle(object_template)); |
1460 Utils::OpenHandle(object_template)->set_constructor(*constructor); | 1464 Utils::OpenHandle(object_template)->set_constructor(*constructor); |
1461 return constructor; | 1465 return constructor; |
1462 } | 1466 } |
1463 | 1467 |
1464 | |
1465 template <typename Getter, typename Setter, typename Data, typename Template> | 1468 template <typename Getter, typename Setter, typename Data, typename Template> |
1466 static bool TemplateSetAccessor(Template* template_obj, v8::Local<Name> name, | 1469 static bool TemplateSetAccessor(Template* template_obj, v8::Local<Name> name, |
1467 Getter getter, Setter setter, Data data, | 1470 Getter getter, Setter setter, Data data, |
1468 AccessControl settings, | 1471 AccessControl settings, |
1469 PropertyAttribute attribute, | 1472 PropertyAttribute attribute, |
1470 v8::Local<AccessorSignature> signature, | 1473 v8::Local<AccessorSignature> signature, |
1471 bool is_special_data_property) { | 1474 bool is_special_data_property, |
| 1475 bool replace_on_access) { |
1472 auto info = Utils::OpenHandle(template_obj); | 1476 auto info = Utils::OpenHandle(template_obj); |
1473 auto isolate = info->GetIsolate(); | 1477 auto isolate = info->GetIsolate(); |
1474 ENTER_V8(isolate); | 1478 ENTER_V8(isolate); |
1475 i::HandleScope scope(isolate); | 1479 i::HandleScope scope(isolate); |
1476 auto obj = MakeAccessorInfo(name, getter, setter, data, settings, attribute, | 1480 auto obj = |
1477 signature, is_special_data_property); | 1481 MakeAccessorInfo(name, getter, setter, data, settings, attribute, |
| 1482 signature, is_special_data_property, replace_on_access); |
1478 if (obj.is_null()) return false; | 1483 if (obj.is_null()) return false; |
1479 i::ApiNatives::AddNativeDataProperty(isolate, info, obj); | 1484 i::ApiNatives::AddNativeDataProperty(isolate, info, obj); |
1480 return true; | 1485 return true; |
1481 } | 1486 } |
1482 | 1487 |
1483 | 1488 |
1484 void Template::SetNativeDataProperty(v8::Local<String> name, | 1489 void Template::SetNativeDataProperty(v8::Local<String> name, |
1485 AccessorGetterCallback getter, | 1490 AccessorGetterCallback getter, |
1486 AccessorSetterCallback setter, | 1491 AccessorSetterCallback setter, |
1487 v8::Local<Value> data, | 1492 v8::Local<Value> data, |
1488 PropertyAttribute attribute, | 1493 PropertyAttribute attribute, |
1489 v8::Local<AccessorSignature> signature, | 1494 v8::Local<AccessorSignature> signature, |
1490 AccessControl settings) { | 1495 AccessControl settings) { |
1491 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute, | 1496 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute, |
1492 signature, true); | 1497 signature, true, false); |
1493 } | 1498 } |
1494 | 1499 |
1495 | 1500 |
1496 void Template::SetNativeDataProperty(v8::Local<Name> name, | 1501 void Template::SetNativeDataProperty(v8::Local<Name> name, |
1497 AccessorNameGetterCallback getter, | 1502 AccessorNameGetterCallback getter, |
1498 AccessorNameSetterCallback setter, | 1503 AccessorNameSetterCallback setter, |
1499 v8::Local<Value> data, | 1504 v8::Local<Value> data, |
1500 PropertyAttribute attribute, | 1505 PropertyAttribute attribute, |
1501 v8::Local<AccessorSignature> signature, | 1506 v8::Local<AccessorSignature> signature, |
1502 AccessControl settings) { | 1507 AccessControl settings) { |
1503 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute, | 1508 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute, |
1504 signature, true); | 1509 signature, true, false); |
1505 } | 1510 } |
1506 | 1511 |
| 1512 void Template::SetLazyDataProperty(v8::Local<Name> name, |
| 1513 AccessorNameGetterCallback getter, |
| 1514 v8::Local<Value> data, |
| 1515 PropertyAttribute attribute) { |
| 1516 TemplateSetAccessor( |
| 1517 this, name, getter, static_cast<AccessorNameSetterCallback>(nullptr), |
| 1518 data, DEFAULT, attribute, Local<AccessorSignature>(), true, true); |
| 1519 } |
1507 | 1520 |
1508 void Template::SetIntrinsicDataProperty(Local<Name> name, Intrinsic intrinsic, | 1521 void Template::SetIntrinsicDataProperty(Local<Name> name, Intrinsic intrinsic, |
1509 PropertyAttribute attribute) { | 1522 PropertyAttribute attribute) { |
1510 auto templ = Utils::OpenHandle(this); | 1523 auto templ = Utils::OpenHandle(this); |
1511 i::Isolate* isolate = templ->GetIsolate(); | 1524 i::Isolate* isolate = templ->GetIsolate(); |
1512 ENTER_V8(isolate); | 1525 ENTER_V8(isolate); |
1513 i::HandleScope scope(isolate); | 1526 i::HandleScope scope(isolate); |
1514 i::ApiNatives::AddDataProperty(isolate, templ, Utils::OpenHandle(*name), | 1527 i::ApiNatives::AddDataProperty(isolate, templ, Utils::OpenHandle(*name), |
1515 intrinsic, | 1528 intrinsic, |
1516 static_cast<i::PropertyAttributes>(attribute)); | 1529 static_cast<i::PropertyAttributes>(attribute)); |
1517 } | 1530 } |
1518 | 1531 |
1519 | 1532 |
1520 void ObjectTemplate::SetAccessor(v8::Local<String> name, | 1533 void ObjectTemplate::SetAccessor(v8::Local<String> name, |
1521 AccessorGetterCallback getter, | 1534 AccessorGetterCallback getter, |
1522 AccessorSetterCallback setter, | 1535 AccessorSetterCallback setter, |
1523 v8::Local<Value> data, AccessControl settings, | 1536 v8::Local<Value> data, AccessControl settings, |
1524 PropertyAttribute attribute, | 1537 PropertyAttribute attribute, |
1525 v8::Local<AccessorSignature> signature) { | 1538 v8::Local<AccessorSignature> signature) { |
1526 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute, | 1539 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute, |
1527 signature, i::FLAG_disable_old_api_accessors); | 1540 signature, i::FLAG_disable_old_api_accessors, false); |
1528 } | 1541 } |
1529 | 1542 |
1530 | 1543 |
1531 void ObjectTemplate::SetAccessor(v8::Local<Name> name, | 1544 void ObjectTemplate::SetAccessor(v8::Local<Name> name, |
1532 AccessorNameGetterCallback getter, | 1545 AccessorNameGetterCallback getter, |
1533 AccessorNameSetterCallback setter, | 1546 AccessorNameSetterCallback setter, |
1534 v8::Local<Value> data, AccessControl settings, | 1547 v8::Local<Value> data, AccessControl settings, |
1535 PropertyAttribute attribute, | 1548 PropertyAttribute attribute, |
1536 v8::Local<AccessorSignature> signature) { | 1549 v8::Local<AccessorSignature> signature) { |
1537 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute, | 1550 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute, |
1538 signature, i::FLAG_disable_old_api_accessors); | 1551 signature, i::FLAG_disable_old_api_accessors, false); |
1539 } | 1552 } |
1540 | 1553 |
1541 template <typename Getter, typename Setter, typename Query, typename Descriptor, | 1554 template <typename Getter, typename Setter, typename Query, typename Descriptor, |
1542 typename Deleter, typename Enumerator, typename Definer> | 1555 typename Deleter, typename Enumerator, typename Definer> |
1543 static i::Handle<i::InterceptorInfo> CreateInterceptorInfo( | 1556 static i::Handle<i::InterceptorInfo> CreateInterceptorInfo( |
1544 i::Isolate* isolate, Getter getter, Setter setter, Query query, | 1557 i::Isolate* isolate, Getter getter, Setter setter, Query query, |
1545 Descriptor descriptor, Deleter remover, Enumerator enumerator, | 1558 Descriptor descriptor, Deleter remover, Enumerator enumerator, |
1546 Definer definer, Local<Value> data, PropertyHandlerFlags flags) { | 1559 Definer definer, Local<Value> data, PropertyHandlerFlags flags) { |
1547 DCHECK(query == nullptr || | 1560 DCHECK(query == nullptr || |
1548 descriptor == nullptr); // Either intercept attributes or descriptor. | 1561 descriptor == nullptr); // Either intercept attributes or descriptor. |
(...skipping 2930 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4479 static Maybe<bool> ObjectSetAccessor(Local<Context> context, Object* self, | 4492 static Maybe<bool> ObjectSetAccessor(Local<Context> context, Object* self, |
4480 Local<Name> name, Getter getter, | 4493 Local<Name> name, Getter getter, |
4481 Setter setter, Data data, | 4494 Setter setter, Data data, |
4482 AccessControl settings, | 4495 AccessControl settings, |
4483 PropertyAttribute attributes) { | 4496 PropertyAttribute attributes) { |
4484 PREPARE_FOR_EXECUTION_PRIMITIVE(context, Object, SetAccessor, bool); | 4497 PREPARE_FOR_EXECUTION_PRIMITIVE(context, Object, SetAccessor, bool); |
4485 if (!Utils::OpenHandle(self)->IsJSObject()) return Just(false); | 4498 if (!Utils::OpenHandle(self)->IsJSObject()) return Just(false); |
4486 i::Handle<i::JSObject> obj = | 4499 i::Handle<i::JSObject> obj = |
4487 i::Handle<i::JSObject>::cast(Utils::OpenHandle(self)); | 4500 i::Handle<i::JSObject>::cast(Utils::OpenHandle(self)); |
4488 v8::Local<AccessorSignature> signature; | 4501 v8::Local<AccessorSignature> signature; |
4489 auto info = MakeAccessorInfo(name, getter, setter, data, settings, attributes, | 4502 auto info = |
4490 signature, i::FLAG_disable_old_api_accessors); | 4503 MakeAccessorInfo(name, getter, setter, data, settings, attributes, |
| 4504 signature, i::FLAG_disable_old_api_accessors, false); |
4491 if (info.is_null()) return Nothing<bool>(); | 4505 if (info.is_null()) return Nothing<bool>(); |
4492 bool fast = obj->HasFastProperties(); | 4506 bool fast = obj->HasFastProperties(); |
4493 i::Handle<i::Object> result; | 4507 i::Handle<i::Object> result; |
4494 has_pending_exception = | 4508 has_pending_exception = |
4495 !i::JSObject::SetAccessor(obj, info).ToHandle(&result); | 4509 !i::JSObject::SetAccessor(obj, info).ToHandle(&result); |
4496 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); | 4510 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); |
4497 if (result->IsUndefined(obj->GetIsolate())) return Nothing<bool>(); | 4511 if (result->IsUndefined(obj->GetIsolate())) return Nothing<bool>(); |
4498 if (fast) { | 4512 if (fast) { |
4499 i::JSObject::MigrateSlowToFast(obj, 0, "APISetAccessor"); | 4513 i::JSObject::MigrateSlowToFast(obj, 0, "APISetAccessor"); |
4500 } | 4514 } |
(...skipping 4991 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9492 Address callback_address = | 9506 Address callback_address = |
9493 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 9507 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
9494 VMState<EXTERNAL> state(isolate); | 9508 VMState<EXTERNAL> state(isolate); |
9495 ExternalCallbackScope call_scope(isolate, callback_address); | 9509 ExternalCallbackScope call_scope(isolate, callback_address); |
9496 callback(info); | 9510 callback(info); |
9497 } | 9511 } |
9498 | 9512 |
9499 | 9513 |
9500 } // namespace internal | 9514 } // namespace internal |
9501 } // namespace v8 | 9515 } // namespace v8 |
OLD | NEW |