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

Side by Side Diff: src/api.cc

Issue 2272383002: [api] Add interceptor for defineProperty(). (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@DefineProperty
Patch Set: Query descriptor triggers on defineProperty(). Created 4 years, 3 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/api-arguments.h » ('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 1488 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 Deleter,
1509 typename Enumerator> 1509 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, Local<Value> data, 1512 Deleter remover, Enumerator enumerator, Definer definer, Local<Value> data,
1513 PropertyHandlerFlags flags) { 1513 PropertyHandlerFlags flags) {
1514 auto obj = i::Handle<i::InterceptorInfo>::cast( 1514 auto obj = i::Handle<i::InterceptorInfo>::cast(
1515 isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE)); 1515 isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE));
1516 obj->set_flags(0); 1516 obj->set_flags(0);
1517 1517
1518 if (getter != 0) SET_FIELD_WRAPPED(obj, set_getter, getter); 1518 if (getter != 0) SET_FIELD_WRAPPED(obj, set_getter, getter);
1519 if (setter != 0) SET_FIELD_WRAPPED(obj, set_setter, setter); 1519 if (setter != 0) SET_FIELD_WRAPPED(obj, set_setter, setter);
1520 if (query != 0) SET_FIELD_WRAPPED(obj, set_query, query); 1520 if (query != 0) SET_FIELD_WRAPPED(obj, set_query, query);
1521 if (remover != 0) SET_FIELD_WRAPPED(obj, set_deleter, remover); 1521 if (remover != 0) SET_FIELD_WRAPPED(obj, set_deleter, remover);
1522 if (enumerator != 0) SET_FIELD_WRAPPED(obj, set_enumerator, enumerator); 1522 if (enumerator != 0) SET_FIELD_WRAPPED(obj, set_enumerator, enumerator);
1523 if (definer != 0) SET_FIELD_WRAPPED(obj, set_definer, definer);
1523 obj->set_can_intercept_symbols( 1524 obj->set_can_intercept_symbols(
1524 !(static_cast<int>(flags) & 1525 !(static_cast<int>(flags) &
1525 static_cast<int>(PropertyHandlerFlags::kOnlyInterceptStrings))); 1526 static_cast<int>(PropertyHandlerFlags::kOnlyInterceptStrings)));
1526 obj->set_all_can_read(static_cast<int>(flags) & 1527 obj->set_all_can_read(static_cast<int>(flags) &
1527 static_cast<int>(PropertyHandlerFlags::kAllCanRead)); 1528 static_cast<int>(PropertyHandlerFlags::kAllCanRead));
1528 obj->set_non_masking(static_cast<int>(flags) & 1529 obj->set_non_masking(static_cast<int>(flags) &
1529 static_cast<int>(PropertyHandlerFlags::kNonMasking)); 1530 static_cast<int>(PropertyHandlerFlags::kNonMasking));
1530 1531
1531 if (data.IsEmpty()) { 1532 if (data.IsEmpty()) {
1532 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 1533 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
1533 } 1534 }
1534 obj->set_data(*Utils::OpenHandle(*data)); 1535 obj->set_data(*Utils::OpenHandle(*data));
1535 return obj; 1536 return obj;
1536 } 1537 }
1537 1538
1538 template <typename Getter, typename Setter, typename Query, typename Deleter, 1539 template <typename Getter, typename Setter, typename Query, typename Deleter,
1539 typename Enumerator> 1540 typename Enumerator, typename Definer>
1540 static void ObjectTemplateSetNamedPropertyHandler(ObjectTemplate* templ, 1541 static void ObjectTemplateSetNamedPropertyHandler(
1541 Getter getter, Setter setter, 1542 ObjectTemplate* templ, Getter getter, Setter setter, Query query,
1542 Query query, Deleter remover, 1543 Deleter remover, Enumerator enumerator, Definer definer, Local<Value> data,
1543 Enumerator enumerator, 1544 PropertyHandlerFlags flags) {
1544 Local<Value> data,
1545 PropertyHandlerFlags flags) {
1546 i::Isolate* isolate = Utils::OpenHandle(templ)->GetIsolate(); 1545 i::Isolate* isolate = Utils::OpenHandle(templ)->GetIsolate();
1547 ENTER_V8(isolate); 1546 ENTER_V8(isolate);
1548 i::HandleScope scope(isolate); 1547 i::HandleScope scope(isolate);
1549 auto cons = EnsureConstructor(isolate, templ); 1548 auto cons = EnsureConstructor(isolate, templ);
1550 EnsureNotInstantiated(cons, "ObjectTemplateSetNamedPropertyHandler"); 1549 EnsureNotInstantiated(cons, "ObjectTemplateSetNamedPropertyHandler");
1551 auto obj = CreateInterceptorInfo(isolate, getter, setter, query, remover, 1550 auto obj = CreateInterceptorInfo(isolate, getter, setter, query, remover,
1552 enumerator, data, flags); 1551 enumerator, definer, data, flags);
1553 cons->set_named_property_handler(*obj); 1552 cons->set_named_property_handler(*obj);
1554 } 1553 }
1555 1554
1556
1557 void ObjectTemplate::SetNamedPropertyHandler( 1555 void ObjectTemplate::SetNamedPropertyHandler(
1558 NamedPropertyGetterCallback getter, NamedPropertySetterCallback setter, 1556 NamedPropertyGetterCallback getter, NamedPropertySetterCallback setter,
1559 NamedPropertyQueryCallback query, NamedPropertyDeleterCallback remover, 1557 NamedPropertyQueryCallback query, NamedPropertyDeleterCallback remover,
1560 NamedPropertyEnumeratorCallback enumerator, Local<Value> data) { 1558 NamedPropertyEnumeratorCallback enumerator, Local<Value> data) {
1561 ObjectTemplateSetNamedPropertyHandler( 1559 ObjectTemplateSetNamedPropertyHandler(
1562 this, getter, setter, query, remover, enumerator, data, 1560 this, getter, setter, query, remover, enumerator, nullptr, data,
1563 PropertyHandlerFlags::kOnlyInterceptStrings); 1561 PropertyHandlerFlags::kOnlyInterceptStrings);
1564 } 1562 }
1565 1563
1566
1567 void ObjectTemplate::SetHandler( 1564 void ObjectTemplate::SetHandler(
1568 const NamedPropertyHandlerConfiguration& config) { 1565 const NamedPropertyHandlerConfiguration& config) {
1569 ObjectTemplateSetNamedPropertyHandler( 1566 ObjectTemplateSetNamedPropertyHandler(
1570 this, config.getter, config.setter, config.query, config.deleter, 1567 this, config.getter, config.setter, config.query, config.deleter,
1571 config.enumerator, config.data, config.flags); 1568 config.enumerator, config.definer, config.data, config.flags);
1572 } 1569 }
1573 1570
1574 1571
1575 void ObjectTemplate::MarkAsUndetectable() { 1572 void ObjectTemplate::MarkAsUndetectable() {
1576 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 1573 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
1577 ENTER_V8(isolate); 1574 ENTER_V8(isolate);
1578 i::HandleScope scope(isolate); 1575 i::HandleScope scope(isolate);
1579 auto cons = EnsureConstructor(isolate, this); 1576 auto cons = EnsureConstructor(isolate, this);
1580 EnsureNotInstantiated(cons, "v8::ObjectTemplate::MarkAsUndetectable"); 1577 EnsureNotInstantiated(cons, "v8::ObjectTemplate::MarkAsUndetectable");
1581 cons->set_undetectable(true); 1578 cons->set_undetectable(true);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1621 cons, "v8::ObjectTemplate::SetAccessCheckCallbackWithHandler"); 1618 cons, "v8::ObjectTemplate::SetAccessCheckCallbackWithHandler");
1622 1619
1623 i::Handle<i::Struct> struct_info = 1620 i::Handle<i::Struct> struct_info =
1624 isolate->factory()->NewStruct(i::ACCESS_CHECK_INFO_TYPE); 1621 isolate->factory()->NewStruct(i::ACCESS_CHECK_INFO_TYPE);
1625 i::Handle<i::AccessCheckInfo> info = 1622 i::Handle<i::AccessCheckInfo> info =
1626 i::Handle<i::AccessCheckInfo>::cast(struct_info); 1623 i::Handle<i::AccessCheckInfo>::cast(struct_info);
1627 1624
1628 SET_FIELD_WRAPPED(info, set_callback, callback); 1625 SET_FIELD_WRAPPED(info, set_callback, callback);
1629 auto named_interceptor = CreateInterceptorInfo( 1626 auto named_interceptor = CreateInterceptorInfo(
1630 isolate, named_handler.getter, named_handler.setter, named_handler.query, 1627 isolate, named_handler.getter, named_handler.setter, named_handler.query,
1631 named_handler.deleter, named_handler.enumerator, named_handler.data, 1628 named_handler.deleter, named_handler.enumerator, named_handler.definer,
1632 named_handler.flags); 1629 named_handler.data, named_handler.flags);
1633 info->set_named_interceptor(*named_interceptor); 1630 info->set_named_interceptor(*named_interceptor);
1634 auto indexed_interceptor = CreateInterceptorInfo( 1631 auto indexed_interceptor = CreateInterceptorInfo(
1635 isolate, indexed_handler.getter, indexed_handler.setter, 1632 isolate, indexed_handler.getter, indexed_handler.setter,
1636 indexed_handler.query, indexed_handler.deleter, 1633 indexed_handler.query, indexed_handler.deleter,
1637 indexed_handler.enumerator, indexed_handler.data, indexed_handler.flags); 1634 indexed_handler.enumerator, indexed_handler.definer, indexed_handler.data,
1635 indexed_handler.flags);
1638 info->set_indexed_interceptor(*indexed_interceptor); 1636 info->set_indexed_interceptor(*indexed_interceptor);
1639 1637
1640 if (data.IsEmpty()) { 1638 if (data.IsEmpty()) {
1641 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 1639 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
1642 } 1640 }
1643 info->set_data(*Utils::OpenHandle(*data)); 1641 info->set_data(*Utils::OpenHandle(*data));
1644 1642
1645 cons->set_access_check_info(*info); 1643 cons->set_access_check_info(*info);
1646 cons->set_needs_access_check(true); 1644 cons->set_needs_access_check(true);
1647 } 1645 }
1648 1646
1649 void ObjectTemplate::SetHandler( 1647 void ObjectTemplate::SetHandler(
1650 const IndexedPropertyHandlerConfiguration& config) { 1648 const IndexedPropertyHandlerConfiguration& config) {
1651 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 1649 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
1652 ENTER_V8(isolate); 1650 ENTER_V8(isolate);
1653 i::HandleScope scope(isolate); 1651 i::HandleScope scope(isolate);
1654 auto cons = EnsureConstructor(isolate, this); 1652 auto cons = EnsureConstructor(isolate, this);
1655 EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetHandler"); 1653 EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetHandler");
1656 auto obj = CreateInterceptorInfo( 1654 auto obj = CreateInterceptorInfo(
1657 isolate, config.getter, config.setter, config.query, config.deleter, 1655 isolate, config.getter, config.setter, config.query, config.deleter,
1658 config.enumerator, config.data, config.flags); 1656 config.enumerator, config.definer, config.data, config.flags);
1659 cons->set_indexed_property_handler(*obj); 1657 cons->set_indexed_property_handler(*obj);
1660 } 1658 }
1661 1659
1662 1660
1663 void ObjectTemplate::SetCallAsFunctionHandler(FunctionCallback callback, 1661 void ObjectTemplate::SetCallAsFunctionHandler(FunctionCallback callback,
1664 Local<Value> data) { 1662 Local<Value> data) {
1665 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 1663 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
1666 ENTER_V8(isolate); 1664 ENTER_V8(isolate);
1667 i::HandleScope scope(isolate); 1665 i::HandleScope scope(isolate);
1668 auto cons = EnsureConstructor(isolate, this); 1666 auto cons = EnsureConstructor(isolate, this);
(...skipping 7537 matching lines...) Expand 10 before | Expand all | Expand 10 after
9206 Address callback_address = 9204 Address callback_address =
9207 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 9205 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
9208 VMState<EXTERNAL> state(isolate); 9206 VMState<EXTERNAL> state(isolate);
9209 ExternalCallbackScope call_scope(isolate, callback_address); 9207 ExternalCallbackScope call_scope(isolate, callback_address);
9210 callback(info); 9208 callback(info);
9211 } 9209 }
9212 9210
9213 9211
9214 } // namespace internal 9212 } // namespace internal
9215 } // namespace v8 9213 } // namespace v8
OLDNEW
« no previous file with comments | « include/v8.h ('k') | src/api-arguments.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698