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

Side by Side Diff: src/api.cc

Issue 2449783006: Add a native data property that replaces itself with a real data property (Closed)
Patch Set: Created 4 years, 1 month 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
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 1277 matching lines...) Expand 10 before | Expand all | Expand 10 after
1288 } 1288 }
1289 return obj; 1289 return obj;
1290 } 1290 }
1291 1291
1292 namespace { 1292 namespace {
1293 1293
1294 template <typename Getter, typename Setter> 1294 template <typename Getter, typename Setter>
1295 i::Handle<i::AccessorInfo> MakeAccessorInfo( 1295 i::Handle<i::AccessorInfo> MakeAccessorInfo(
1296 v8::Local<Name> name, Getter getter, Setter setter, v8::Local<Value> data, 1296 v8::Local<Name> name, Getter getter, Setter setter, v8::Local<Value> data,
1297 v8::AccessControl settings, v8::PropertyAttribute attributes, 1297 v8::AccessControl settings, v8::PropertyAttribute attributes,
1298 v8::Local<AccessorSignature> signature, bool is_special_data_property) { 1298 v8::Local<AccessorSignature> signature, bool is_special_data_property,
1299 bool replace_on_access) {
1299 i::Isolate* isolate = Utils::OpenHandle(*name)->GetIsolate(); 1300 i::Isolate* isolate = Utils::OpenHandle(*name)->GetIsolate();
1300 i::Handle<i::AccessorInfo> obj = isolate->factory()->NewAccessorInfo(); 1301 i::Handle<i::AccessorInfo> obj = isolate->factory()->NewAccessorInfo();
1301 SET_FIELD_WRAPPED(obj, set_getter, getter); 1302 SET_FIELD_WRAPPED(obj, set_getter, getter);
1303 DCHECK_IMPLIES(replace_on_access,
1304 is_special_data_property && setter == nullptr);
1302 if (is_special_data_property && setter == nullptr) { 1305 if (is_special_data_property && setter == nullptr) {
1303 setter = reinterpret_cast<Setter>(&i::Accessors::ReconfigureToDataProperty); 1306 setter = reinterpret_cast<Setter>(&i::Accessors::ReconfigureToDataProperty);
1304 } 1307 }
1305 SET_FIELD_WRAPPED(obj, set_setter, setter); 1308 SET_FIELD_WRAPPED(obj, set_setter, setter);
1306 i::Address redirected = obj->redirected_getter(); 1309 i::Address redirected = obj->redirected_getter();
1307 if (redirected != nullptr) SET_FIELD_WRAPPED(obj, set_js_getter, redirected); 1310 if (redirected != nullptr) SET_FIELD_WRAPPED(obj, set_js_getter, redirected);
1308 if (data.IsEmpty()) { 1311 if (data.IsEmpty()) {
1309 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 1312 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
1310 } 1313 }
1311 obj->set_data(*Utils::OpenHandle(*data)); 1314 obj->set_data(*Utils::OpenHandle(*data));
1312 obj->set_is_special_data_property(is_special_data_property); 1315 obj->set_is_special_data_property(is_special_data_property);
1316 obj->set_replace_on_access(replace_on_access);
1313 return SetAccessorInfoProperties(obj, name, settings, attributes, signature); 1317 return SetAccessorInfoProperties(obj, name, settings, attributes, signature);
1314 } 1318 }
1315 1319
1316 } // namespace 1320 } // namespace
1317 1321
1318 Local<ObjectTemplate> FunctionTemplate::InstanceTemplate() { 1322 Local<ObjectTemplate> FunctionTemplate::InstanceTemplate() {
1319 i::Handle<i::FunctionTemplateInfo> handle = Utils::OpenHandle(this, true); 1323 i::Handle<i::FunctionTemplateInfo> handle = Utils::OpenHandle(this, true);
1320 if (!Utils::ApiCheck(!handle.is_null(), 1324 if (!Utils::ApiCheck(!handle.is_null(),
1321 "v8::FunctionTemplate::InstanceTemplate()", 1325 "v8::FunctionTemplate::InstanceTemplate()",
1322 "Reading from empty handle")) { 1326 "Reading from empty handle")) {
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
1454 return i::Handle<i::FunctionTemplateInfo>(info, isolate); 1458 return i::Handle<i::FunctionTemplateInfo>(info, isolate);
1455 } 1459 }
1456 Local<FunctionTemplate> templ = 1460 Local<FunctionTemplate> templ =
1457 FunctionTemplate::New(reinterpret_cast<Isolate*>(isolate)); 1461 FunctionTemplate::New(reinterpret_cast<Isolate*>(isolate));
1458 i::Handle<i::FunctionTemplateInfo> constructor = Utils::OpenHandle(*templ); 1462 i::Handle<i::FunctionTemplateInfo> constructor = Utils::OpenHandle(*templ);
1459 constructor->set_instance_template(*Utils::OpenHandle(object_template)); 1463 constructor->set_instance_template(*Utils::OpenHandle(object_template));
1460 Utils::OpenHandle(object_template)->set_constructor(*constructor); 1464 Utils::OpenHandle(object_template)->set_constructor(*constructor);
1461 return constructor; 1465 return constructor;
1462 } 1466 }
1463 1467
1464
1465 template <typename Getter, typename Setter, typename Data, typename Template> 1468 template <typename Getter, typename Setter, typename Data, typename Template>
1466 static bool TemplateSetAccessor(Template* template_obj, v8::Local<Name> name, 1469 static bool TemplateSetAccessor(Template* template_obj, v8::Local<Name> name,
1467 Getter getter, Setter setter, Data data, 1470 Getter getter, Setter setter, Data data,
1468 AccessControl settings, 1471 AccessControl settings,
1469 PropertyAttribute attribute, 1472 PropertyAttribute attribute,
1470 v8::Local<AccessorSignature> signature, 1473 v8::Local<AccessorSignature> signature,
1471 bool is_special_data_property) { 1474 bool is_special_data_property,
1475 bool replace_on_access) {
1472 auto info = Utils::OpenHandle(template_obj); 1476 auto info = Utils::OpenHandle(template_obj);
1473 auto isolate = info->GetIsolate(); 1477 auto isolate = info->GetIsolate();
1474 ENTER_V8(isolate); 1478 ENTER_V8(isolate);
1475 i::HandleScope scope(isolate); 1479 i::HandleScope scope(isolate);
1476 auto obj = MakeAccessorInfo(name, getter, setter, data, settings, attribute, 1480 auto obj =
1477 signature, is_special_data_property); 1481 MakeAccessorInfo(name, getter, setter, data, settings, attribute,
1482 signature, is_special_data_property, replace_on_access);
1478 if (obj.is_null()) return false; 1483 if (obj.is_null()) return false;
1479 i::ApiNatives::AddNativeDataProperty(isolate, info, obj); 1484 i::ApiNatives::AddNativeDataProperty(isolate, info, obj);
1480 return true; 1485 return true;
1481 } 1486 }
1482 1487
1483 1488
1484 void Template::SetNativeDataProperty(v8::Local<String> name, 1489 void Template::SetNativeDataProperty(v8::Local<String> name,
1485 AccessorGetterCallback getter, 1490 AccessorGetterCallback getter,
1486 AccessorSetterCallback setter, 1491 AccessorSetterCallback setter,
1487 v8::Local<Value> data, 1492 v8::Local<Value> data,
1488 PropertyAttribute attribute, 1493 PropertyAttribute attribute,
1489 v8::Local<AccessorSignature> signature, 1494 v8::Local<AccessorSignature> signature,
1490 AccessControl settings) { 1495 AccessControl settings) {
1491 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute, 1496 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute,
1492 signature, true); 1497 signature, true, false);
1493 } 1498 }
1494 1499
1495 1500
1496 void Template::SetNativeDataProperty(v8::Local<Name> name, 1501 void Template::SetNativeDataProperty(v8::Local<Name> name,
1497 AccessorNameGetterCallback getter, 1502 AccessorNameGetterCallback getter,
1498 AccessorNameSetterCallback setter, 1503 AccessorNameSetterCallback setter,
1499 v8::Local<Value> data, 1504 v8::Local<Value> data,
1500 PropertyAttribute attribute, 1505 PropertyAttribute attribute,
1501 v8::Local<AccessorSignature> signature, 1506 v8::Local<AccessorSignature> signature,
1502 AccessControl settings) { 1507 AccessControl settings) {
1503 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute, 1508 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute,
1504 signature, true); 1509 signature, true, false);
1505 } 1510 }
1506 1511
1512 void Template::SetLazyDataProperty(v8::Local<Name> name,
1513 AccessorNameGetterCallback getter,
1514 v8::Local<Value> data,
1515 PropertyAttribute attribute) {
1516 TemplateSetAccessor(
1517 this, name, getter, static_cast<AccessorNameSetterCallback>(nullptr),
1518 data, DEFAULT, attribute, Local<AccessorSignature>(), true, true);
1519 }
1507 1520
1508 void Template::SetIntrinsicDataProperty(Local<Name> name, Intrinsic intrinsic, 1521 void Template::SetIntrinsicDataProperty(Local<Name> name, Intrinsic intrinsic,
1509 PropertyAttribute attribute) { 1522 PropertyAttribute attribute) {
1510 auto templ = Utils::OpenHandle(this); 1523 auto templ = Utils::OpenHandle(this);
1511 i::Isolate* isolate = templ->GetIsolate(); 1524 i::Isolate* isolate = templ->GetIsolate();
1512 ENTER_V8(isolate); 1525 ENTER_V8(isolate);
1513 i::HandleScope scope(isolate); 1526 i::HandleScope scope(isolate);
1514 i::ApiNatives::AddDataProperty(isolate, templ, Utils::OpenHandle(*name), 1527 i::ApiNatives::AddDataProperty(isolate, templ, Utils::OpenHandle(*name),
1515 intrinsic, 1528 intrinsic,
1516 static_cast<i::PropertyAttributes>(attribute)); 1529 static_cast<i::PropertyAttributes>(attribute));
1517 } 1530 }
1518 1531
1519 1532
1520 void ObjectTemplate::SetAccessor(v8::Local<String> name, 1533 void ObjectTemplate::SetAccessor(v8::Local<String> name,
1521 AccessorGetterCallback getter, 1534 AccessorGetterCallback getter,
1522 AccessorSetterCallback setter, 1535 AccessorSetterCallback setter,
1523 v8::Local<Value> data, AccessControl settings, 1536 v8::Local<Value> data, AccessControl settings,
1524 PropertyAttribute attribute, 1537 PropertyAttribute attribute,
1525 v8::Local<AccessorSignature> signature) { 1538 v8::Local<AccessorSignature> signature) {
1526 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute, 1539 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute,
1527 signature, i::FLAG_disable_old_api_accessors); 1540 signature, i::FLAG_disable_old_api_accessors, false);
1528 } 1541 }
1529 1542
1530 1543
1531 void ObjectTemplate::SetAccessor(v8::Local<Name> name, 1544 void ObjectTemplate::SetAccessor(v8::Local<Name> name,
1532 AccessorNameGetterCallback getter, 1545 AccessorNameGetterCallback getter,
1533 AccessorNameSetterCallback setter, 1546 AccessorNameSetterCallback setter,
1534 v8::Local<Value> data, AccessControl settings, 1547 v8::Local<Value> data, AccessControl settings,
1535 PropertyAttribute attribute, 1548 PropertyAttribute attribute,
1536 v8::Local<AccessorSignature> signature) { 1549 v8::Local<AccessorSignature> signature) {
1537 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute, 1550 TemplateSetAccessor(this, name, getter, setter, data, settings, attribute,
1538 signature, i::FLAG_disable_old_api_accessors); 1551 signature, i::FLAG_disable_old_api_accessors, false);
1539 } 1552 }
1540 1553
1541 template <typename Getter, typename Setter, typename Query, typename Descriptor, 1554 template <typename Getter, typename Setter, typename Query, typename Descriptor,
1542 typename Deleter, typename Enumerator, typename Definer> 1555 typename Deleter, typename Enumerator, typename Definer>
1543 static i::Handle<i::InterceptorInfo> CreateInterceptorInfo( 1556 static i::Handle<i::InterceptorInfo> CreateInterceptorInfo(
1544 i::Isolate* isolate, Getter getter, Setter setter, Query query, 1557 i::Isolate* isolate, Getter getter, Setter setter, Query query,
1545 Descriptor descriptor, Deleter remover, Enumerator enumerator, 1558 Descriptor descriptor, Deleter remover, Enumerator enumerator,
1546 Definer definer, Local<Value> data, PropertyHandlerFlags flags) { 1559 Definer definer, Local<Value> data, PropertyHandlerFlags flags) {
1547 DCHECK(query == nullptr || 1560 DCHECK(query == nullptr ||
1548 descriptor == nullptr); // Either intercept attributes or descriptor. 1561 descriptor == nullptr); // Either intercept attributes or descriptor.
(...skipping 2930 matching lines...) Expand 10 before | Expand all | Expand 10 after
4479 static Maybe<bool> ObjectSetAccessor(Local<Context> context, Object* self, 4492 static Maybe<bool> ObjectSetAccessor(Local<Context> context, Object* self,
4480 Local<Name> name, Getter getter, 4493 Local<Name> name, Getter getter,
4481 Setter setter, Data data, 4494 Setter setter, Data data,
4482 AccessControl settings, 4495 AccessControl settings,
4483 PropertyAttribute attributes) { 4496 PropertyAttribute attributes) {
4484 PREPARE_FOR_EXECUTION_PRIMITIVE(context, Object, SetAccessor, bool); 4497 PREPARE_FOR_EXECUTION_PRIMITIVE(context, Object, SetAccessor, bool);
4485 if (!Utils::OpenHandle(self)->IsJSObject()) return Just(false); 4498 if (!Utils::OpenHandle(self)->IsJSObject()) return Just(false);
4486 i::Handle<i::JSObject> obj = 4499 i::Handle<i::JSObject> obj =
4487 i::Handle<i::JSObject>::cast(Utils::OpenHandle(self)); 4500 i::Handle<i::JSObject>::cast(Utils::OpenHandle(self));
4488 v8::Local<AccessorSignature> signature; 4501 v8::Local<AccessorSignature> signature;
4489 auto info = MakeAccessorInfo(name, getter, setter, data, settings, attributes, 4502 auto info =
4490 signature, i::FLAG_disable_old_api_accessors); 4503 MakeAccessorInfo(name, getter, setter, data, settings, attributes,
4504 signature, i::FLAG_disable_old_api_accessors, false);
4491 if (info.is_null()) return Nothing<bool>(); 4505 if (info.is_null()) return Nothing<bool>();
4492 bool fast = obj->HasFastProperties(); 4506 bool fast = obj->HasFastProperties();
4493 i::Handle<i::Object> result; 4507 i::Handle<i::Object> result;
4494 has_pending_exception = 4508 has_pending_exception =
4495 !i::JSObject::SetAccessor(obj, info).ToHandle(&result); 4509 !i::JSObject::SetAccessor(obj, info).ToHandle(&result);
4496 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); 4510 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
4497 if (result->IsUndefined(obj->GetIsolate())) return Nothing<bool>(); 4511 if (result->IsUndefined(obj->GetIsolate())) return Nothing<bool>();
4498 if (fast) { 4512 if (fast) {
4499 i::JSObject::MigrateSlowToFast(obj, 0, "APISetAccessor"); 4513 i::JSObject::MigrateSlowToFast(obj, 0, "APISetAccessor");
4500 } 4514 }
(...skipping 4991 matching lines...) Expand 10 before | Expand all | Expand 10 after
9492 Address callback_address = 9506 Address callback_address =
9493 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 9507 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
9494 VMState<EXTERNAL> state(isolate); 9508 VMState<EXTERNAL> state(isolate);
9495 ExternalCallbackScope call_scope(isolate, callback_address); 9509 ExternalCallbackScope call_scope(isolate, callback_address);
9496 callback(info); 9510 callback(info);
9497 } 9511 }
9498 9512
9499 9513
9500 } // namespace internal 9514 } // namespace internal
9501 } // namespace v8 9515 } // namespace v8
OLDNEW
« src/accessors.cc ('K') | « src/accessors.cc ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698