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