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

Side by Side Diff: test/cctest/test-api-interceptors.cc

Issue 2303533004: Revert of [api] Add interceptor for defineProperty(). (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@DefineProperty
Patch Set: 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 | « src/objects-inl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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 <stdlib.h> 5 #include <stdlib.h>
6 6
7 #include "test/cctest/test-api.h" 7 #include "test/cctest/test-api.h"
8 8
9 #include "include/v8-util.h" 9 #include "include/v8-util.h"
10 #include "src/api.h" 10 #include "src/api.h"
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 232
233 void CheckThisNamedPropertyHandler( 233 void CheckThisNamedPropertyHandler(
234 Local<Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) { 234 Local<Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
235 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertyHandler)); 235 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertyHandler));
236 ApiTestFuzzer::Fuzz(); 236 ApiTestFuzzer::Fuzz();
237 CHECK(info.This() 237 CHECK(info.This()
238 ->Equals(info.GetIsolate()->GetCurrentContext(), bottom) 238 ->Equals(info.GetIsolate()->GetCurrentContext(), bottom)
239 .FromJust()); 239 .FromJust());
240 } 240 }
241 241
242 void CheckThisIndexedPropertyDefiner(
243 uint32_t index, const v8::PropertyDescriptor& desc,
244 const v8::PropertyCallbackInfo<v8::Value>& info) {
245 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertyDefiner));
246 ApiTestFuzzer::Fuzz();
247 CHECK(info.This()
248 ->Equals(info.GetIsolate()->GetCurrentContext(), bottom)
249 .FromJust());
250 }
251
252 void CheckThisNamedPropertyDefiner(
253 Local<Name> property, const v8::PropertyDescriptor& desc,
254 const v8::PropertyCallbackInfo<v8::Value>& info) {
255 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertyDefiner));
256 ApiTestFuzzer::Fuzz();
257 CHECK(info.This()
258 ->Equals(info.GetIsolate()->GetCurrentContext(), bottom)
259 .FromJust());
260 }
261
262 void CheckThisIndexedPropertySetter( 242 void CheckThisIndexedPropertySetter(
263 uint32_t index, Local<Value> value, 243 uint32_t index, Local<Value> value,
264 const v8::PropertyCallbackInfo<v8::Value>& info) { 244 const v8::PropertyCallbackInfo<v8::Value>& info) {
265 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertySetter)); 245 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertySetter));
266 ApiTestFuzzer::Fuzz(); 246 ApiTestFuzzer::Fuzz();
267 CHECK(info.This() 247 CHECK(info.This()
268 ->Equals(info.GetIsolate()->GetCurrentContext(), bottom) 248 ->Equals(info.GetIsolate()->GetCurrentContext(), bottom)
269 .FromJust()); 249 .FromJust());
270 } 250 }
271 251
(...skipping 844 matching lines...) Expand 10 before | Expand all | Expand 10 after
1116 .ToLocalChecked() 1096 .ToLocalChecked()
1117 ->BooleanValue(env.local()) 1097 ->BooleanValue(env.local())
1118 .FromJust()); 1098 .FromJust());
1119 CHECK(v8_compile("delete obj.myProperty") 1099 CHECK(v8_compile("delete obj.myProperty")
1120 ->Run(env.local()) 1100 ->Run(env.local())
1121 .ToLocalChecked() 1101 .ToLocalChecked()
1122 ->BooleanValue(env.local()) 1102 ->BooleanValue(env.local())
1123 .FromJust()); 1103 .FromJust());
1124 } 1104 }
1125 1105
1126 namespace {
1127 void NotInterceptingPropertyDefineCallback(
1128 Local<Name> name, const v8::PropertyDescriptor& desc,
1129 const v8::PropertyCallbackInfo<v8::Value>& info) {
1130 // Do not intercept by not calling info.GetReturnValue().Set()
1131 }
1132
1133 void InterceptingPropertyDefineCallback(
1134 Local<Name> name, const v8::PropertyDescriptor& desc,
1135 const v8::PropertyCallbackInfo<v8::Value>& info) {
1136 // intercept the callback by setting a non-empty handle
1137 info.GetReturnValue().Set(name);
1138 }
1139
1140 void CheckDescriptorInDefineCallback(
1141 Local<Name> name, const v8::PropertyDescriptor& desc,
1142 const v8::PropertyCallbackInfo<v8::Value>& info) {
1143 CHECK(!desc.has_writable());
1144 CHECK(!desc.has_value());
1145 CHECK(!desc.has_enumerable());
1146 CHECK(desc.has_configurable());
1147 CHECK(!desc.configurable());
1148 CHECK(desc.has_get());
1149 CHECK(desc.get()->IsFunction());
1150 CHECK(desc.has_set());
1151 CHECK(desc.set()->IsUndefined());
1152 // intercept the callback by setting a non-empty handle
1153 info.GetReturnValue().Set(name);
1154 }
1155 } // namespace
1156
1157 THREADED_TEST(PropertyDefinerCallback) {
1158 v8::HandleScope scope(CcTest::isolate());
1159 LocalContext env;
1160
1161 { // Intercept defineProperty()
1162 v8::Local<v8::FunctionTemplate> templ =
1163 v8::FunctionTemplate::New(CcTest::isolate());
1164 templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration(
1165 0, 0, 0, 0, 0, NotInterceptingPropertyDefineCallback));
1166 env->Global()
1167 ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local())
1168 .ToLocalChecked()
1169 ->NewInstance(env.local())
1170 .ToLocalChecked())
1171 .FromJust();
1172 const char* code =
1173 "obj.x = 17; "
1174 "Object.defineProperty(obj, 'x', {value: 42});"
1175 "obj.x;";
1176 CHECK_EQ(42, v8_compile(code)
1177 ->Run(env.local())
1178 .ToLocalChecked()
1179 ->Int32Value(env.local())
1180 .FromJust());
1181 }
1182
1183 { // Intercept defineProperty() for correct accessor descriptor
1184 v8::Local<v8::FunctionTemplate> templ =
1185 v8::FunctionTemplate::New(CcTest::isolate());
1186 templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration(
1187 0, 0, 0, 0, 0, CheckDescriptorInDefineCallback));
1188 env->Global()
1189 ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local())
1190 .ToLocalChecked()
1191 ->NewInstance(env.local())
1192 .ToLocalChecked())
1193 .FromJust();
1194 const char* code =
1195 "obj.x = 17; "
1196 "Object.defineProperty(obj, 'x', {"
1197 "get: function(){ return 42; }, "
1198 "set: undefined,"
1199 "configurable: 0"
1200 "});"
1201 "obj.x;";
1202 CHECK_EQ(17, v8_compile(code)
1203 ->Run(env.local())
1204 .ToLocalChecked()
1205 ->Int32Value(env.local())
1206 .FromJust());
1207 }
1208
1209 { // Do not intercept defineProperty()
1210 v8::Local<v8::FunctionTemplate> templ2 =
1211 v8::FunctionTemplate::New(CcTest::isolate());
1212 templ2->InstanceTemplate()->SetHandler(
1213 v8::NamedPropertyHandlerConfiguration(
1214 0, 0, 0, 0, 0, InterceptingPropertyDefineCallback));
1215 env->Global()
1216 ->Set(env.local(), v8_str("obj"), templ2->GetFunction(env.local())
1217 .ToLocalChecked()
1218 ->NewInstance(env.local())
1219 .ToLocalChecked())
1220 .FromJust();
1221
1222 const char* code =
1223 "obj.x = 17; "
1224 "Object.defineProperty(obj, 'x', {value: 42});"
1225 "obj.x;";
1226 CHECK_EQ(17, v8_compile(code)
1227 ->Run(env.local())
1228 .ToLocalChecked()
1229 ->Int32Value(env.local())
1230 .FromJust());
1231 }
1232 }
1233
1234 namespace {
1235 void NotInterceptingPropertyDefineCallbackIndexed(
1236 uint32_t index, const v8::PropertyDescriptor& desc,
1237 const v8::PropertyCallbackInfo<v8::Value>& info) {
1238 // Do not intercept by not calling info.GetReturnValue().Set()
1239 }
1240
1241 void InterceptingPropertyDefineCallbackIndexed(
1242 uint32_t index, const v8::PropertyDescriptor& desc,
1243 const v8::PropertyCallbackInfo<v8::Value>& info) {
1244 // intercept the callback by setting a non-empty handle
1245 info.GetReturnValue().Set(index);
1246 }
1247
1248 void CheckDescriptorInDefineCallbackIndexed(
1249 uint32_t index, const v8::PropertyDescriptor& desc,
1250 const v8::PropertyCallbackInfo<v8::Value>& info) {
1251 CHECK(!desc.has_writable());
1252 CHECK(!desc.has_value());
1253 CHECK(desc.has_enumerable());
1254 CHECK(desc.enumerable());
1255 CHECK(!desc.has_configurable());
1256 CHECK(desc.has_get());
1257 CHECK(desc.get()->IsFunction());
1258 CHECK(desc.has_set());
1259 CHECK(desc.set()->IsUndefined());
1260 // intercept the callback by setting a non-empty handle
1261 info.GetReturnValue().Set(index);
1262 }
1263 } // namespace
1264
1265 THREADED_TEST(PropertyDefinerCallbackIndexed) {
1266 v8::HandleScope scope(CcTest::isolate());
1267 LocalContext env;
1268
1269 { // Intercept defineProperty()
1270 v8::Local<v8::FunctionTemplate> templ =
1271 v8::FunctionTemplate::New(CcTest::isolate());
1272 templ->InstanceTemplate()->SetHandler(
1273 v8::IndexedPropertyHandlerConfiguration(
1274 0, 0, 0, 0, 0, NotInterceptingPropertyDefineCallbackIndexed));
1275 env->Global()
1276 ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local())
1277 .ToLocalChecked()
1278 ->NewInstance(env.local())
1279 .ToLocalChecked())
1280 .FromJust();
1281 const char* code =
1282 "obj[2] = 17; "
1283 "Object.defineProperty(obj, 2, {value: 42});"
1284 "obj[2];";
1285 CHECK_EQ(42, v8_compile(code)
1286 ->Run(env.local())
1287 .ToLocalChecked()
1288 ->Int32Value(env.local())
1289 .FromJust());
1290 }
1291
1292 { // Intercept defineProperty() for correct accessor descriptor
1293 v8::Local<v8::FunctionTemplate> templ =
1294 v8::FunctionTemplate::New(CcTest::isolate());
1295 templ->InstanceTemplate()->SetHandler(
1296 v8::IndexedPropertyHandlerConfiguration(
1297 0, 0, 0, 0, 0, CheckDescriptorInDefineCallbackIndexed));
1298 env->Global()
1299 ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local())
1300 .ToLocalChecked()
1301 ->NewInstance(env.local())
1302 .ToLocalChecked())
1303 .FromJust();
1304 const char* code =
1305 "obj[2] = 17; "
1306 "Object.defineProperty(obj, 2, {"
1307 "get: function(){ return 42; }, "
1308 "set: undefined,"
1309 "enumerable: true"
1310 "});"
1311 "obj[2];";
1312 CHECK_EQ(17, v8_compile(code)
1313 ->Run(env.local())
1314 .ToLocalChecked()
1315 ->Int32Value(env.local())
1316 .FromJust());
1317 }
1318
1319 { // Do not intercept defineProperty()
1320 v8::Local<v8::FunctionTemplate> templ2 =
1321 v8::FunctionTemplate::New(CcTest::isolate());
1322 templ2->InstanceTemplate()->SetHandler(
1323 v8::IndexedPropertyHandlerConfiguration(
1324 0, 0, 0, 0, 0, InterceptingPropertyDefineCallbackIndexed));
1325 env->Global()
1326 ->Set(env.local(), v8_str("obj"), templ2->GetFunction(env.local())
1327 .ToLocalChecked()
1328 ->NewInstance(env.local())
1329 .ToLocalChecked())
1330 .FromJust();
1331
1332 const char* code =
1333 "obj[2] = 17; "
1334 "Object.defineProperty(obj, 2, {value: 42});"
1335 "obj[2];";
1336 CHECK_EQ(17, v8_compile(code)
1337 ->Run(env.local())
1338 .ToLocalChecked()
1339 ->Int32Value(env.local())
1340 .FromJust());
1341 }
1342 }
1343
1344 // Test that freeze() is intercepted.
1345 THREADED_TEST(PropertyDefinerCallbackForFreeze) {
1346 v8::HandleScope scope(CcTest::isolate());
1347 LocalContext env;
1348 v8::Local<v8::FunctionTemplate> templ =
1349 v8::FunctionTemplate::New(CcTest::isolate());
1350 templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration(
1351 0, 0, 0, 0, 0, InterceptingPropertyDefineCallback));
1352 env->Global()
1353 ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local())
1354 .ToLocalChecked()
1355 ->NewInstance(env.local())
1356 .ToLocalChecked())
1357 .FromJust();
1358 const char* code =
1359 "obj.x = 17; "
1360 "Object.freeze(obj.x); "
1361 "Object.isFrozen(obj.x);";
1362
1363 CHECK(v8_compile(code)
1364 ->Run(env.local())
1365 .ToLocalChecked()
1366 ->BooleanValue(env.local())
1367 .FromJust());
1368 }
1369
1370 // Check that the descriptor passed to the callback is enumerable.
1371 namespace {
1372 void CheckEnumerablePropertyDefineCallback(
1373 Local<Name> name, const v8::PropertyDescriptor& desc,
1374 const v8::PropertyCallbackInfo<v8::Value>& info) {
1375 CHECK(desc.has_value());
1376 CHECK_EQ(42, desc.value()
1377 ->Int32Value(info.GetIsolate()->GetCurrentContext())
1378 .FromJust());
1379 CHECK(desc.has_enumerable());
1380 CHECK(desc.enumerable());
1381 CHECK(!desc.has_writable());
1382
1383 // intercept the callback by setting a non-empty handle
1384 info.GetReturnValue().Set(name);
1385 }
1386 } // namespace
1387 THREADED_TEST(PropertyDefinerCallbackEnumerable) {
1388 v8::HandleScope scope(CcTest::isolate());
1389 LocalContext env;
1390 v8::Local<v8::FunctionTemplate> templ =
1391 v8::FunctionTemplate::New(CcTest::isolate());
1392 templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration(
1393 0, 0, 0, 0, 0, CheckEnumerablePropertyDefineCallback));
1394 env->Global()
1395 ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local())
1396 .ToLocalChecked()
1397 ->NewInstance(env.local())
1398 .ToLocalChecked())
1399 .FromJust();
1400 const char* code =
1401 "obj.x = 17; "
1402 "Object.defineProperty(obj, 'x', {value: 42, enumerable: true});"
1403 "obj.x;";
1404 CHECK_EQ(17, v8_compile(code)
1405 ->Run(env.local())
1406 .ToLocalChecked()
1407 ->Int32Value(env.local())
1408 .FromJust());
1409 }
1410
1411 // Check that the descriptor passed to the callback is configurable.
1412 namespace {
1413 void CheckConfigurablePropertyDefineCallback(
1414 Local<Name> name, const v8::PropertyDescriptor& desc,
1415 const v8::PropertyCallbackInfo<v8::Value>& info) {
1416 CHECK(desc.has_value());
1417 CHECK_EQ(42, desc.value()
1418 ->Int32Value(info.GetIsolate()->GetCurrentContext())
1419 .FromJust());
1420 CHECK(desc.has_configurable());
1421 CHECK(desc.configurable());
1422
1423 // intercept the callback by setting a non-empty handle
1424 info.GetReturnValue().Set(name);
1425 }
1426 } // namespace
1427 THREADED_TEST(PropertyDefinerCallbackConfigurable) {
1428 v8::HandleScope scope(CcTest::isolate());
1429 LocalContext env;
1430 v8::Local<v8::FunctionTemplate> templ =
1431 v8::FunctionTemplate::New(CcTest::isolate());
1432 templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration(
1433 0, 0, 0, 0, 0, CheckConfigurablePropertyDefineCallback));
1434 env->Global()
1435 ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local())
1436 .ToLocalChecked()
1437 ->NewInstance(env.local())
1438 .ToLocalChecked())
1439 .FromJust();
1440 const char* code =
1441 "obj.x = 17; "
1442 "Object.defineProperty(obj, 'x', {value: 42, configurable: true});"
1443 "obj.x;";
1444 CHECK_EQ(17, v8_compile(code)
1445 ->Run(env.local())
1446 .ToLocalChecked()
1447 ->Int32Value(env.local())
1448 .FromJust());
1449 }
1450
1451 // Check that the descriptor passed to the callback is writable.
1452 namespace {
1453 void CheckWritablePropertyDefineCallback(
1454 Local<Name> name, const v8::PropertyDescriptor& desc,
1455 const v8::PropertyCallbackInfo<v8::Value>& info) {
1456 CHECK(desc.has_writable());
1457 CHECK(desc.writable());
1458
1459 // intercept the callback by setting a non-empty handle
1460 info.GetReturnValue().Set(name);
1461 }
1462 } // namespace
1463 THREADED_TEST(PropertyDefinerCallbackWritable) {
1464 v8::HandleScope scope(CcTest::isolate());
1465 LocalContext env;
1466 v8::Local<v8::FunctionTemplate> templ =
1467 v8::FunctionTemplate::New(CcTest::isolate());
1468 templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration(
1469 0, 0, 0, 0, 0, CheckWritablePropertyDefineCallback));
1470 env->Global()
1471 ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local())
1472 .ToLocalChecked()
1473 ->NewInstance(env.local())
1474 .ToLocalChecked())
1475 .FromJust();
1476 const char* code =
1477 "obj.x = 17; "
1478 "Object.defineProperty(obj, 'x', {value: 42, writable: true});"
1479 "obj.x;";
1480 CHECK_EQ(17, v8_compile(code)
1481 ->Run(env.local())
1482 .ToLocalChecked()
1483 ->Int32Value(env.local())
1484 .FromJust());
1485 }
1486
1487 // Check that the descriptor passed to the callback has a getter.
1488 namespace {
1489 void CheckGetterPropertyDefineCallback(
1490 Local<Name> name, const v8::PropertyDescriptor& desc,
1491 const v8::PropertyCallbackInfo<v8::Value>& info) {
1492 CHECK(desc.has_get());
1493 CHECK(!desc.has_set());
1494 // intercept the callback by setting a non-empty handle
1495 info.GetReturnValue().Set(name);
1496 }
1497 } // namespace
1498 THREADED_TEST(PropertyDefinerCallbackWithGetter) {
1499 v8::HandleScope scope(CcTest::isolate());
1500 LocalContext env;
1501 v8::Local<v8::FunctionTemplate> templ =
1502 v8::FunctionTemplate::New(CcTest::isolate());
1503 templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration(
1504 0, 0, 0, 0, 0, CheckGetterPropertyDefineCallback));
1505 env->Global()
1506 ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local())
1507 .ToLocalChecked()
1508 ->NewInstance(env.local())
1509 .ToLocalChecked())
1510 .FromJust();
1511 const char* code =
1512 "obj.x = 17;"
1513 "Object.defineProperty(obj, 'x', {get: function() {return 42;}});"
1514 "obj.x;";
1515 CHECK_EQ(17, v8_compile(code)
1516 ->Run(env.local())
1517 .ToLocalChecked()
1518 ->Int32Value(env.local())
1519 .FromJust());
1520 }
1521
1522 // Check that the descriptor passed to the callback has a setter.
1523 namespace {
1524 void CheckSetterPropertyDefineCallback(
1525 Local<Name> name, const v8::PropertyDescriptor& desc,
1526 const v8::PropertyCallbackInfo<v8::Value>& info) {
1527 CHECK(desc.has_set());
1528 CHECK(!desc.has_get());
1529 // intercept the callback by setting a non-empty handle
1530 info.GetReturnValue().Set(name);
1531 }
1532 } // namespace
1533 THREADED_TEST(PropertyDefinerCallbackWithSetter) {
1534 v8::HandleScope scope(CcTest::isolate());
1535 LocalContext env;
1536 v8::Local<v8::FunctionTemplate> templ =
1537 v8::FunctionTemplate::New(CcTest::isolate());
1538 templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration(
1539 0, 0, 0, 0, 0, CheckSetterPropertyDefineCallback));
1540 env->Global()
1541 ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local())
1542 .ToLocalChecked()
1543 ->NewInstance(env.local())
1544 .ToLocalChecked())
1545 .FromJust();
1546 const char* code =
1547 "Object.defineProperty(obj, 'x', {set: function() {return 42;}});"
1548 "obj.x = 17;";
1549 CHECK_EQ(17, v8_compile(code)
1550 ->Run(env.local())
1551 .ToLocalChecked()
1552 ->Int32Value(env.local())
1553 .FromJust());
1554 }
1555 1106
1556 int echo_indexed_call_count = 0; 1107 int echo_indexed_call_count = 0;
1557 1108
1558 1109
1559 static void EchoIndexedProperty( 1110 static void EchoIndexedProperty(
1560 uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) { 1111 uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
1561 ApiTestFuzzer::Fuzz(); 1112 ApiTestFuzzer::Fuzz();
1562 CHECK(v8_num(637) 1113 CHECK(v8_num(637)
1563 ->Equals(info.GetIsolate()->GetCurrentContext(), info.Data()) 1114 ->Equals(info.GetIsolate()->GetCurrentContext(), info.Data())
1564 .FromJust()); 1115 .FromJust());
(...skipping 27 matching lines...) Expand all
1592 THREADED_TEST(PropertyHandlerInPrototype) { 1143 THREADED_TEST(PropertyHandlerInPrototype) {
1593 LocalContext env; 1144 LocalContext env;
1594 v8::Isolate* isolate = env->GetIsolate(); 1145 v8::Isolate* isolate = env->GetIsolate();
1595 v8::HandleScope scope(isolate); 1146 v8::HandleScope scope(isolate);
1596 1147
1597 // Set up a prototype chain with three interceptors. 1148 // Set up a prototype chain with three interceptors.
1598 v8::Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); 1149 v8::Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate);
1599 templ->InstanceTemplate()->SetHandler(v8::IndexedPropertyHandlerConfiguration( 1150 templ->InstanceTemplate()->SetHandler(v8::IndexedPropertyHandlerConfiguration(
1600 CheckThisIndexedPropertyHandler, CheckThisIndexedPropertySetter, 1151 CheckThisIndexedPropertyHandler, CheckThisIndexedPropertySetter,
1601 CheckThisIndexedPropertyQuery, CheckThisIndexedPropertyDeleter, 1152 CheckThisIndexedPropertyQuery, CheckThisIndexedPropertyDeleter,
1602 CheckThisIndexedPropertyEnumerator, CheckThisIndexedPropertyDefiner)); 1153 CheckThisIndexedPropertyEnumerator));
1603 1154
1604 templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration( 1155 templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration(
1605 CheckThisNamedPropertyHandler, CheckThisNamedPropertySetter, 1156 CheckThisNamedPropertyHandler, CheckThisNamedPropertySetter,
1606 CheckThisNamedPropertyQuery, CheckThisNamedPropertyDeleter, 1157 CheckThisNamedPropertyQuery, CheckThisNamedPropertyDeleter,
1607 CheckThisNamedPropertyEnumerator, CheckThisNamedPropertyDefiner)); 1158 CheckThisNamedPropertyEnumerator));
1608 1159
1609 bottom = templ->GetFunction(env.local()) 1160 bottom = templ->GetFunction(env.local())
1610 .ToLocalChecked() 1161 .ToLocalChecked()
1611 ->NewInstance(env.local()) 1162 ->NewInstance(env.local())
1612 .ToLocalChecked(); 1163 .ToLocalChecked();
1613 Local<v8::Object> top = templ->GetFunction(env.local()) 1164 Local<v8::Object> top = templ->GetFunction(env.local())
1614 .ToLocalChecked() 1165 .ToLocalChecked()
1615 ->NewInstance(env.local()) 1166 ->NewInstance(env.local())
1616 .ToLocalChecked(); 1167 .ToLocalChecked();
1617 Local<v8::Object> middle = templ->GetFunction(env.local()) 1168 Local<v8::Object> middle = templ->GetFunction(env.local())
(...skipping 16 matching lines...) Expand all
1634 // Indexed and named query. 1185 // Indexed and named query.
1635 CompileRun("0 in obj"); 1186 CompileRun("0 in obj");
1636 CompileRun("'x' in obj"); 1187 CompileRun("'x' in obj");
1637 1188
1638 // Indexed and named deleter. 1189 // Indexed and named deleter.
1639 CompileRun("delete obj[0]"); 1190 CompileRun("delete obj[0]");
1640 CompileRun("delete obj.x"); 1191 CompileRun("delete obj.x");
1641 1192
1642 // Enumerators. 1193 // Enumerators.
1643 CompileRun("for (var p in obj) ;"); 1194 CompileRun("for (var p in obj) ;");
1644
1645 // Indexed and named definer.
1646 CompileRun("Object.defineProperty(obj, 2, {});");
1647 CompileRun("Object.defineProperty(obj, 'z', {});");
1648 } 1195 }
1649 1196
1650 1197
1651 bool is_bootstrapping = false; 1198 bool is_bootstrapping = false;
1652 static void PrePropertyHandlerGet( 1199 static void PrePropertyHandlerGet(
1653 Local<Name> key, const v8::PropertyCallbackInfo<v8::Value>& info) { 1200 Local<Name> key, const v8::PropertyCallbackInfo<v8::Value>& info) {
1654 ApiTestFuzzer::Fuzz(); 1201 ApiTestFuzzer::Fuzz();
1655 if (!is_bootstrapping && 1202 if (!is_bootstrapping &&
1656 v8_str("pre") 1203 v8_str("pre")
1657 ->Equals(info.GetIsolate()->GetCurrentContext(), key) 1204 ->Equals(info.GetIsolate()->GetCurrentContext(), key)
(...skipping 2780 matching lines...) Expand 10 before | Expand all | Expand 10 after
4438 ->Set(env.local(), v8_str("Fun"), 3985 ->Set(env.local(), v8_str("Fun"),
4439 fun_templ->GetFunction(env.local()).ToLocalChecked()) 3986 fun_templ->GetFunction(env.local()).ToLocalChecked())
4440 .FromJust()); 3987 .FromJust());
4441 3988
4442 CompileRun( 3989 CompileRun(
4443 "var f = new Fun();" 3990 "var f = new Fun();"
4444 "Number.prototype.__proto__ = f;" 3991 "Number.prototype.__proto__ = f;"
4445 "var a = 42;" 3992 "var a = 42;"
4446 "for (var i = 0; i<3; i++) { a.foo; }"); 3993 "for (var i = 0; i<3; i++) { a.foo; }");
4447 } 3994 }
OLDNEW
« no previous file with comments | « src/objects-inl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698