Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(569)

Side by Side Diff: src/api.cc

Issue 2087823002: Optionally invoke an interceptor on failed access checks (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: updates Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « include/v8.h ('k') | src/isolate.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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 auto 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_named_interceptor(*named_interceptor);
1664 auto indexed_interceptor = CreateInterceptorInfo(
1665 isolate, indexed_handler.getter, indexed_handler.setter,
1666 indexed_handler.query, indexed_handler.deleter,
1667 indexed_handler.enumerator, indexed_handler.data, indexed_handler.flags);
1668 info->set_indexed_interceptor(*indexed_interceptor);
1669
1670 if (data.IsEmpty()) {
1671 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
1672 }
1673 info->set_data(*Utils::OpenHandle(*data));
1674
1675 cons->set_access_check_info(*info);
1676 cons->set_needs_access_check(true);
1677 }
1678
1629 void ObjectTemplate::SetHandler( 1679 void ObjectTemplate::SetHandler(
1630 const IndexedPropertyHandlerConfiguration& config) { 1680 const IndexedPropertyHandlerConfiguration& config) {
1631 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 1681 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
1632 ENTER_V8(isolate); 1682 ENTER_V8(isolate);
1633 i::HandleScope scope(isolate); 1683 i::HandleScope scope(isolate);
1634 auto cons = EnsureConstructor(isolate, this); 1684 auto cons = EnsureConstructor(isolate, this);
1635 EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetHandler"); 1685 EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetHandler");
1636 auto obj = i::Handle<i::InterceptorInfo>::cast( 1686 auto obj = CreateInterceptorInfo(
1637 isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE)); 1687 isolate, config.getter, config.setter, config.query, config.deleter,
1638 obj->set_flags(0); 1688 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); 1689 cons->set_indexed_property_handler(*obj);
1656 } 1690 }
1657 1691
1658 1692
1659 void ObjectTemplate::SetCallAsFunctionHandler(FunctionCallback callback, 1693 void ObjectTemplate::SetCallAsFunctionHandler(FunctionCallback callback,
1660 Local<Value> data) { 1694 Local<Value> data) {
1661 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 1695 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
1662 ENTER_V8(isolate); 1696 ENTER_V8(isolate);
1663 i::HandleScope scope(isolate); 1697 i::HandleScope scope(isolate);
1664 auto cons = EnsureConstructor(isolate, this); 1698 auto cons = EnsureConstructor(isolate, this);
(...skipping 7213 matching lines...) Expand 10 before | Expand all | Expand 10 after
8878 Address callback_address = 8912 Address callback_address =
8879 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 8913 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
8880 VMState<EXTERNAL> state(isolate); 8914 VMState<EXTERNAL> state(isolate);
8881 ExternalCallbackScope call_scope(isolate, callback_address); 8915 ExternalCallbackScope call_scope(isolate, callback_address);
8882 callback(info); 8916 callback(info);
8883 } 8917 }
8884 8918
8885 8919
8886 } // namespace internal 8920 } // namespace internal
8887 } // namespace v8 8921 } // namespace v8
OLDNEW
« no previous file with comments | « include/v8.h ('k') | src/isolate.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698