| 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 1484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1495 void ObjectTemplate::SetAccessor(v8::Local<Name> name, | 1495 void ObjectTemplate::SetAccessor(v8::Local<Name> name, |
| 1496 AccessorNameGetterCallback getter, | 1496 AccessorNameGetterCallback getter, |
| 1497 AccessorNameSetterCallback setter, | 1497 AccessorNameSetterCallback setter, |
| 1498 v8::Local<Value> data, AccessControl settings, | 1498 v8::Local<Value> data, AccessControl settings, |
| 1499 PropertyAttribute attribute, | 1499 PropertyAttribute attribute, |
| 1500 v8::Local<AccessorSignature> signature) { | 1500 v8::Local<AccessorSignature> signature) { |
| 1501 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute, | 1501 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute, |
| 1502 signature, i::FLAG_disable_old_api_accessors); | 1502 signature, i::FLAG_disable_old_api_accessors); |
| 1503 } | 1503 } |
| 1504 | 1504 |
| 1505 template <typename Getter, typename Setter, typename Query, typename Deleter, | 1505 template <typename Getter, typename Setter, typename Query, typename Descriptor, |
| 1506 typename Enumerator, typename Definer> | 1506 typename Deleter, typename Enumerator, typename Definer> |
| 1507 static i::Handle<i::InterceptorInfo> CreateInterceptorInfo( | 1507 static i::Handle<i::InterceptorInfo> CreateInterceptorInfo( |
| 1508 i::Isolate* isolate, Getter getter, Setter setter, Query query, | 1508 i::Isolate* isolate, Getter getter, Setter setter, Query query, |
| 1509 Deleter remover, Enumerator enumerator, Definer definer, Local<Value> data, | 1509 Descriptor descriptor, Deleter remover, Enumerator enumerator, |
| 1510 PropertyHandlerFlags flags) { | 1510 Definer definer, Local<Value> data, PropertyHandlerFlags flags) { |
| 1511 DCHECK(query == nullptr || |
| 1512 descriptor == nullptr); // Either intercept attributes or descriptor. |
| 1513 DCHECK(query == nullptr || |
| 1514 definer == |
| 1515 nullptr); // Only use descriptor callback with definer callback. |
| 1511 auto obj = i::Handle<i::InterceptorInfo>::cast( | 1516 auto obj = i::Handle<i::InterceptorInfo>::cast( |
| 1512 isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE)); | 1517 isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE)); |
| 1513 obj->set_flags(0); | 1518 obj->set_flags(0); |
| 1514 | 1519 |
| 1515 if (getter != 0) SET_FIELD_WRAPPED(obj, set_getter, getter); | 1520 if (getter != 0) SET_FIELD_WRAPPED(obj, set_getter, getter); |
| 1516 if (setter != 0) SET_FIELD_WRAPPED(obj, set_setter, setter); | 1521 if (setter != 0) SET_FIELD_WRAPPED(obj, set_setter, setter); |
| 1517 if (query != 0) SET_FIELD_WRAPPED(obj, set_query, query); | 1522 if (query != 0) SET_FIELD_WRAPPED(obj, set_query, query); |
| 1523 if (descriptor != 0) SET_FIELD_WRAPPED(obj, set_descriptor, descriptor); |
| 1518 if (remover != 0) SET_FIELD_WRAPPED(obj, set_deleter, remover); | 1524 if (remover != 0) SET_FIELD_WRAPPED(obj, set_deleter, remover); |
| 1519 if (enumerator != 0) SET_FIELD_WRAPPED(obj, set_enumerator, enumerator); | 1525 if (enumerator != 0) SET_FIELD_WRAPPED(obj, set_enumerator, enumerator); |
| 1520 if (definer != 0) SET_FIELD_WRAPPED(obj, set_definer, definer); | 1526 if (definer != 0) SET_FIELD_WRAPPED(obj, set_definer, definer); |
| 1521 obj->set_can_intercept_symbols( | 1527 obj->set_can_intercept_symbols( |
| 1522 !(static_cast<int>(flags) & | 1528 !(static_cast<int>(flags) & |
| 1523 static_cast<int>(PropertyHandlerFlags::kOnlyInterceptStrings))); | 1529 static_cast<int>(PropertyHandlerFlags::kOnlyInterceptStrings))); |
| 1524 obj->set_all_can_read(static_cast<int>(flags) & | 1530 obj->set_all_can_read(static_cast<int>(flags) & |
| 1525 static_cast<int>(PropertyHandlerFlags::kAllCanRead)); | 1531 static_cast<int>(PropertyHandlerFlags::kAllCanRead)); |
| 1526 obj->set_non_masking(static_cast<int>(flags) & | 1532 obj->set_non_masking(static_cast<int>(flags) & |
| 1527 static_cast<int>(PropertyHandlerFlags::kNonMasking)); | 1533 static_cast<int>(PropertyHandlerFlags::kNonMasking)); |
| 1528 | 1534 |
| 1529 if (data.IsEmpty()) { | 1535 if (data.IsEmpty()) { |
| 1530 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); | 1536 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); |
| 1531 } | 1537 } |
| 1532 obj->set_data(*Utils::OpenHandle(*data)); | 1538 obj->set_data(*Utils::OpenHandle(*data)); |
| 1533 return obj; | 1539 return obj; |
| 1534 } | 1540 } |
| 1535 | 1541 |
| 1536 template <typename Getter, typename Setter, typename Query, typename Deleter, | 1542 template <typename Getter, typename Setter, typename Query, typename Descriptor, |
| 1537 typename Enumerator, typename Definer> | 1543 typename Deleter, typename Enumerator, typename Definer> |
| 1538 static void ObjectTemplateSetNamedPropertyHandler( | 1544 static void ObjectTemplateSetNamedPropertyHandler( |
| 1539 ObjectTemplate* templ, Getter getter, Setter setter, Query query, | 1545 ObjectTemplate* templ, Getter getter, Setter setter, Query query, |
| 1540 Deleter remover, Enumerator enumerator, Definer definer, Local<Value> data, | 1546 Descriptor descriptor, Deleter remover, Enumerator enumerator, |
| 1541 PropertyHandlerFlags flags) { | 1547 Definer definer, Local<Value> data, PropertyHandlerFlags flags) { |
| 1542 i::Isolate* isolate = Utils::OpenHandle(templ)->GetIsolate(); | 1548 i::Isolate* isolate = Utils::OpenHandle(templ)->GetIsolate(); |
| 1543 ENTER_V8(isolate); | 1549 ENTER_V8(isolate); |
| 1544 i::HandleScope scope(isolate); | 1550 i::HandleScope scope(isolate); |
| 1545 auto cons = EnsureConstructor(isolate, templ); | 1551 auto cons = EnsureConstructor(isolate, templ); |
| 1546 EnsureNotInstantiated(cons, "ObjectTemplateSetNamedPropertyHandler"); | 1552 EnsureNotInstantiated(cons, "ObjectTemplateSetNamedPropertyHandler"); |
| 1547 auto obj = CreateInterceptorInfo(isolate, getter, setter, query, remover, | 1553 auto obj = CreateInterceptorInfo(isolate, getter, setter, query, descriptor, |
| 1548 enumerator, definer, data, flags); | 1554 remover, enumerator, definer, data, flags); |
| 1549 cons->set_named_property_handler(*obj); | 1555 cons->set_named_property_handler(*obj); |
| 1550 } | 1556 } |
| 1551 | 1557 |
| 1552 void ObjectTemplate::SetNamedPropertyHandler( | 1558 void ObjectTemplate::SetNamedPropertyHandler( |
| 1553 NamedPropertyGetterCallback getter, NamedPropertySetterCallback setter, | 1559 NamedPropertyGetterCallback getter, NamedPropertySetterCallback setter, |
| 1554 NamedPropertyQueryCallback query, NamedPropertyDeleterCallback remover, | 1560 NamedPropertyQueryCallback query, NamedPropertyDeleterCallback remover, |
| 1555 NamedPropertyEnumeratorCallback enumerator, Local<Value> data) { | 1561 NamedPropertyEnumeratorCallback enumerator, Local<Value> data) { |
| 1556 ObjectTemplateSetNamedPropertyHandler( | 1562 ObjectTemplateSetNamedPropertyHandler( |
| 1557 this, getter, setter, query, remover, enumerator, nullptr, data, | 1563 this, getter, setter, query, nullptr, remover, enumerator, nullptr, data, |
| 1558 PropertyHandlerFlags::kOnlyInterceptStrings); | 1564 PropertyHandlerFlags::kOnlyInterceptStrings); |
| 1559 } | 1565 } |
| 1560 | 1566 |
| 1561 void ObjectTemplate::SetHandler( | 1567 void ObjectTemplate::SetHandler( |
| 1562 const NamedPropertyHandlerConfiguration& config) { | 1568 const NamedPropertyHandlerConfiguration& config) { |
| 1563 ObjectTemplateSetNamedPropertyHandler( | 1569 ObjectTemplateSetNamedPropertyHandler( |
| 1564 this, config.getter, config.setter, config.query, config.deleter, | 1570 this, config.getter, config.setter, config.query, config.descriptor, |
| 1565 config.enumerator, config.definer, config.data, config.flags); | 1571 config.deleter, config.enumerator, config.definer, config.data, |
| 1572 config.flags); |
| 1566 } | 1573 } |
| 1567 | 1574 |
| 1568 | 1575 |
| 1569 void ObjectTemplate::MarkAsUndetectable() { | 1576 void ObjectTemplate::MarkAsUndetectable() { |
| 1570 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 1577 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
| 1571 ENTER_V8(isolate); | 1578 ENTER_V8(isolate); |
| 1572 i::HandleScope scope(isolate); | 1579 i::HandleScope scope(isolate); |
| 1573 auto cons = EnsureConstructor(isolate, this); | 1580 auto cons = EnsureConstructor(isolate, this); |
| 1574 EnsureNotInstantiated(cons, "v8::ObjectTemplate::MarkAsUndetectable"); | 1581 EnsureNotInstantiated(cons, "v8::ObjectTemplate::MarkAsUndetectable"); |
| 1575 cons->set_undetectable(true); | 1582 cons->set_undetectable(true); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1615 cons, "v8::ObjectTemplate::SetAccessCheckCallbackWithHandler"); | 1622 cons, "v8::ObjectTemplate::SetAccessCheckCallbackWithHandler"); |
| 1616 | 1623 |
| 1617 i::Handle<i::Struct> struct_info = | 1624 i::Handle<i::Struct> struct_info = |
| 1618 isolate->factory()->NewStruct(i::ACCESS_CHECK_INFO_TYPE); | 1625 isolate->factory()->NewStruct(i::ACCESS_CHECK_INFO_TYPE); |
| 1619 i::Handle<i::AccessCheckInfo> info = | 1626 i::Handle<i::AccessCheckInfo> info = |
| 1620 i::Handle<i::AccessCheckInfo>::cast(struct_info); | 1627 i::Handle<i::AccessCheckInfo>::cast(struct_info); |
| 1621 | 1628 |
| 1622 SET_FIELD_WRAPPED(info, set_callback, callback); | 1629 SET_FIELD_WRAPPED(info, set_callback, callback); |
| 1623 auto named_interceptor = CreateInterceptorInfo( | 1630 auto named_interceptor = CreateInterceptorInfo( |
| 1624 isolate, named_handler.getter, named_handler.setter, named_handler.query, | 1631 isolate, named_handler.getter, named_handler.setter, named_handler.query, |
| 1625 named_handler.deleter, named_handler.enumerator, named_handler.definer, | 1632 named_handler.descriptor, named_handler.deleter, named_handler.enumerator, |
| 1626 named_handler.data, named_handler.flags); | 1633 named_handler.definer, named_handler.data, named_handler.flags); |
| 1627 info->set_named_interceptor(*named_interceptor); | 1634 info->set_named_interceptor(*named_interceptor); |
| 1628 auto indexed_interceptor = CreateInterceptorInfo( | 1635 auto indexed_interceptor = CreateInterceptorInfo( |
| 1629 isolate, indexed_handler.getter, indexed_handler.setter, | 1636 isolate, indexed_handler.getter, indexed_handler.setter, |
| 1630 indexed_handler.query, indexed_handler.deleter, | 1637 indexed_handler.query, indexed_handler.descriptor, |
| 1631 indexed_handler.enumerator, indexed_handler.definer, indexed_handler.data, | 1638 indexed_handler.deleter, indexed_handler.enumerator, |
| 1632 indexed_handler.flags); | 1639 indexed_handler.definer, indexed_handler.data, indexed_handler.flags); |
| 1633 info->set_indexed_interceptor(*indexed_interceptor); | 1640 info->set_indexed_interceptor(*indexed_interceptor); |
| 1634 | 1641 |
| 1635 if (data.IsEmpty()) { | 1642 if (data.IsEmpty()) { |
| 1636 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); | 1643 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); |
| 1637 } | 1644 } |
| 1638 info->set_data(*Utils::OpenHandle(*data)); | 1645 info->set_data(*Utils::OpenHandle(*data)); |
| 1639 | 1646 |
| 1640 cons->set_access_check_info(*info); | 1647 cons->set_access_check_info(*info); |
| 1641 cons->set_needs_access_check(true); | 1648 cons->set_needs_access_check(true); |
| 1642 } | 1649 } |
| 1643 | 1650 |
| 1644 void ObjectTemplate::SetHandler( | 1651 void ObjectTemplate::SetHandler( |
| 1645 const IndexedPropertyHandlerConfiguration& config) { | 1652 const IndexedPropertyHandlerConfiguration& config) { |
| 1646 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 1653 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
| 1647 ENTER_V8(isolate); | 1654 ENTER_V8(isolate); |
| 1648 i::HandleScope scope(isolate); | 1655 i::HandleScope scope(isolate); |
| 1649 auto cons = EnsureConstructor(isolate, this); | 1656 auto cons = EnsureConstructor(isolate, this); |
| 1650 EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetHandler"); | 1657 EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetHandler"); |
| 1651 auto obj = CreateInterceptorInfo( | 1658 auto obj = CreateInterceptorInfo(isolate, config.getter, config.setter, |
| 1652 isolate, config.getter, config.setter, config.query, config.deleter, | 1659 config.query, config.descriptor, |
| 1653 config.enumerator, config.definer, config.data, config.flags); | 1660 config.deleter, config.enumerator, |
| 1661 config.definer, config.data, config.flags); |
| 1654 cons->set_indexed_property_handler(*obj); | 1662 cons->set_indexed_property_handler(*obj); |
| 1655 } | 1663 } |
| 1656 | 1664 |
| 1657 | 1665 |
| 1658 void ObjectTemplate::SetCallAsFunctionHandler(FunctionCallback callback, | 1666 void ObjectTemplate::SetCallAsFunctionHandler(FunctionCallback callback, |
| 1659 Local<Value> data) { | 1667 Local<Value> data) { |
| 1660 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 1668 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
| 1661 ENTER_V8(isolate); | 1669 ENTER_V8(isolate); |
| 1662 i::HandleScope scope(isolate); | 1670 i::HandleScope scope(isolate); |
| 1663 auto cons = EnsureConstructor(isolate, this); | 1671 auto cons = EnsureConstructor(isolate, this); |
| (...skipping 7558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9222 Address callback_address = | 9230 Address callback_address = |
| 9223 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 9231 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
| 9224 VMState<EXTERNAL> state(isolate); | 9232 VMState<EXTERNAL> state(isolate); |
| 9225 ExternalCallbackScope call_scope(isolate, callback_address); | 9233 ExternalCallbackScope call_scope(isolate, callback_address); |
| 9226 callback(info); | 9234 callback(info); |
| 9227 } | 9235 } |
| 9228 | 9236 |
| 9229 | 9237 |
| 9230 } // namespace internal | 9238 } // namespace internal |
| 9231 } // namespace v8 | 9239 } // namespace v8 |
| OLD | NEW |