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

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: Add test for intercepting Object.freeze(). 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') | 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 1486 matching lines...) Expand 10 before | Expand all | Expand 10 after
1497 AccessorNameGetterCallback getter, 1497 AccessorNameGetterCallback getter,
1498 AccessorNameSetterCallback setter, 1498 AccessorNameSetterCallback setter,
1499 v8::Local<Value> data, AccessControl settings, 1499 v8::Local<Value> data, AccessControl settings,
1500 PropertyAttribute attribute, 1500 PropertyAttribute attribute,
1501 v8::Local<AccessorSignature> signature) { 1501 v8::Local<AccessorSignature> signature) {
1502 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute, 1502 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute,
1503 signature, i::FLAG_disable_old_api_accessors); 1503 signature, i::FLAG_disable_old_api_accessors);
1504 } 1504 }
1505 1505
1506 template <typename Getter, typename Setter, typename Query, typename Deleter, 1506 template <typename Getter, typename Setter, typename Query, typename Deleter,
1507 typename Enumerator> 1507 typename Enumerator, typename Definer>
1508 static i::Handle<i::InterceptorInfo> CreateInterceptorInfo( 1508 static i::Handle<i::InterceptorInfo> CreateInterceptorInfo(
1509 i::Isolate* isolate, Getter getter, Setter setter, Query query, 1509 i::Isolate* isolate, Getter getter, Setter setter, Query query,
1510 Deleter remover, Enumerator enumerator, Local<Value> data, 1510 Deleter remover, Enumerator enumerator, Definer definer, Local<Value> data,
1511 PropertyHandlerFlags flags) { 1511 PropertyHandlerFlags flags) {
1512 auto obj = i::Handle<i::InterceptorInfo>::cast( 1512 auto obj = i::Handle<i::InterceptorInfo>::cast(
1513 isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE)); 1513 isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE));
1514 obj->set_flags(0); 1514 obj->set_flags(0);
1515 1515
1516 if (getter != 0) SET_FIELD_WRAPPED(obj, set_getter, getter); 1516 if (getter != 0) SET_FIELD_WRAPPED(obj, set_getter, getter);
1517 if (setter != 0) SET_FIELD_WRAPPED(obj, set_setter, setter); 1517 if (setter != 0) SET_FIELD_WRAPPED(obj, set_setter, setter);
1518 if (query != 0) SET_FIELD_WRAPPED(obj, set_query, query); 1518 if (query != 0) SET_FIELD_WRAPPED(obj, set_query, query);
1519 if (remover != 0) SET_FIELD_WRAPPED(obj, set_deleter, remover); 1519 if (remover != 0) SET_FIELD_WRAPPED(obj, set_deleter, remover);
1520 if (enumerator != 0) SET_FIELD_WRAPPED(obj, set_enumerator, enumerator); 1520 if (enumerator != 0) SET_FIELD_WRAPPED(obj, set_enumerator, enumerator);
1521 if (definer != 0) SET_FIELD_WRAPPED(obj, set_definer, definer);
1521 obj->set_can_intercept_symbols( 1522 obj->set_can_intercept_symbols(
1522 !(static_cast<int>(flags) & 1523 !(static_cast<int>(flags) &
1523 static_cast<int>(PropertyHandlerFlags::kOnlyInterceptStrings))); 1524 static_cast<int>(PropertyHandlerFlags::kOnlyInterceptStrings)));
1524 obj->set_all_can_read(static_cast<int>(flags) & 1525 obj->set_all_can_read(static_cast<int>(flags) &
1525 static_cast<int>(PropertyHandlerFlags::kAllCanRead)); 1526 static_cast<int>(PropertyHandlerFlags::kAllCanRead));
1526 obj->set_non_masking(static_cast<int>(flags) & 1527 obj->set_non_masking(static_cast<int>(flags) &
1527 static_cast<int>(PropertyHandlerFlags::kNonMasking)); 1528 static_cast<int>(PropertyHandlerFlags::kNonMasking));
1528 1529
1529 if (data.IsEmpty()) { 1530 if (data.IsEmpty()) {
1530 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 1531 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
1531 } 1532 }
1532 obj->set_data(*Utils::OpenHandle(*data)); 1533 obj->set_data(*Utils::OpenHandle(*data));
1533 return obj; 1534 return obj;
1534 } 1535 }
1535 1536
1536 template <typename Getter, typename Setter, typename Query, typename Deleter, 1537 template <typename Getter, typename Setter, typename Query, typename Deleter,
1537 typename Enumerator> 1538 typename Enumerator, typename Definer>
1538 static void ObjectTemplateSetNamedPropertyHandler(ObjectTemplate* templ, 1539 static void ObjectTemplateSetNamedPropertyHandler(
1539 Getter getter, Setter setter, 1540 ObjectTemplate* templ, Getter getter, Setter setter, Query query,
1540 Query query, Deleter remover, 1541 Deleter remover, Enumerator enumerator, Definer definer, Local<Value> data,
1541 Enumerator enumerator, 1542 PropertyHandlerFlags flags) {
1542 Local<Value> data,
1543 PropertyHandlerFlags flags) {
1544 i::Isolate* isolate = Utils::OpenHandle(templ)->GetIsolate(); 1543 i::Isolate* isolate = Utils::OpenHandle(templ)->GetIsolate();
1545 ENTER_V8(isolate); 1544 ENTER_V8(isolate);
1546 i::HandleScope scope(isolate); 1545 i::HandleScope scope(isolate);
1547 auto cons = EnsureConstructor(isolate, templ); 1546 auto cons = EnsureConstructor(isolate, templ);
1548 EnsureNotInstantiated(cons, "ObjectTemplateSetNamedPropertyHandler"); 1547 EnsureNotInstantiated(cons, "ObjectTemplateSetNamedPropertyHandler");
1549 auto obj = CreateInterceptorInfo(isolate, getter, setter, query, remover, 1548 auto obj = CreateInterceptorInfo(isolate, getter, setter, query, remover,
1550 enumerator, data, flags); 1549 enumerator, definer, data, flags);
1551 cons->set_named_property_handler(*obj); 1550 cons->set_named_property_handler(*obj);
1552 } 1551 }
1553 1552
1554
1555 void ObjectTemplate::SetNamedPropertyHandler( 1553 void ObjectTemplate::SetNamedPropertyHandler(
1556 NamedPropertyGetterCallback getter, NamedPropertySetterCallback setter, 1554 NamedPropertyGetterCallback getter, NamedPropertySetterCallback setter,
1557 NamedPropertyQueryCallback query, NamedPropertyDeleterCallback remover, 1555 NamedPropertyQueryCallback query, NamedPropertyDeleterCallback remover,
1558 NamedPropertyEnumeratorCallback enumerator, Local<Value> data) { 1556 NamedPropertyEnumeratorCallback enumerator, Local<Value> data) {
1559 ObjectTemplateSetNamedPropertyHandler( 1557 ObjectTemplateSetNamedPropertyHandler(
1560 this, getter, setter, query, remover, enumerator, data, 1558 this, getter, setter, query, remover, enumerator, nullptr, data,
1561 PropertyHandlerFlags::kOnlyInterceptStrings); 1559 PropertyHandlerFlags::kOnlyInterceptStrings);
1562 } 1560 }
1563 1561
1564
1565 void ObjectTemplate::SetHandler( 1562 void ObjectTemplate::SetHandler(
1566 const NamedPropertyHandlerConfiguration& config) { 1563 const NamedPropertyHandlerConfiguration& config) {
1567 ObjectTemplateSetNamedPropertyHandler( 1564 ObjectTemplateSetNamedPropertyHandler(
1568 this, config.getter, config.setter, config.query, config.deleter, 1565 this, config.getter, config.setter, config.query, config.deleter,
1569 config.enumerator, config.data, config.flags); 1566 config.enumerator, config.definer, config.data, config.flags);
1570 } 1567 }
1571 1568
1572 1569
1573 void ObjectTemplate::MarkAsUndetectable() { 1570 void ObjectTemplate::MarkAsUndetectable() {
1574 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 1571 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
1575 ENTER_V8(isolate); 1572 ENTER_V8(isolate);
1576 i::HandleScope scope(isolate); 1573 i::HandleScope scope(isolate);
1577 auto cons = EnsureConstructor(isolate, this); 1574 auto cons = EnsureConstructor(isolate, this);
1578 EnsureNotInstantiated(cons, "v8::ObjectTemplate::MarkAsUndetectable"); 1575 EnsureNotInstantiated(cons, "v8::ObjectTemplate::MarkAsUndetectable");
1579 cons->set_undetectable(true); 1576 cons->set_undetectable(true);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1619 cons, "v8::ObjectTemplate::SetAccessCheckCallbackWithHandler"); 1616 cons, "v8::ObjectTemplate::SetAccessCheckCallbackWithHandler");
1620 1617
1621 i::Handle<i::Struct> struct_info = 1618 i::Handle<i::Struct> struct_info =
1622 isolate->factory()->NewStruct(i::ACCESS_CHECK_INFO_TYPE); 1619 isolate->factory()->NewStruct(i::ACCESS_CHECK_INFO_TYPE);
1623 i::Handle<i::AccessCheckInfo> info = 1620 i::Handle<i::AccessCheckInfo> info =
1624 i::Handle<i::AccessCheckInfo>::cast(struct_info); 1621 i::Handle<i::AccessCheckInfo>::cast(struct_info);
1625 1622
1626 SET_FIELD_WRAPPED(info, set_callback, callback); 1623 SET_FIELD_WRAPPED(info, set_callback, callback);
1627 auto named_interceptor = CreateInterceptorInfo( 1624 auto named_interceptor = CreateInterceptorInfo(
1628 isolate, named_handler.getter, named_handler.setter, named_handler.query, 1625 isolate, named_handler.getter, named_handler.setter, named_handler.query,
1629 named_handler.deleter, named_handler.enumerator, named_handler.data, 1626 named_handler.deleter, named_handler.enumerator, named_handler.definer,
1630 named_handler.flags); 1627 named_handler.data, named_handler.flags);
1631 info->set_named_interceptor(*named_interceptor); 1628 info->set_named_interceptor(*named_interceptor);
1632 auto indexed_interceptor = CreateInterceptorInfo( 1629 auto indexed_interceptor = CreateInterceptorInfo(
1633 isolate, indexed_handler.getter, indexed_handler.setter, 1630 isolate, indexed_handler.getter, indexed_handler.setter,
1634 indexed_handler.query, indexed_handler.deleter, 1631 indexed_handler.query, indexed_handler.deleter,
1635 indexed_handler.enumerator, indexed_handler.data, indexed_handler.flags); 1632 indexed_handler.enumerator, indexed_handler.definer, indexed_handler.data,
1633 indexed_handler.flags);
1636 info->set_indexed_interceptor(*indexed_interceptor); 1634 info->set_indexed_interceptor(*indexed_interceptor);
1637 1635
1638 if (data.IsEmpty()) { 1636 if (data.IsEmpty()) {
1639 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 1637 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
1640 } 1638 }
1641 info->set_data(*Utils::OpenHandle(*data)); 1639 info->set_data(*Utils::OpenHandle(*data));
1642 1640
1643 cons->set_access_check_info(*info); 1641 cons->set_access_check_info(*info);
1644 cons->set_needs_access_check(true); 1642 cons->set_needs_access_check(true);
1645 } 1643 }
1646 1644
1647 void ObjectTemplate::SetHandler( 1645 void ObjectTemplate::SetHandler(
1648 const IndexedPropertyHandlerConfiguration& config) { 1646 const IndexedPropertyHandlerConfiguration& config) {
1649 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 1647 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
1650 ENTER_V8(isolate); 1648 ENTER_V8(isolate);
1651 i::HandleScope scope(isolate); 1649 i::HandleScope scope(isolate);
1652 auto cons = EnsureConstructor(isolate, this); 1650 auto cons = EnsureConstructor(isolate, this);
1653 EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetHandler"); 1651 EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetHandler");
1654 auto obj = CreateInterceptorInfo( 1652 auto obj = CreateInterceptorInfo(
1655 isolate, config.getter, config.setter, config.query, config.deleter, 1653 isolate, config.getter, config.setter, config.query, config.deleter,
1656 config.enumerator, config.data, config.flags); 1654 config.enumerator, config.definer, config.data, config.flags);
1657 cons->set_indexed_property_handler(*obj); 1655 cons->set_indexed_property_handler(*obj);
1658 } 1656 }
1659 1657
1660 1658
1661 void ObjectTemplate::SetCallAsFunctionHandler(FunctionCallback callback, 1659 void ObjectTemplate::SetCallAsFunctionHandler(FunctionCallback callback,
1662 Local<Value> data) { 1660 Local<Value> data) {
1663 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); 1661 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
1664 ENTER_V8(isolate); 1662 ENTER_V8(isolate);
1665 i::HandleScope scope(isolate); 1663 i::HandleScope scope(isolate);
1666 auto cons = EnsureConstructor(isolate, this); 1664 auto cons = EnsureConstructor(isolate, this);
(...skipping 7357 matching lines...) Expand 10 before | Expand all | Expand 10 after
9024 Address callback_address = 9022 Address callback_address =
9025 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 9023 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
9026 VMState<EXTERNAL> state(isolate); 9024 VMState<EXTERNAL> state(isolate);
9027 ExternalCallbackScope call_scope(isolate, callback_address); 9025 ExternalCallbackScope call_scope(isolate, callback_address);
9028 callback(info); 9026 callback(info);
9029 } 9027 }
9030 9028
9031 9029
9032 } // namespace internal 9030 } // namespace internal
9033 } // namespace v8 9031 } // namespace v8
OLDNEW
« no previous file with comments | « include/v8.h ('k') | src/api-arguments.h » ('j') | src/objects.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698