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

Side by Side Diff: src/api.cc

Issue 2311873002: [api] Add interceptor for getOwnPropertyDescriptor(). (Closed)
Patch Set: Crash instead of exception on invalid descriptor. 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') | 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 1484 matching lines...) Expand 10 before | Expand all | Expand 10 after
1495 void ObjectTemplate::SetAccessor(v8::Local<Name> name, 1495 void ObjectTemplate::SetAccessor(v8::Local<Name> name,
1496 AccessorNameGetterCallback getter, 1496 AccessorNameGetterCallback getter,
1497 AccessorNameSetterCallback setter, 1497 AccessorNameSetterCallback setter,
1498 v8::Local<Value> data, AccessControl settings, 1498 v8::Local<Value> data, AccessControl settings,
1499 PropertyAttribute attribute, 1499 PropertyAttribute attribute,
1500 v8::Local<AccessorSignature> signature) { 1500 v8::Local<AccessorSignature> signature) {
1501 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute, 1501 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute,
1502 signature, i::FLAG_disable_old_api_accessors); 1502 signature, i::FLAG_disable_old_api_accessors);
1503 } 1503 }
1504 1504
1505 template <typename Getter, typename Setter, typename Query, typename Deleter, 1505 template <typename Getter, typename Setter, typename Query, typename Descriptor,
1506 typename Enumerator, typename Definer> 1506 typename Deleter, typename Enumerator, typename Definer>
1507 static i::Handle<i::InterceptorInfo> CreateInterceptorInfo( 1507 static i::Handle<i::InterceptorInfo> CreateInterceptorInfo(
1508 i::Isolate* isolate, Getter getter, Setter setter, Query query, 1508 i::Isolate* isolate, Getter getter, Setter setter, Query query,
1509 Deleter remover, Enumerator enumerator, Definer definer, Local<Value> data, 1509 Descriptor descriptor, Deleter remover, Enumerator enumerator,
1510 PropertyHandlerFlags flags) { 1510 Definer definer, Local<Value> data, PropertyHandlerFlags flags) {
1511 DCHECK(query == nullptr ||
1512 descriptor == nullptr); // Either intercept attributes or descriptor.
1513 DCHECK(query == nullptr ||
1514 definer ==
1515 nullptr); // Only use descriptor callback with definer callback.
1511 auto obj = i::Handle<i::InterceptorInfo>::cast( 1516 auto obj = i::Handle<i::InterceptorInfo>::cast(
1512 isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE)); 1517 isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE));
1513 obj->set_flags(0); 1518 obj->set_flags(0);
1514 1519
1515 if (getter != 0) SET_FIELD_WRAPPED(obj, set_getter, getter); 1520 if (getter != 0) SET_FIELD_WRAPPED(obj, set_getter, getter);
1516 if (setter != 0) SET_FIELD_WRAPPED(obj, set_setter, setter); 1521 if (setter != 0) SET_FIELD_WRAPPED(obj, set_setter, setter);
1517 if (query != 0) SET_FIELD_WRAPPED(obj, set_query, query); 1522 if (query != 0) SET_FIELD_WRAPPED(obj, set_query, query);
1523 if (descriptor != 0) SET_FIELD_WRAPPED(obj, set_descriptor, descriptor);
1518 if (remover != 0) SET_FIELD_WRAPPED(obj, set_deleter, remover); 1524 if (remover != 0) SET_FIELD_WRAPPED(obj, set_deleter, remover);
1519 if (enumerator != 0) SET_FIELD_WRAPPED(obj, set_enumerator, enumerator); 1525 if (enumerator != 0) SET_FIELD_WRAPPED(obj, set_enumerator, enumerator);
1520 if (definer != 0) SET_FIELD_WRAPPED(obj, set_definer, definer); 1526 if (definer != 0) SET_FIELD_WRAPPED(obj, set_definer, definer);
1521 obj->set_can_intercept_symbols( 1527 obj->set_can_intercept_symbols(
1522 !(static_cast<int>(flags) & 1528 !(static_cast<int>(flags) &
1523 static_cast<int>(PropertyHandlerFlags::kOnlyInterceptStrings))); 1529 static_cast<int>(PropertyHandlerFlags::kOnlyInterceptStrings)));
1524 obj->set_all_can_read(static_cast<int>(flags) & 1530 obj->set_all_can_read(static_cast<int>(flags) &
1525 static_cast<int>(PropertyHandlerFlags::kAllCanRead)); 1531 static_cast<int>(PropertyHandlerFlags::kAllCanRead));
1526 obj->set_non_masking(static_cast<int>(flags) & 1532 obj->set_non_masking(static_cast<int>(flags) &
1527 static_cast<int>(PropertyHandlerFlags::kNonMasking)); 1533 static_cast<int>(PropertyHandlerFlags::kNonMasking));
1528 1534
1529 if (data.IsEmpty()) { 1535 if (data.IsEmpty()) {
1530 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 1536 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
1531 } 1537 }
1532 obj->set_data(*Utils::OpenHandle(*data)); 1538 obj->set_data(*Utils::OpenHandle(*data));
1533 return obj; 1539 return obj;
1534 } 1540 }
1535 1541
1536 template <typename Getter, typename Setter, typename Query, typename Deleter, 1542 template <typename Getter, typename Setter, typename Query, typename Descriptor,
1537 typename Enumerator, typename Definer> 1543 typename Deleter, typename Enumerator, typename Definer>
1538 static void ObjectTemplateSetNamedPropertyHandler( 1544 static void ObjectTemplateSetNamedPropertyHandler(
1539 ObjectTemplate* templ, Getter getter, Setter setter, Query query, 1545 ObjectTemplate* templ, Getter getter, Setter setter, Query query,
1540 Deleter remover, Enumerator enumerator, Definer definer, Local<Value> data, 1546 Descriptor descriptor, Deleter remover, Enumerator enumerator,
1541 PropertyHandlerFlags flags) { 1547 Definer definer, Local<Value> data, PropertyHandlerFlags flags) {
1542 i::Isolate* isolate = Utils::OpenHandle(templ)->GetIsolate(); 1548 i::Isolate* isolate = Utils::OpenHandle(templ)->GetIsolate();
1543 ENTER_V8(isolate); 1549 ENTER_V8(isolate);
1544 i::HandleScope scope(isolate); 1550 i::HandleScope scope(isolate);
1545 auto cons = EnsureConstructor(isolate, templ); 1551 auto cons = EnsureConstructor(isolate, templ);
1546 EnsureNotInstantiated(cons, "ObjectTemplateSetNamedPropertyHandler"); 1552 EnsureNotInstantiated(cons, "ObjectTemplateSetNamedPropertyHandler");
1547 auto obj = CreateInterceptorInfo(isolate, getter, setter, query, remover, 1553 auto obj = CreateInterceptorInfo(isolate, getter, setter, query, descriptor,
1548 enumerator, definer, data, flags); 1554 remover, enumerator, definer, data, flags);
1549 cons->set_named_property_handler(*obj); 1555 cons->set_named_property_handler(*obj);
1550 } 1556 }
1551 1557
1552 void ObjectTemplate::SetNamedPropertyHandler( 1558 void ObjectTemplate::SetNamedPropertyHandler(
1553 NamedPropertyGetterCallback getter, NamedPropertySetterCallback setter, 1559 NamedPropertyGetterCallback getter, NamedPropertySetterCallback setter,
1554 NamedPropertyQueryCallback query, NamedPropertyDeleterCallback remover, 1560 NamedPropertyQueryCallback query, NamedPropertyDeleterCallback remover,
1555 NamedPropertyEnumeratorCallback enumerator, Local<Value> data) { 1561 NamedPropertyEnumeratorCallback enumerator, Local<Value> data) {
1556 ObjectTemplateSetNamedPropertyHandler( 1562 ObjectTemplateSetNamedPropertyHandler(
1557 this, getter, setter, query, remover, enumerator, nullptr, data, 1563 this, getter, setter, query, nullptr, remover, enumerator, nullptr, data,
1558 PropertyHandlerFlags::kOnlyInterceptStrings); 1564 PropertyHandlerFlags::kOnlyInterceptStrings);
1559 } 1565 }
1560 1566
1561 void ObjectTemplate::SetHandler( 1567 void ObjectTemplate::SetHandler(
1562 const NamedPropertyHandlerConfiguration& config) { 1568 const NamedPropertyHandlerConfiguration& config) {
1563 ObjectTemplateSetNamedPropertyHandler( 1569 ObjectTemplateSetNamedPropertyHandler(
1564 this, config.getter, config.setter, config.query, config.deleter, 1570 this, config.getter, config.setter, config.query, config.descriptor,
1565 config.enumerator, config.definer, config.data, config.flags); 1571 config.deleter, config.enumerator, config.definer, config.data,
1572 config.flags);
1566 } 1573 }
1567 1574
1568 1575
1569 void ObjectTemplate::MarkAsUndetectable() { 1576 void ObjectTemplate::MarkAsUndetectable() {
1570 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 1577 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
1571 ENTER_V8(isolate); 1578 ENTER_V8(isolate);
1572 i::HandleScope scope(isolate); 1579 i::HandleScope scope(isolate);
1573 auto cons = EnsureConstructor(isolate, this); 1580 auto cons = EnsureConstructor(isolate, this);
1574 EnsureNotInstantiated(cons, "v8::ObjectTemplate::MarkAsUndetectable"); 1581 EnsureNotInstantiated(cons, "v8::ObjectTemplate::MarkAsUndetectable");
1575 cons->set_undetectable(true); 1582 cons->set_undetectable(true);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1615 cons, "v8::ObjectTemplate::SetAccessCheckCallbackWithHandler"); 1622 cons, "v8::ObjectTemplate::SetAccessCheckCallbackWithHandler");
1616 1623
1617 i::Handle<i::Struct> struct_info = 1624 i::Handle<i::Struct> struct_info =
1618 isolate->factory()->NewStruct(i::ACCESS_CHECK_INFO_TYPE); 1625 isolate->factory()->NewStruct(i::ACCESS_CHECK_INFO_TYPE);
1619 i::Handle<i::AccessCheckInfo> info = 1626 i::Handle<i::AccessCheckInfo> info =
1620 i::Handle<i::AccessCheckInfo>::cast(struct_info); 1627 i::Handle<i::AccessCheckInfo>::cast(struct_info);
1621 1628
1622 SET_FIELD_WRAPPED(info, set_callback, callback); 1629 SET_FIELD_WRAPPED(info, set_callback, callback);
1623 auto named_interceptor = CreateInterceptorInfo( 1630 auto named_interceptor = CreateInterceptorInfo(
1624 isolate, named_handler.getter, named_handler.setter, named_handler.query, 1631 isolate, named_handler.getter, named_handler.setter, named_handler.query,
1625 named_handler.deleter, named_handler.enumerator, named_handler.definer, 1632 named_handler.descriptor, named_handler.deleter, named_handler.enumerator,
1626 named_handler.data, named_handler.flags); 1633 named_handler.definer, named_handler.data, named_handler.flags);
1627 info->set_named_interceptor(*named_interceptor); 1634 info->set_named_interceptor(*named_interceptor);
1628 auto indexed_interceptor = CreateInterceptorInfo( 1635 auto indexed_interceptor = CreateInterceptorInfo(
1629 isolate, indexed_handler.getter, indexed_handler.setter, 1636 isolate, indexed_handler.getter, indexed_handler.setter,
1630 indexed_handler.query, indexed_handler.deleter, 1637 indexed_handler.query, indexed_handler.descriptor,
1631 indexed_handler.enumerator, indexed_handler.definer, indexed_handler.data, 1638 indexed_handler.deleter, indexed_handler.enumerator,
1632 indexed_handler.flags); 1639 indexed_handler.definer, indexed_handler.data, indexed_handler.flags);
1633 info->set_indexed_interceptor(*indexed_interceptor); 1640 info->set_indexed_interceptor(*indexed_interceptor);
1634 1641
1635 if (data.IsEmpty()) { 1642 if (data.IsEmpty()) {
1636 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 1643 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
1637 } 1644 }
1638 info->set_data(*Utils::OpenHandle(*data)); 1645 info->set_data(*Utils::OpenHandle(*data));
1639 1646
1640 cons->set_access_check_info(*info); 1647 cons->set_access_check_info(*info);
1641 cons->set_needs_access_check(true); 1648 cons->set_needs_access_check(true);
1642 } 1649 }
1643 1650
1644 void ObjectTemplate::SetHandler( 1651 void ObjectTemplate::SetHandler(
1645 const IndexedPropertyHandlerConfiguration& config) { 1652 const IndexedPropertyHandlerConfiguration& config) {
1646 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 1653 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
1647 ENTER_V8(isolate); 1654 ENTER_V8(isolate);
1648 i::HandleScope scope(isolate); 1655 i::HandleScope scope(isolate);
1649 auto cons = EnsureConstructor(isolate, this); 1656 auto cons = EnsureConstructor(isolate, this);
1650 EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetHandler"); 1657 EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetHandler");
1651 auto obj = CreateInterceptorInfo( 1658 auto obj = CreateInterceptorInfo(isolate, config.getter, config.setter,
1652 isolate, config.getter, config.setter, config.query, config.deleter, 1659 config.query, config.descriptor,
1653 config.enumerator, config.definer, config.data, config.flags); 1660 config.deleter, config.enumerator,
1661 config.definer, config.data, config.flags);
1654 cons->set_indexed_property_handler(*obj); 1662 cons->set_indexed_property_handler(*obj);
1655 } 1663 }
1656 1664
1657 1665
1658 void ObjectTemplate::SetCallAsFunctionHandler(FunctionCallback callback, 1666 void ObjectTemplate::SetCallAsFunctionHandler(FunctionCallback callback,
1659 Local<Value> data) { 1667 Local<Value> data) {
1660 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 1668 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
1661 ENTER_V8(isolate); 1669 ENTER_V8(isolate);
1662 i::HandleScope scope(isolate); 1670 i::HandleScope scope(isolate);
1663 auto cons = EnsureConstructor(isolate, this); 1671 auto cons = EnsureConstructor(isolate, this);
(...skipping 7558 matching lines...) Expand 10 before | Expand all | Expand 10 after
9222 Address callback_address = 9230 Address callback_address =
9223 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 9231 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
9224 VMState<EXTERNAL> state(isolate); 9232 VMState<EXTERNAL> state(isolate);
9225 ExternalCallbackScope call_scope(isolate, callback_address); 9233 ExternalCallbackScope call_scope(isolate, callback_address);
9226 callback(info); 9234 callback(info);
9227 } 9235 }
9228 9236
9229 9237
9230 } // namespace internal 9238 } // namespace internal
9231 } // namespace v8 9239 } // namespace v8
OLDNEW
« no previous file with comments | « include/v8.h ('k') | src/counters.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698