| OLD | NEW |
| 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/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
| 8 #include "src/conversions.h" | 8 #include "src/conversions.h" |
| 9 #include "src/elements.h" | 9 #include "src/elements.h" |
| 10 #include "src/messages.h" | 10 #include "src/messages.h" |
| (...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 611 | 611 |
| 612 static Handle<Object> GetImpl(Handle<JSObject> obj, uint32_t key, | 612 static Handle<Object> GetImpl(Handle<JSObject> obj, uint32_t key, |
| 613 Handle<FixedArrayBase> backing_store) { | 613 Handle<FixedArrayBase> backing_store) { |
| 614 if (key < ElementsAccessorSubclass::GetCapacityImpl(*obj, *backing_store)) { | 614 if (key < ElementsAccessorSubclass::GetCapacityImpl(*obj, *backing_store)) { |
| 615 return BackingStore::get(Handle<BackingStore>::cast(backing_store), key); | 615 return BackingStore::get(Handle<BackingStore>::cast(backing_store), key); |
| 616 } else { | 616 } else { |
| 617 return backing_store->GetIsolate()->factory()->the_hole_value(); | 617 return backing_store->GetIsolate()->factory()->the_hole_value(); |
| 618 } | 618 } |
| 619 } | 619 } |
| 620 | 620 |
| 621 virtual Handle<Object> Set(Handle<JSObject> holder, uint32_t key, |
| 622 Handle<FixedArrayBase> backing_store, |
| 623 Handle<Object> value) final { |
| 624 return ElementsAccessorSubclass::SetImpl(holder, key, backing_store, value); |
| 625 } |
| 626 |
| 627 static Handle<Object> SetImpl(Handle<JSObject> obj, uint32_t key, |
| 628 Handle<FixedArrayBase> backing_store, |
| 629 Handle<Object> value) { |
| 630 CHECK(key < |
| 631 ElementsAccessorSubclass::GetCapacityImpl(*obj, *backing_store)); |
| 632 return BackingStore::SetValue( |
| 633 obj, Handle<BackingStore>::cast(backing_store), key, value); |
| 634 } |
| 635 |
| 621 virtual PropertyAttributes GetAttributes( | 636 virtual PropertyAttributes GetAttributes( |
| 622 JSObject* holder, uint32_t key, FixedArrayBase* backing_store) final { | 637 JSObject* holder, uint32_t key, FixedArrayBase* backing_store) final { |
| 623 return ElementsAccessorSubclass::GetAttributesImpl(holder, key, | 638 return ElementsAccessorSubclass::GetAttributesImpl(holder, key, |
| 624 backing_store); | 639 backing_store); |
| 625 } | 640 } |
| 626 | 641 |
| 627 static PropertyAttributes GetAttributesImpl(JSObject* obj, uint32_t key, | 642 static PropertyAttributes GetAttributesImpl(JSObject* obj, uint32_t key, |
| 628 FixedArrayBase* backing_store) { | 643 FixedArrayBase* backing_store) { |
| 629 if (key >= ElementsAccessorSubclass::GetCapacityImpl(obj, backing_store)) { | 644 if (key >= ElementsAccessorSubclass::GetCapacityImpl(obj, backing_store)) { |
| 630 return ABSENT; | 645 return ABSENT; |
| (...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1273 Handle<FixedArrayBase> backing_store) { | 1288 Handle<FixedArrayBase> backing_store) { |
| 1274 if (key < AccessorClass::GetCapacityImpl(*obj, *backing_store)) { | 1289 if (key < AccessorClass::GetCapacityImpl(*obj, *backing_store)) { |
| 1275 return BackingStore::get(Handle<BackingStore>::cast(backing_store), key); | 1290 return BackingStore::get(Handle<BackingStore>::cast(backing_store), key); |
| 1276 } else { | 1291 } else { |
| 1277 return backing_store->GetIsolate()->factory()->undefined_value(); | 1292 return backing_store->GetIsolate()->factory()->undefined_value(); |
| 1278 } | 1293 } |
| 1279 } | 1294 } |
| 1280 | 1295 |
| 1281 static PropertyAttributes GetAttributesImpl(JSObject* obj, uint32_t key, | 1296 static PropertyAttributes GetAttributesImpl(JSObject* obj, uint32_t key, |
| 1282 FixedArrayBase* backing_store) { | 1297 FixedArrayBase* backing_store) { |
| 1283 return key < AccessorClass::GetCapacityImpl(obj, backing_store) ? NONE | 1298 return key < AccessorClass::GetCapacityImpl(obj, backing_store) |
| 1284 : ABSENT; | 1299 ? DONT_DELETE |
| 1300 : ABSENT; |
| 1301 } |
| 1302 |
| 1303 static PropertyDetails GetDetailsImpl(FixedArrayBase* backing_store, |
| 1304 uint32_t index) { |
| 1305 return PropertyDetails(DONT_DELETE, DATA, 0, PropertyCellType::kNoCell); |
| 1285 } | 1306 } |
| 1286 | 1307 |
| 1287 MUST_USE_RESULT static MaybeHandle<Object> SetLengthImpl( | 1308 MUST_USE_RESULT static MaybeHandle<Object> SetLengthImpl( |
| 1288 Handle<JSObject> obj, | 1309 Handle<JSObject> obj, |
| 1289 Handle<Object> length, | 1310 Handle<Object> length, |
| 1290 Handle<FixedArrayBase> backing_store) { | 1311 Handle<FixedArrayBase> backing_store) { |
| 1291 // External arrays do not support changing their length. | 1312 // External arrays do not support changing their length. |
| 1292 UNREACHABLE(); | 1313 UNREACHABLE(); |
| 1293 return obj; | 1314 return obj; |
| 1294 } | 1315 } |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1446 Handle<SeededNumberDictionary> backing_store = | 1467 Handle<SeededNumberDictionary> backing_store = |
| 1447 Handle<SeededNumberDictionary>::cast(store); | 1468 Handle<SeededNumberDictionary>::cast(store); |
| 1448 Isolate* isolate = backing_store->GetIsolate(); | 1469 Isolate* isolate = backing_store->GetIsolate(); |
| 1449 int entry = backing_store->FindEntry(key); | 1470 int entry = backing_store->FindEntry(key); |
| 1450 if (entry != SeededNumberDictionary::kNotFound) { | 1471 if (entry != SeededNumberDictionary::kNotFound) { |
| 1451 return handle(backing_store->ValueAt(entry), isolate); | 1472 return handle(backing_store->ValueAt(entry), isolate); |
| 1452 } | 1473 } |
| 1453 return isolate->factory()->the_hole_value(); | 1474 return isolate->factory()->the_hole_value(); |
| 1454 } | 1475 } |
| 1455 | 1476 |
| 1477 static Handle<Object> SetImpl(Handle<JSObject> obj, uint32_t key, |
| 1478 Handle<FixedArrayBase> store, |
| 1479 Handle<Object> value) { |
| 1480 Handle<SeededNumberDictionary> backing_store = |
| 1481 Handle<SeededNumberDictionary>::cast(store); |
| 1482 int entry = backing_store->FindEntry(key); |
| 1483 DCHECK_NE(SeededNumberDictionary::kNotFound, entry); |
| 1484 backing_store->ValueAtPut(entry, *value); |
| 1485 return value; |
| 1486 } |
| 1487 |
| 1456 static PropertyAttributes GetAttributesImpl(JSObject* obj, uint32_t key, | 1488 static PropertyAttributes GetAttributesImpl(JSObject* obj, uint32_t key, |
| 1457 FixedArrayBase* backing_store) { | 1489 FixedArrayBase* backing_store) { |
| 1458 SeededNumberDictionary* dictionary = | 1490 SeededNumberDictionary* dictionary = |
| 1459 SeededNumberDictionary::cast(backing_store); | 1491 SeededNumberDictionary::cast(backing_store); |
| 1460 int entry = dictionary->FindEntry(key); | 1492 int entry = dictionary->FindEntry(key); |
| 1461 if (entry != SeededNumberDictionary::kNotFound) { | 1493 if (entry != SeededNumberDictionary::kNotFound) { |
| 1462 return dictionary->DetailsAt(entry).attributes(); | 1494 return dictionary->DetailsAt(entry).attributes(); |
| 1463 } | 1495 } |
| 1464 return ABSENT; | 1496 return ABSENT; |
| 1465 } | 1497 } |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1552 Context* context = Context::cast(parameter_map->get(0)); | 1584 Context* context = Context::cast(parameter_map->get(0)); |
| 1553 int context_index = entry->aliased_context_slot(); | 1585 int context_index = entry->aliased_context_slot(); |
| 1554 DCHECK(!context->get(context_index)->IsTheHole()); | 1586 DCHECK(!context->get(context_index)->IsTheHole()); |
| 1555 return handle(context->get(context_index), isolate); | 1587 return handle(context->get(context_index), isolate); |
| 1556 } else { | 1588 } else { |
| 1557 return result; | 1589 return result; |
| 1558 } | 1590 } |
| 1559 } | 1591 } |
| 1560 } | 1592 } |
| 1561 | 1593 |
| 1594 static Handle<Object> SetImpl(Handle<JSObject> obj, uint32_t key, |
| 1595 Handle<FixedArrayBase> store, |
| 1596 Handle<Object> value) { |
| 1597 Handle<FixedArray> parameter_map = Handle<FixedArray>::cast(store); |
| 1598 Object* probe = GetParameterMapArg(*parameter_map, key); |
| 1599 if (!probe->IsTheHole()) { |
| 1600 Context* context = Context::cast(parameter_map->get(0)); |
| 1601 int context_index = Smi::cast(probe)->value(); |
| 1602 DCHECK(!context->get(context_index)->IsTheHole()); |
| 1603 context->set(context_index, *value); |
| 1604 return value; |
| 1605 } |
| 1606 Handle<FixedArray> arguments(FixedArray::cast(parameter_map->get(1))); |
| 1607 return ElementsAccessor::ForArray(arguments) |
| 1608 ->Set(obj, key, arguments, value); |
| 1609 } |
| 1610 |
| 1562 static PropertyAttributes GetAttributesImpl(JSObject* obj, uint32_t key, | 1611 static PropertyAttributes GetAttributesImpl(JSObject* obj, uint32_t key, |
| 1563 FixedArrayBase* backing_store) { | 1612 FixedArrayBase* backing_store) { |
| 1564 FixedArray* parameter_map = FixedArray::cast(backing_store); | 1613 FixedArray* parameter_map = FixedArray::cast(backing_store); |
| 1565 Object* probe = GetParameterMapArg(parameter_map, key); | 1614 Object* probe = GetParameterMapArg(parameter_map, key); |
| 1566 if (!probe->IsTheHole()) { | 1615 if (!probe->IsTheHole()) { |
| 1567 return NONE; | 1616 return NONE; |
| 1568 } else { | 1617 } else { |
| 1569 // If not aliased, check the arguments. | 1618 // If not aliased, check the arguments. |
| 1570 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); | 1619 FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); |
| 1571 return ElementsAccessor::ForArray(arguments) | 1620 return ElementsAccessor::ForArray(arguments) |
| (...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1880 break; | 1929 break; |
| 1881 } | 1930 } |
| 1882 | 1931 |
| 1883 array->set_elements(*elms); | 1932 array->set_elements(*elms); |
| 1884 array->set_length(Smi::FromInt(number_of_elements)); | 1933 array->set_length(Smi::FromInt(number_of_elements)); |
| 1885 return array; | 1934 return array; |
| 1886 } | 1935 } |
| 1887 | 1936 |
| 1888 } // namespace internal | 1937 } // namespace internal |
| 1889 } // namespace v8 | 1938 } // namespace v8 |
| OLD | NEW |