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

Side by Side Diff: src/api.cc

Issue 2311873002: [api] Add interceptor for getOwnPropertyDescriptor(). (Closed)
Patch Set: Rename and comments. 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/counters.h » ('j') | src/objects.cc » ('J')
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 1487 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
OLDNEW
« no previous file with comments | « include/v8.h ('k') | src/counters.h » ('j') | src/objects.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698