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 1517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1528 void ObjectTemplate::SetAccessor(v8::Local<Name> name, | 1528 void ObjectTemplate::SetAccessor(v8::Local<Name> name, |
1529 AccessorNameGetterCallback getter, | 1529 AccessorNameGetterCallback getter, |
1530 AccessorNameSetterCallback setter, | 1530 AccessorNameSetterCallback setter, |
1531 v8::Local<Value> data, AccessControl settings, | 1531 v8::Local<Value> data, AccessControl settings, |
1532 PropertyAttribute attribute, | 1532 PropertyAttribute attribute, |
1533 v8::Local<AccessorSignature> signature) { | 1533 v8::Local<AccessorSignature> signature) { |
1534 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute, | 1534 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute, |
1535 signature, i::FLAG_disable_old_api_accessors); | 1535 signature, i::FLAG_disable_old_api_accessors); |
1536 } | 1536 } |
1537 | 1537 |
1538 | |
1539 template <typename Getter, typename Setter, typename Query, typename Deleter, | 1538 template <typename Getter, typename Setter, typename Query, typename Deleter, |
1540 typename Enumerator> | 1539 typename Enumerator> |
1541 static void ObjectTemplateSetNamedPropertyHandler(ObjectTemplate* templ, | 1540 static i::Handle<i::InterceptorInfo> CreateInterceptorInfo( |
1542 Getter getter, Setter setter, | 1541 i::Isolate* isolate, Getter getter, Setter setter, Query query, |
1543 Query query, Deleter remover, | 1542 Deleter remover, Enumerator enumerator, Local<Value> data, |
1544 Enumerator enumerator, | 1543 PropertyHandlerFlags flags) { |
1545 Local<Value> data, | |
1546 PropertyHandlerFlags flags) { | |
1547 i::Isolate* isolate = Utils::OpenHandle(templ)->GetIsolate(); | |
1548 ENTER_V8(isolate); | |
1549 i::HandleScope scope(isolate); | |
1550 auto cons = EnsureConstructor(isolate, templ); | |
1551 EnsureNotInstantiated(cons, "ObjectTemplateSetNamedPropertyHandler"); | |
1552 auto obj = i::Handle<i::InterceptorInfo>::cast( | 1544 auto obj = i::Handle<i::InterceptorInfo>::cast( |
1553 isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE)); | 1545 isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE)); |
1554 obj->set_flags(0); | 1546 obj->set_flags(0); |
1555 | 1547 |
1556 if (getter != 0) SET_FIELD_WRAPPED(obj, set_getter, getter); | 1548 if (getter != 0) SET_FIELD_WRAPPED(obj, set_getter, getter); |
1557 if (setter != 0) SET_FIELD_WRAPPED(obj, set_setter, setter); | 1549 if (setter != 0) SET_FIELD_WRAPPED(obj, set_setter, setter); |
1558 if (query != 0) SET_FIELD_WRAPPED(obj, set_query, query); | 1550 if (query != 0) SET_FIELD_WRAPPED(obj, set_query, query); |
1559 if (remover != 0) SET_FIELD_WRAPPED(obj, set_deleter, remover); | 1551 if (remover != 0) SET_FIELD_WRAPPED(obj, set_deleter, remover); |
1560 if (enumerator != 0) SET_FIELD_WRAPPED(obj, set_enumerator, enumerator); | 1552 if (enumerator != 0) SET_FIELD_WRAPPED(obj, set_enumerator, enumerator); |
1561 obj->set_can_intercept_symbols( | 1553 obj->set_can_intercept_symbols( |
1562 !(static_cast<int>(flags) & | 1554 !(static_cast<int>(flags) & |
1563 static_cast<int>(PropertyHandlerFlags::kOnlyInterceptStrings))); | 1555 static_cast<int>(PropertyHandlerFlags::kOnlyInterceptStrings))); |
1564 obj->set_all_can_read(static_cast<int>(flags) & | 1556 obj->set_all_can_read(static_cast<int>(flags) & |
1565 static_cast<int>(PropertyHandlerFlags::kAllCanRead)); | 1557 static_cast<int>(PropertyHandlerFlags::kAllCanRead)); |
1566 obj->set_non_masking(static_cast<int>(flags) & | 1558 obj->set_non_masking(static_cast<int>(flags) & |
1567 static_cast<int>(PropertyHandlerFlags::kNonMasking)); | 1559 static_cast<int>(PropertyHandlerFlags::kNonMasking)); |
1568 | 1560 |
1569 if (data.IsEmpty()) { | 1561 if (data.IsEmpty()) { |
1570 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); | 1562 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); |
1571 } | 1563 } |
1572 obj->set_data(*Utils::OpenHandle(*data)); | 1564 obj->set_data(*Utils::OpenHandle(*data)); |
| 1565 return obj; |
| 1566 } |
| 1567 |
| 1568 template <typename Getter, typename Setter, typename Query, typename Deleter, |
| 1569 typename Enumerator> |
| 1570 static void ObjectTemplateSetNamedPropertyHandler(ObjectTemplate* templ, |
| 1571 Getter getter, Setter setter, |
| 1572 Query query, Deleter remover, |
| 1573 Enumerator enumerator, |
| 1574 Local<Value> data, |
| 1575 PropertyHandlerFlags flags) { |
| 1576 i::Isolate* isolate = Utils::OpenHandle(templ)->GetIsolate(); |
| 1577 ENTER_V8(isolate); |
| 1578 i::HandleScope scope(isolate); |
| 1579 auto cons = EnsureConstructor(isolate, templ); |
| 1580 EnsureNotInstantiated(cons, "ObjectTemplateSetNamedPropertyHandler"); |
| 1581 auto obj = CreateInterceptorInfo(isolate, getter, setter, query, remover, |
| 1582 enumerator, data, flags); |
1573 cons->set_named_property_handler(*obj); | 1583 cons->set_named_property_handler(*obj); |
1574 } | 1584 } |
1575 | 1585 |
1576 | 1586 |
1577 void ObjectTemplate::SetNamedPropertyHandler( | 1587 void ObjectTemplate::SetNamedPropertyHandler( |
1578 NamedPropertyGetterCallback getter, NamedPropertySetterCallback setter, | 1588 NamedPropertyGetterCallback getter, NamedPropertySetterCallback setter, |
1579 NamedPropertyQueryCallback query, NamedPropertyDeleterCallback remover, | 1589 NamedPropertyQueryCallback query, NamedPropertyDeleterCallback remover, |
1580 NamedPropertyEnumeratorCallback enumerator, Local<Value> data) { | 1590 NamedPropertyEnumeratorCallback enumerator, Local<Value> data) { |
1581 ObjectTemplateSetNamedPropertyHandler( | 1591 ObjectTemplateSetNamedPropertyHandler( |
1582 this, getter, setter, query, remover, enumerator, data, | 1592 this, getter, setter, query, remover, enumerator, data, |
(...skipping 26 matching lines...) Expand all Loading... |
1609 i::HandleScope scope(isolate); | 1619 i::HandleScope scope(isolate); |
1610 auto cons = EnsureConstructor(isolate, this); | 1620 auto cons = EnsureConstructor(isolate, this); |
1611 EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetAccessCheckCallback"); | 1621 EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetAccessCheckCallback"); |
1612 | 1622 |
1613 i::Handle<i::Struct> struct_info = | 1623 i::Handle<i::Struct> struct_info = |
1614 isolate->factory()->NewStruct(i::ACCESS_CHECK_INFO_TYPE); | 1624 isolate->factory()->NewStruct(i::ACCESS_CHECK_INFO_TYPE); |
1615 i::Handle<i::AccessCheckInfo> info = | 1625 i::Handle<i::AccessCheckInfo> info = |
1616 i::Handle<i::AccessCheckInfo>::cast(struct_info); | 1626 i::Handle<i::AccessCheckInfo>::cast(struct_info); |
1617 | 1627 |
1618 SET_FIELD_WRAPPED(info, set_callback, callback); | 1628 SET_FIELD_WRAPPED(info, set_callback, callback); |
| 1629 info->set_named_interceptor(nullptr); |
| 1630 info->set_indexed_interceptor(nullptr); |
1619 | 1631 |
1620 if (data.IsEmpty()) { | 1632 if (data.IsEmpty()) { |
1621 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); | 1633 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); |
1622 } | 1634 } |
1623 info->set_data(*Utils::OpenHandle(*data)); | 1635 info->set_data(*Utils::OpenHandle(*data)); |
1624 | 1636 |
1625 cons->set_access_check_info(*info); | 1637 cons->set_access_check_info(*info); |
1626 cons->set_needs_access_check(true); | 1638 cons->set_needs_access_check(true); |
1627 } | 1639 } |
1628 | 1640 |
| 1641 void ObjectTemplate::SetAccessCheckCallbackAndHandler( |
| 1642 AccessCheckCallback callback, |
| 1643 const NamedPropertyHandlerConfiguration& named_handler, |
| 1644 const IndexedPropertyHandlerConfiguration& indexed_handler, |
| 1645 Local<Value> data) { |
| 1646 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
| 1647 ENTER_V8(isolate); |
| 1648 i::HandleScope scope(isolate); |
| 1649 auto cons = EnsureConstructor(isolate, this); |
| 1650 EnsureNotInstantiated( |
| 1651 cons, "v8::ObjectTemplate::SetAccessCheckCallbackWithHandler"); |
| 1652 |
| 1653 i::Handle<i::Struct> struct_info = |
| 1654 isolate->factory()->NewStruct(i::ACCESS_CHECK_INFO_TYPE); |
| 1655 i::Handle<i::AccessCheckInfo> info = |
| 1656 i::Handle<i::AccessCheckInfo>::cast(struct_info); |
| 1657 |
| 1658 SET_FIELD_WRAPPED(info, set_callback, callback); |
| 1659 info->set_named_interceptor(*CreateInterceptorInfo( |
| 1660 isolate, named_handler.getter, named_handler.setter, named_handler.query, |
| 1661 named_handler.deleter, named_handler.enumerator, named_handler.data, |
| 1662 named_handler.flags)); |
| 1663 info->set_indexed_interceptor(*CreateInterceptorInfo( |
| 1664 isolate, indexed_handler.getter, indexed_handler.setter, |
| 1665 indexed_handler.query, indexed_handler.deleter, |
| 1666 indexed_handler.enumerator, indexed_handler.data, indexed_handler.flags)); |
| 1667 |
| 1668 if (data.IsEmpty()) { |
| 1669 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); |
| 1670 } |
| 1671 info->set_data(*Utils::OpenHandle(*data)); |
| 1672 |
| 1673 cons->set_access_check_info(*info); |
| 1674 cons->set_needs_access_check(true); |
| 1675 } |
| 1676 |
1629 void ObjectTemplate::SetHandler( | 1677 void ObjectTemplate::SetHandler( |
1630 const IndexedPropertyHandlerConfiguration& config) { | 1678 const IndexedPropertyHandlerConfiguration& config) { |
1631 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 1679 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
1632 ENTER_V8(isolate); | 1680 ENTER_V8(isolate); |
1633 i::HandleScope scope(isolate); | 1681 i::HandleScope scope(isolate); |
1634 auto cons = EnsureConstructor(isolate, this); | 1682 auto cons = EnsureConstructor(isolate, this); |
1635 EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetHandler"); | 1683 EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetHandler"); |
1636 auto obj = i::Handle<i::InterceptorInfo>::cast( | 1684 auto obj = CreateInterceptorInfo( |
1637 isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE)); | 1685 isolate, config.getter, config.setter, config.query, config.deleter, |
1638 obj->set_flags(0); | 1686 config.enumerator, config.data, config.flags); |
1639 | |
1640 if (config.getter != 0) SET_FIELD_WRAPPED(obj, set_getter, config.getter); | |
1641 if (config.setter != 0) SET_FIELD_WRAPPED(obj, set_setter, config.setter); | |
1642 if (config.query != 0) SET_FIELD_WRAPPED(obj, set_query, config.query); | |
1643 if (config.deleter != 0) SET_FIELD_WRAPPED(obj, set_deleter, config.deleter); | |
1644 if (config.enumerator != 0) { | |
1645 SET_FIELD_WRAPPED(obj, set_enumerator, config.enumerator); | |
1646 } | |
1647 obj->set_all_can_read(static_cast<int>(config.flags) & | |
1648 static_cast<int>(PropertyHandlerFlags::kAllCanRead)); | |
1649 | |
1650 v8::Local<v8::Value> data = config.data; | |
1651 if (data.IsEmpty()) { | |
1652 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); | |
1653 } | |
1654 obj->set_data(*Utils::OpenHandle(*data)); | |
1655 cons->set_indexed_property_handler(*obj); | 1687 cons->set_indexed_property_handler(*obj); |
1656 } | 1688 } |
1657 | 1689 |
1658 | 1690 |
1659 void ObjectTemplate::SetCallAsFunctionHandler(FunctionCallback callback, | 1691 void ObjectTemplate::SetCallAsFunctionHandler(FunctionCallback callback, |
1660 Local<Value> data) { | 1692 Local<Value> data) { |
1661 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 1693 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
1662 ENTER_V8(isolate); | 1694 ENTER_V8(isolate); |
1663 i::HandleScope scope(isolate); | 1695 i::HandleScope scope(isolate); |
1664 auto cons = EnsureConstructor(isolate, this); | 1696 auto cons = EnsureConstructor(isolate, this); |
(...skipping 7213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8878 Address callback_address = | 8910 Address callback_address = |
8879 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 8911 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
8880 VMState<EXTERNAL> state(isolate); | 8912 VMState<EXTERNAL> state(isolate); |
8881 ExternalCallbackScope call_scope(isolate, callback_address); | 8913 ExternalCallbackScope call_scope(isolate, callback_address); |
8882 callback(info); | 8914 callback(info); |
8883 } | 8915 } |
8884 | 8916 |
8885 | 8917 |
8886 } // namespace internal | 8918 } // namespace internal |
8887 } // namespace v8 | 8919 } // namespace v8 |
OLD | NEW |