68 static const int kPackedSizeNotKnown = -1;
76 #define ELEMENTS_LIST(V) \
77 V(FastPackedSmiElementsAccessor, FAST_SMI_ELEMENTS, FixedArray) \
78 V(FastHoleySmiElementsAccessor, FAST_HOLEY_SMI_ELEMENTS, \
80 V(FastPackedObjectElementsAccessor, FAST_ELEMENTS, FixedArray) \
81 V(FastHoleyObjectElementsAccessor, FAST_HOLEY_ELEMENTS, FixedArray) \
82 V(FastPackedDoubleElementsAccessor, FAST_DOUBLE_ELEMENTS, \
84 V(FastHoleyDoubleElementsAccessor, FAST_HOLEY_DOUBLE_ELEMENTS, \
86 V(DictionaryElementsAccessor, DICTIONARY_ELEMENTS, \
87 SeededNumberDictionary) \
88 V(NonStrictArgumentsElementsAccessor, NON_STRICT_ARGUMENTS_ELEMENTS, \
90 V(ExternalByteElementsAccessor, EXTERNAL_BYTE_ELEMENTS, \
92 V(ExternalUnsignedByteElementsAccessor, \
93 EXTERNAL_UNSIGNED_BYTE_ELEMENTS, ExternalUnsignedByteArray) \
94 V(ExternalShortElementsAccessor, EXTERNAL_SHORT_ELEMENTS, \
96 V(ExternalUnsignedShortElementsAccessor, \
97 EXTERNAL_UNSIGNED_SHORT_ELEMENTS, ExternalUnsignedShortArray) \
98 V(ExternalIntElementsAccessor, EXTERNAL_INT_ELEMENTS, \
100 V(ExternalUnsignedIntElementsAccessor, \
101 EXTERNAL_UNSIGNED_INT_ELEMENTS, ExternalUnsignedIntArray) \
102 V(ExternalFloatElementsAccessor, \
103 EXTERNAL_FLOAT_ELEMENTS, ExternalFloatArray) \
104 V(ExternalDoubleElementsAccessor, \
105 EXTERNAL_DOUBLE_ELEMENTS, ExternalDoubleArray) \
106 V(PixelElementsAccessor, EXTERNAL_PIXEL_ELEMENTS, ExternalPixelArray)
114 #define ELEMENTS_TRAITS(Class, KindParam, Store) \
115 template<> class ElementsKindTraits<KindParam> { \
117 static const ElementsKind Kind = KindParam; \
118 typedef Store BackingStore; \
121 #undef ELEMENTS_TRAITS
124 ElementsAccessor** ElementsAccessor::elements_accessors_;
127 static bool HasKey(FixedArray* array,
Object* key) {
128 int len0 = array->length();
129 for (
int i = 0; i < len0; i++) {
130 Object* element = array->get(i);
131 if (element->IsSmi() && element == key)
return true;
132 if (element->IsString() &&
141 static Failure* ThrowArrayLengthRangeError(Heap* heap) {
142 HandleScope scope(heap->isolate());
143 return heap->isolate()->Throw(
144 *heap->isolate()->factory()->NewRangeError(
"invalid_array_length",
145 HandleVector<Object>(
NULL, 0)));
157 int copy_size = raw_copy_size;
158 if (raw_copy_size < 0) {
161 copy_size =
Min(from->
length() - from_start,
167 for (
int i = to_start + copy_size; i < to->
length(); ++i) {
173 ASSERT((copy_size + static_cast<int>(to_start)) <= to->
length() &&
174 (copy_size +
static_cast<int>(from_start)) <= from->
length());
175 if (copy_size == 0)
return;
180 CopyWords(reinterpret_cast<Object**>(to_address) + to_start,
181 reinterpret_cast<Object**>(from_address) + from_start,
196 static void CopyDictionaryToObjectElements(SeededNumberDictionary* from,
202 int copy_size = raw_copy_size;
203 Heap* heap = from->GetHeap();
204 if (raw_copy_size < 0) {
207 copy_size = from->max_number_key() + 1 - from_start;
212 for (
int i = to_start + copy_size; i < to->length(); ++i) {
213 ASSERT(to->get(i)->IsTheHole());
220 if (copy_size == 0)
return;
221 uint32_t to_length = to->length();
222 if (to_start + copy_size > to_length) {
223 copy_size = to_length - to_start;
225 for (
int i = 0; i < copy_size; i++) {
226 int entry = from->FindEntry(i + from_start);
228 Object* value = from->ValueAt(entry);
229 ASSERT(!value->IsTheHole());
232 to->set_the_hole(i + to_start);
236 if (!heap->InNewSpace(to)) {
237 heap->RecordWrites(to->address(),
238 to->OffsetOfElementAt(to_start),
241 heap->incremental_marking()->RecordWrites(to);
247 FixedDoubleArray* from,
254 int copy_size = raw_copy_size;
255 if (raw_copy_size < 0) {
258 copy_size =
Min(from->length() - from_start,
259 to->length() - to_start);
264 for (
int i = to_start + copy_size; i < to->length(); ++i) {
265 ASSERT(to->get(i)->IsTheHole());
270 ASSERT((copy_size + static_cast<int>(to_start)) <= to->length() &&
271 (copy_size +
static_cast<int>(from_start)) <= from->length());
272 if (copy_size == 0)
return from;
273 for (
int i = 0; i < copy_size; ++i) {
278 MaybeObject* maybe_value = from->get(i + from_start);
286 if (!maybe_value->ToObject(&value)) {
287 ASSERT(maybe_value->IsRetryAfterGC() || maybe_value->IsOutOfMemory());
288 Heap* heap = from->GetHeap();
289 MaybeObject* maybe_value_object =
290 heap->AllocateHeapNumber(from->get_scalar(i + from_start),
292 if (!maybe_value_object->ToObject(&value))
return maybe_value_object;
301 static void CopyDoubleToDoubleElements(FixedDoubleArray* from,
303 FixedDoubleArray* to,
306 int copy_size = raw_copy_size;
307 if (raw_copy_size < 0) {
310 copy_size =
Min(from->length() - from_start,
311 to->length() - to_start);
313 for (
int i = to_start + copy_size; i < to->length(); ++i) {
318 ASSERT((copy_size + static_cast<int>(to_start)) <= to->length() &&
319 (copy_size +
static_cast<int>(from_start)) <= from->length());
320 if (copy_size == 0)
return;
326 CopyWords(reinterpret_cast<Object**>(to_address),
327 reinterpret_cast<Object**>(from_address),
328 words_per_double * copy_size);
332 static void CopySmiToDoubleElements(FixedArray* from,
334 FixedDoubleArray* to,
337 int copy_size = raw_copy_size;
338 if (raw_copy_size < 0) {
341 copy_size = from->length() - from_start;
343 for (
int i = to_start + copy_size; i < to->length(); ++i) {
348 ASSERT((copy_size + static_cast<int>(to_start)) <= to->length() &&
349 (copy_size +
static_cast<int>(from_start)) <= from->length());
350 if (copy_size == 0)
return;
351 Object* the_hole = from->GetHeap()->the_hole_value();
352 for (uint32_t from_end = from_start + static_cast<uint32_t>(copy_size);
353 from_start < from_end; from_start++, to_start++) {
354 Object* hole_or_smi = from->get(from_start);
355 if (hole_or_smi == the_hole) {
356 to->set_the_hole(to_start);
358 to->set(to_start,
Smi::cast(hole_or_smi)->value());
364 static void CopyPackedSmiToDoubleElements(FixedArray* from,
366 FixedDoubleArray* to,
370 int copy_size = raw_copy_size;
372 if (raw_copy_size < 0) {
375 copy_size = from->length() - from_start;
377 to_end = to->length();
379 to_end = to_start +
static_cast<uint32_t
>(copy_size);
382 to_end = to_start +
static_cast<uint32_t
>(copy_size);
384 ASSERT(static_cast<int>(to_end) <= to->length());
385 ASSERT(packed_size >= 0 && packed_size <= copy_size);
386 ASSERT((copy_size + static_cast<int>(to_start)) <= to->length() &&
387 (copy_size +
static_cast<int>(from_start)) <= from->length());
388 if (copy_size == 0)
return;
389 for (uint32_t from_end = from_start + static_cast<uint32_t>(packed_size);
390 from_start < from_end; from_start++, to_start++) {
391 Object* smi = from->get(from_start);
392 ASSERT(!smi->IsTheHole());
393 to->set(to_start,
Smi::cast(smi)->value());
396 while (to_start < to_end) {
397 to->set_the_hole(to_start++);
402 static void CopyObjectToDoubleElements(FixedArray* from,
404 FixedDoubleArray* to,
407 int copy_size = raw_copy_size;
408 if (raw_copy_size < 0) {
411 copy_size = from->length() - from_start;
413 for (
int i = to_start + copy_size; i < to->length(); ++i) {
418 ASSERT((copy_size + static_cast<int>(to_start)) <= to->length() &&
419 (copy_size +
static_cast<int>(from_start)) <= from->length());
420 if (copy_size == 0)
return;
421 Object* the_hole = from->GetHeap()->the_hole_value();
422 for (uint32_t from_end = from_start + copy_size;
423 from_start < from_end; from_start++, to_start++) {
424 Object* hole_or_object = from->get(from_start);
425 if (hole_or_object == the_hole) {
426 to->set_the_hole(to_start);
428 to->set(to_start, hole_or_object->Number());
434 static void CopyDictionaryToDoubleElements(SeededNumberDictionary* from,
436 FixedDoubleArray* to,
439 int copy_size = raw_copy_size;
443 copy_size = from->max_number_key() + 1 - from_start;
445 for (
int i = to_start + copy_size; i < to->length(); ++i) {
450 if (copy_size == 0)
return;
451 uint32_t to_length = to->length();
452 if (to_start + copy_size > to_length) {
453 copy_size = to_length - to_start;
455 for (
int i = 0; i < copy_size; i++) {
456 int entry = from->FindEntry(i + from_start);
458 to->set(i + to_start, from->ValueAt(entry)->Number());
460 to->set_the_hole(i + to_start);
483 template <
typename ElementsAccessorSubclass,
484 typename ElementsTraitsParam>
501 if (fixed_array_base->IsFailure())
return;
502 if (!fixed_array_base->IsHeapObject())
return;
503 Map* map = fixed_array_base->
map();
506 if (map == heap->raw_unchecked_one_pointer_filler_map() ||
507 map == heap->raw_unchecked_two_pointer_filler_map() ||
508 map == heap->free_space_map()) {
512 if (holder->IsJSArray()) {
514 if (length_obj->IsSmi()) {
518 length = fixed_array_base->
length();
520 ElementsAccessorSubclass::ValidateContents(holder, length);
524 ElementsAccessorSubclass::ValidateImpl(holder);
531 MaybeObject* element =
532 ElementsAccessorSubclass::GetImpl(receiver, holder, key, backing_store);
533 return !element->IsTheHole();
540 if (backing_store ==
NULL) {
541 backing_store = holder->elements();
543 return ElementsAccessorSubclass::HasElementImpl(
544 receiver, holder, key, BackingStore::cast(backing_store));
551 if (backing_store ==
NULL) {
552 backing_store = holder->elements();
554 return ElementsAccessorSubclass::GetImpl(
555 receiver, holder, key, BackingStore::cast(backing_store));
562 return (key < ElementsAccessorSubclass::GetCapacityImpl(backing_store))
563 ? backing_store->get(key)
564 : backing_store->
GetHeap()->the_hole_value();
569 return ElementsAccessorSubclass::SetLengthImpl(
570 array, length, BackingStore::cast(array->elements()));
582 return ElementsAccessorSubclass::SetFastElementsCapacityAndLength(
618 int packed_size = kPackedSizeNotKnown;
620 from = from_holder->elements();
626 from_holder->IsJSArray();
629 if (copy_size >= 0 && packed_size > copy_size) {
630 packed_size = copy_size;
634 if (from->
length() == 0) {
637 return ElementsAccessorSubclass::CopyElementsImpl(
638 from, from_start, to, to_kind, to_start, packed_size, copy_size);
649 for (
int i = 0; i < len0; i++) {
655 from = holder->elements();
658 uint32_t len1 = ElementsAccessorSubclass::GetCapacityImpl(backing_store);
662 if (len1 == 0)
return to;
666 for (uint32_t y = 0; y < len1; y++) {
668 ElementsAccessorSubclass::GetKeyForIndexImpl(backing_store, y);
669 if (ElementsAccessorSubclass::HasElementImpl(
670 receiver, holder, key, backing_store)) {
671 MaybeObject* maybe_value =
672 ElementsAccessorSubclass::GetImpl(receiver, holder,
675 if (!maybe_value->ToObject(&value))
return maybe_value;
676 ASSERT(!value->IsTheHole());
677 if (!HasKey(to, value)) {
683 if (extra == 0)
return to;
687 MaybeObject* maybe_obj =
689 if (!maybe_obj->To<
FixedArray>(&result))
return maybe_obj;
695 for (
int i = 0; i < len0; i++) {
697 ASSERT(e->IsString() || e->IsNumber());
698 result->
set(i, e, mode);
703 for (uint32_t y = 0; y < len1; y++) {
705 ElementsAccessorSubclass::GetKeyForIndexImpl(backing_store, y);
706 if (ElementsAccessorSubclass::HasElementImpl(
707 receiver, holder, key, backing_store)) {
708 MaybeObject* maybe_value =
709 ElementsAccessorSubclass::GetImpl(receiver, holder,
712 if (!maybe_value->ToObject(&value))
return maybe_value;
713 if (!value->IsTheHole() && !HasKey(to, value)) {
714 result->
set(len0 + index, value);
725 return backing_store->
length();
729 return ElementsAccessorSubclass::GetCapacityImpl(
730 BackingStore::cast(backing_store));
740 return ElementsAccessorSubclass::GetKeyForIndexImpl(
741 BackingStore::cast(backing_store), index);
750 template<
typename FastElementsAccessorSubclass,
771 uint32_t old_capacity = backing_store->
length();
772 Object* old_length = array->length();
773 bool same_size = old_length->IsSmi() &&
781 if (maybe_obj->IsFailure())
return maybe_obj;
785 if (length <= old_capacity) {
788 if (!maybe_obj->To(&backing_store))
return maybe_obj;
790 if (2 * length <= old_capacity) {
797 BackingStore::OffsetOfElementAt(length);
798 int filler_size = (old_capacity - length) * ElementSize;
804 for (
int i = length; i < old_length; i++) {
805 backing_store->set_the_hole(i);
808 return length_object;
813 uint32_t new_capacity = length > min ? length : min;
815 MaybeObject* result = FastElementsAccessorSubclass::
816 SetFastElementsCapacityAndLength(array, new_capacity, length);
817 if (result->IsFailure())
return result;
819 return length_object;
823 return array->
GetHeap()->undefined_value();
832 typename KindTraits::BackingStore* backing_store =
833 KindTraits::BackingStore::cast(obj->elements());
835 if (backing_store->map() == heap->non_strict_arguments_elements_map()) {
837 KindTraits::BackingStore::cast(
842 MaybeObject* transitioned =
844 if (transitioned->IsFailure())
return transitioned;
849 if (!maybe->ToObject(&writable))
return maybe;
850 backing_store = KindTraits::BackingStore::cast(writable);
853 uint32_t length =
static_cast<uint32_t
>(
856 : backing_store->length());
858 backing_store->set_the_hole(key);
863 const int kMinLengthForSparsenessCheck = 64;
864 if (backing_store->length() >= kMinLengthForSparsenessCheck &&
865 !heap->InNewSpace(backing_store) &&
866 ((key > 0 && backing_store->is_the_hole(key - 1)) ||
867 (key + 1 < length && backing_store->is_the_hole(key + 1)))) {
869 for (
int i = 0; i < backing_store->length(); ++i) {
870 if (!backing_store->is_the_hole(i)) ++num_used;
872 if (4 * num_used > backing_store->length())
break;
874 if (4 * num_used <= backing_store->length()) {
876 if (result->IsFailure())
return result;
880 return heap->true_value();
893 typename KindTraits::BackingStore* backing_store) {
894 if (key >= static_cast<uint32_t>(backing_store->length())) {
897 return !backing_store->is_the_hole(key);
904 Map* map = elements->
map();
906 (map == heap->fixed_array_map() ||
907 map == heap->fixed_cow_array_map())) ||
909 ((map == heap->fixed_array_map() && length == 0) ||
910 map == heap->fixed_double_array_map())));
911 for (
int i = 0; i < length; i++) {
912 typename KindTraits::BackingStore* backing_store =
913 KindTraits::BackingStore::cast(elements);
915 static_cast<Object*>(backing_store->get(i))->IsSmi()) ||
917 backing_store->is_the_hole(i)));
924 template<
typename FastElementsAccessorSubclass,
950 packed_size != kPackedSizeNotKnown) {
951 CopyPackedSmiToDoubleElements(
954 packed_size, copy_size);
956 CopySmiToDoubleElements(
961 CopyObjectToDoubleElements(
968 return to->
GetHeap()->undefined_value();
988 FastPackedSmiElementsAccessor,
989 ElementsKindTraits<FAST_SMI_ELEMENTS> > {
1000 FastHoleySmiElementsAccessor,
1001 ElementsKindTraits<FAST_HOLEY_SMI_ELEMENTS> > {
1012 FastPackedObjectElementsAccessor,
1013 ElementsKindTraits<FAST_ELEMENTS> > {
1024 FastHoleyObjectElementsAccessor,
1025 ElementsKindTraits<FAST_HOLEY_ELEMENTS> > {
1034 template<
typename FastElementsAccessorSubclass,
1035 typename KindTraits>
1055 uint32_t from_start,
1066 return CopyDoubleToObjectElements(
1068 to_kind, to_start, copy_size);
1073 to_start, copy_size);
1078 return to->
GetHeap()->undefined_value();
1085 FastPackedDoubleElementsAccessor,
1086 ElementsKindTraits<FAST_DOUBLE_ELEMENTS> > {
1092 FastPackedDoubleElementsAccessor,
1099 FastHoleyDoubleElementsAccessor,
1100 ElementsKindTraits<FAST_HOLEY_DOUBLE_ELEMENTS> > {
1103 FastHoleyDoubleElementsAccessor,
1107 FastHoleyDoubleElementsAccessor,
1113 template<
typename ExternalElementsAccessorSubclass,
1117 ElementsKindTraits<Kind> > {
1134 key < ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store)
1135 ? backing_store->get(key)
1136 : backing_store->
GetHeap()->undefined_value();
1152 return obj->
GetHeap()->true_value();
1160 ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store);
1161 return key < capacity;
1168 EXTERNAL_BYTE_ELEMENTS> {
1178 EXTERNAL_UNSIGNED_BYTE_ELEMENTS> {
1188 EXTERNAL_SHORT_ELEMENTS> {
1198 EXTERNAL_UNSIGNED_SHORT_ELEMENTS> {
1208 EXTERNAL_INT_ELEMENTS> {
1218 EXTERNAL_UNSIGNED_INT_ELEMENTS> {
1228 EXTERNAL_FLOAT_ELEMENTS> {
1238 EXTERNAL_DOUBLE_ELEMENTS> {
1248 EXTERNAL_PIXEL_ELEMENTS> {
1258 ElementsKindTraits<DICTIONARY_ELEMENTS> > {
1273 uint32_t new_length = length;
1274 uint32_t old_length =
static_cast<uint32_t
>(array->length()->
Number());
1275 if (new_length < old_length) {
1278 for (
int i = 0; i < capacity; i++) {
1280 if (key->IsNumber()) {
1281 uint32_t number =
static_cast<uint32_t
>(key->
Number());
1282 if (new_length <= number && number < old_length) {
1283 PropertyDetails details = dict->
DetailsAt(i);
1284 if (details.IsDontDelete()) new_length = number + 1;
1288 if (new_length != length) {
1290 if (!maybe_object->To(&length_object))
return maybe_object;
1294 if (new_length == 0) {
1300 if (!maybe_obj->ToObject(&obj))
return maybe_obj;
1303 int removed_entries = 0;
1304 Object* the_hole_value = heap->the_hole_value();
1305 for (
int i = 0; i < capacity; i++) {
1307 if (key->IsNumber()) {
1308 uint32_t number =
static_cast<uint32_t
>(key->
Number());
1309 if (new_length <= number && number < old_length) {
1310 dict->
SetEntry(i, the_hole_value, the_hole_value);
1319 return length_object;
1339 if (result == heap->false_value()) {
1349 return isolate->
Throw(*error);
1351 return heap->false_value();
1353 MaybeObject* maybe_elements = dictionary->
Shrink(key);
1355 if (!maybe_elements->To(&new_elements)) {
1356 return maybe_elements;
1361 obj->set_elements(new_elements);
1364 return heap->true_value();
1368 uint32_t from_start,
1379 CopyDictionaryToObjectElements(
1385 CopyDictionaryToDoubleElements(
1392 return to->
GetHeap()->undefined_value();
1411 int entry = backing_store->
FindEntry(key);
1414 PropertyDetails details = backing_store->
DetailsAt(entry);
1416 return obj->GetElementWithCallback(receiver,
1424 return obj->
GetHeap()->the_hole_value();
1444 NonStrictArgumentsElementsAccessor,
1445 ElementsKindTraits<NON_STRICT_ARGUMENTS_ELEMENTS> > {
1460 Object* probe = GetParameterMapArg(obj, parameter_map, key);
1461 if (!probe->IsTheHole()) {
1464 ASSERT(!context->
get(context_index)->IsTheHole());
1465 return context->
get(context_index);
1470 receiver, obj, key, arguments);
1472 if (!maybe_result->ToObject(&result))
return maybe_result;
1474 if (result->IsAliasedArgumentsEntry()) {
1478 ASSERT(!context->
get(context_index)->IsTheHole());
1479 return context->
get(context_index);
1500 Object* probe = GetParameterMapArg(obj, parameter_map, key);
1501 if (!probe->IsTheHole()) {
1508 if (arguments->IsDictionary()) {
1517 return obj->
GetHeap()->true_value();
1521 uint32_t from_start,
1530 return accessor->CopyElements(
NULL, from_start, to, to_kind,
1531 to_start, copy_size, arguments);
1536 return Max(static_cast<uint32_t>(parameter_map->
length() - 2),
1549 Object* probe = GetParameterMapArg(holder, parameter_map, key);
1550 if (!probe->IsTheHole()) {
1555 return !accessor->Get(receiver, holder, key, arguments)->IsTheHole();
1563 uint32_t length = holder->IsJSArray()
1565 : parameter_map->
length();
1566 return key < (length - 2 )
1567 ? parameter_map->
get(key + 2)
1568 : parameter_map->
GetHeap()->the_hole_value();
1576 if (array->IsDictionary()) {
1608 #define ACCESSOR_ARRAY(Class, Kind, Store) new Class(#Kind),
1610 #undef ACCESSOR_ARRAY
1613 STATIC_ASSERT((
sizeof(accessor_array) /
sizeof(*accessor_array)) ==
1616 elements_accessors_ = accessor_array;
1621 #define ACCESSOR_DELETE(Class, Kind, Store) delete elements_accessors_[Kind];
1623 #undef ACCESSOR_DELETE
1624 elements_accessors_ =
NULL;
1628 template <
typename ElementsAccessorSub
class,
typename ElementsKindTraits>
1637 MaybeObject* maybe_smi_length = length->
ToSmi();
1639 if (maybe_smi_length->ToObject(&smi_length) && smi_length->IsSmi()) {
1643 MaybeObject* result = ElementsAccessorSubclass::
1644 SetLengthWithoutNormalize(backing_store, array, smi_length, value);
1645 if (!result->ToObject(&new_length))
return result;
1646 ASSERT(new_length->IsSmi() || new_length->IsUndefined());
1647 if (new_length->IsSmi()) {
1652 return ThrowArrayLengthRangeError(array->
GetHeap());
1658 if (length->IsNumber()) {
1663 if (!maybe_object->To(&dictionary))
return maybe_object;
1667 if (!result->ToObject(&new_length))
return result;
1668 ASSERT(new_length->IsNumber());
1672 return ThrowArrayLengthRangeError(array->
GetHeap());
1680 if (!maybe_obj->To(&new_backing_store))
return maybe_obj;
1681 new_backing_store->
set(0, length);
1682 { MaybeObject* result = array->
SetContent(new_backing_store);
1683 if (result->IsFailure())
return result;
bool FLAG_enable_slow_asserts
static MUST_USE_RESULT MaybeObject * SetLengthImpl(JSObject *obj, Object *length, BackingStore *backing_store)
Object * KeyAt(int entry)
static MUST_USE_RESULT MaybeObject * GetImpl(Object *receiver, JSObject *obj, uint32_t key, BackingStore *backing_store)
FastDoubleElementsAccessor(const char *name)
#define ACCESSOR_DELETE(Class, Kind, Store)
#define ACCESSOR_ARRAY(Class, Kind, Store)
static const int kNotFound
MUST_USE_RESULT MaybeObject * AllocateFixedArray(int length, PretenureFlag pretenure)
static MUST_USE_RESULT MaybeObject * GetImpl(Object *receiver, JSObject *obj, uint32_t key, FixedArray *parameter_map)
void set(int index, Object *value)
virtual MUST_USE_RESULT MaybeObject * Delete(JSObject *obj, uint32_t key, JSReceiver::DeleteMode mode)
bool InNewSpace(Object *object)
static String * cast(Object *obj)
static uint32_t GetCapacityImpl(FixedArray *parameter_map)
virtual MUST_USE_RESULT MaybeObject * AddElementsToFixedArray(Object *receiver, JSObject *holder, FixedArray *to, FixedArrayBase *from)
FastSmiOrObjectElementsAccessor(const char *name)
static bool HasElementImpl(Object *receiver, JSObject *holder, uint32_t key, SeededNumberDictionary *backing_store)
ElementsTraitsParam::BackingStore BackingStore
void set_length(Smi *length)
static Smi * FromInt(int value)
bool HasFastSmiElements()
bool IsFastObjectElementsKind(ElementsKind kind)
MUST_USE_RESULT MaybeObject * ToSmi()
virtual MUST_USE_RESULT MaybeObject * SetCapacityAndLength(JSArray *array, int capacity, int length)
static bool HasElementImpl(Object *receiver, JSObject *holder, uint32_t key, BackingStore *backing_store)
static bool HasElementImpl(Object *receiver, JSObject *holder, uint32_t key, BackingStore *backing_store)
static MUST_USE_RESULT MaybeObject * SetLengthImpl(JSObject *obj, Object *length, BackingStore *backing_store)
virtual void Validate(JSObject *holder)
ExternalElementsAccessor(const char *name)
ExternalShortElementsAccessor(const char *name)
virtual MUST_USE_RESULT MaybeObject * SetLength(JSArray *array, Object *length)
static Failure * Exception()
static MaybeObject * SetFastElementsCapacityAndLength(JSObject *obj, uint32_t capacity, uint32_t length)
static AliasedArgumentsEntry * cast(Object *obj)
DictionaryElementsAccessor(const char *name)
static Handle< Object > TransitionElementsKind(Handle< JSObject > object, ElementsKind to_kind)
#define ASSERT(condition)
virtual MUST_USE_RESULT MaybeObject * Delete(JSObject *obj, uint32_t key, JSReceiver::DeleteMode mode)
KindTraits::BackingStore BackingStore
static MUST_USE_RESULT MaybeObject * SetLengthWithoutNormalize(SeededNumberDictionary *dict, JSArray *array, Object *length_object, uint32_t length)
virtual MUST_USE_RESULT MaybeObject * Delete(JSObject *obj, uint32_t key, JSReceiver::DeleteMode mode)
static Context * cast(Object *context)
ElementsTraitsParam ElementsTraits
ExternalUnsignedByteElementsAccessor(const char *name)
ExternalDoubleElementsAccessor(const char *name)
FixedArrayBase BackingStore
virtual bool HasElement(Object *receiver, JSObject *holder, uint32_t key, FixedArrayBase *backing_store)
void initialize_elements()
FastElementsAccessor(const char *name)
ExternalByteElementsAccessor(const char *name)
static uint32_t GetKeyForIndexImpl(SeededNumberDictionary *dict, uint32_t index)
bool IsFastElementsKind(ElementsKind kind)
MUST_USE_RESULT MaybeObject * EnsureWritableFastElements()
void set_the_hole(int index)
ExternalFloatElementsAccessor(const char *name)
static Smi * cast(Object *object)
bool Equals(String *other)
static MUST_USE_RESULT MaybeObject * DeleteCommon(JSObject *obj, uint32_t key, JSReceiver::DeleteMode mode)
static MUST_USE_RESULT MaybeObject * CopyElementsImpl(FixedArrayBase *from, uint32_t from_start, FixedArrayBase *to, ElementsKind to_kind, uint32_t to_start, int packed_size, int copy_size)
FastHoleyObjectElementsAccessor(const char *name)
static const int kCopyToEnd
static uint32_t GetKeyForIndexImpl(FixedArray *dict, uint32_t index)
Object * ValueAt(int entry)
void CopyWords(T *dst, T *src, int num_words)
bool HasFastSmiOrObjectElements()
virtual ElementsKind kind() const
static void ValidateImpl(JSObject *holder)
STATIC_ASSERT((FixedDoubleArray::kHeaderSize &kDoubleAlignmentMask)==0)
static SeededNumberDictionary * cast(Object *obj)
MUST_USE_RESULT MaybeObject * SetContent(FixedArrayBase *storage)
bool IsFastPackedElementsKind(ElementsKind kind)
static void ValidateContents(JSObject *holder, int length)
static MUST_USE_RESULT MaybeObject * SetFastElementsCapacityAndLength(JSObject *obj, int capacity, int length)
NonStrictArgumentsElementsAccessor(const char *name)
virtual MUST_USE_RESULT MaybeObject * Get(Object *receiver, JSObject *holder, uint32_t key, FixedArrayBase *backing_store)
static MaybeObject * DeleteCommon(JSObject *obj, uint32_t key, JSReceiver::DeleteMode mode)
int FastD2IChecked(double x)
bool ToArrayIndex(uint32_t *index)
MUST_USE_RESULT MaybeObject * ResetElements()
ElementsKind GetElementsKind()
FastPackedObjectElementsAccessor(const char *name)
static uint32_t GetKeyForIndexImpl(BackingStore *backing_store, uint32_t index)
static MaybeObject * CopyElementsImpl(FixedArrayBase *from, uint32_t from_start, FixedArrayBase *to, ElementsKind to_kind, uint32_t to_start, int packed_size, int copy_size)
static bool HasElementImpl(Object *receiver, JSObject *holder, uint32_t key, FixedArray *parameter_map)
static void InitializeOncePerProcess()
static MUST_USE_RESULT MaybeObject * GetImpl(Object *receiver, JSObject *obj, uint32_t key, BackingStore *backing_store)
SetFastElementsCapacitySmiMode
void RecordWrites(HeapObject *obj)
static FixedDoubleArray * cast(Object *obj)
#define ELEMENTS_TRAITS(Class, KindParam, Store)
bool IsFastSmiElementsKind(ElementsKind kind)
static MUST_USE_RESULT MaybeObject * CopyElementsImpl(FixedArrayBase *from, uint32_t from_start, FixedArrayBase *to, ElementsKind to_kind, uint32_t to_start, int packed_size, int copy_size)
void set_length(int value)
MUST_USE_RESULT MaybeObject * SetFastElementsCapacityAndLength(int capacity, int length, SetFastElementsCapacitySmiMode smi_mode)
static ElementsAccessor * ForArray(FixedArrayBase *array)
WriteBarrierMode GetWriteBarrierMode(const AssertNoAllocation &)
MUST_USE_RESULT MaybeObject * Shrink(Key key)
virtual MUST_USE_RESULT MaybeObject * Get(Object *receiver, JSObject *holder, uint32_t key, FixedArrayBase *backing_store=NULL)=0
Failure * Throw(Object *exception, MessageLocation *location=NULL)
virtual MUST_USE_RESULT MaybeObject * CopyElements(JSObject *from_holder, uint32_t from_start, FixedArrayBase *to, ElementsKind to_kind, uint32_t to_start, int copy_size, FixedArrayBase *from)
static int OffsetOfElementAt(int index)
static JSArray * cast(Object *obj)
ExternalIntElementsAccessor(const char *name)
bool IsFastSmiOrObjectElementsKind(ElementsKind kind)
void RecordWrites(Address address, int start, int len)
FastPackedSmiElementsAccessor(const char *name)
const int kElementsKindCount
static const int kHeaderSize
FastPackedDoubleElementsAccessor(const char *name)
MUST_USE_RESULT MaybeObject * SetFastDoubleElementsCapacityAndLength(int capacity, int length)
void CopyObjectToObjectElements(FixedArray *from, ElementsKind from_kind, uint32_t from_start, FixedArray *to, ElementsKind to_kind, uint32_t to_start, int raw_copy_size)
bool ShouldConvertToSlowElements(int new_capacity)
static const int kCopyToEndAndInitializeToHole
ElementsKindTraits< Kind >::BackingStore BackingStore
static MaybeObject * SetLengthWithoutNormalize(BackingStore *backing_store, JSArray *array, Object *length_object, uint32_t length)
MUST_USE_RESULT MaybeObject * NumberFromUint32(uint32_t value, PretenureFlag pretenure=NOT_TENURED)
IncrementalMarking * incremental_marking()
static MUST_USE_RESULT MaybeObject * SetLengthImpl(JSObject *obj, Object *length, FixedArray *parameter_map)
PropertyDetails DetailsAt(int entry)
Object * DeleteProperty(int entry, JSObject::DeleteMode mode)
Handle< Object > NewTypeError(const char *type, Vector< Handle< Object > > args)
ExternalUnsignedShortElementsAccessor(const char *name)
static Handle< SeededNumberDictionary > NormalizeElements(Handle< JSObject > object)
InstanceType instance_type()
static FixedArray * cast(Object *obj)
static bool HasElementImpl(Object *receiver, JSObject *holder, uint32_t key, typename KindTraits::BackingStore *backing_store)
static MUST_USE_RESULT MaybeObject * CopyElementsImpl(FixedArrayBase *from, uint32_t from_start, FixedArrayBase *to, ElementsKind to_kind, uint32_t to_start, int packed_size, int copy_size)
ExternalUnsignedIntElementsAccessor(const char *name)
void SetEntry(int entry, Object *key, Object *value)
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination use dead code elimination trace on stack replacement optimize closures cache optimized code for closures functions with arguments object loop weight for representation inference allow uint32 values on optimize frames if they are used only in safe operations track parallel recompilation enable all profiler experiments number of stack frames inspected by the profiler call recompile stub directly when self optimizing trigger profiler ticks based on counting instead of timing weight back edges by jump distance for interrupt triggering percentage of ICs that must have type info to allow optimization watch_ic_patching retry_self_opt interrupt_at_exit extra verbose compilation tracing generate extra emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of SAHF instruction if enable use of VFP3 instructions if available this implies enabling ARMv7 and VFP2 enable use of VFP2 instructions if available enable use of SDIV and UDIV instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of MIPS FPU instructions if NULL
bool IsFastHoleyElementsKind(ElementsKind kind)
bool HasFastDoubleElements()
bool HasFastArgumentsElements()
void CreateFillerObjectAt(Address addr, int size)
static MaybeObject * SetFastElementsCapacityAndLength(JSObject *obj, uint32_t capacity, uint32_t length)
virtual uint32_t GetCapacity(FixedArrayBase *backing_store)
PixelElementsAccessor(const char *name)
Vector< Handle< Object > > HandleVector(v8::internal::Handle< T > *elms, int length)
virtual MUST_USE_RESULT MaybeObject * Delete(JSObject *obj, uint32_t key, JSReceiver::DeleteMode mode)=0
int aliased_context_slot()
virtual uint32_t GetCapacity(FixedArrayBase *backing_store)=0
virtual uint32_t GetKeyForIndex(FixedArrayBase *backing_store, uint32_t index)
static int NewElementsCapacity(int old_capacity)
static FixedArrayBase * cast(Object *object)
ElementsAccessorBase(const char *name)
static uint32_t GetCapacityImpl(BackingStore *backing_store)
virtual MaybeObject * Delete(JSObject *obj, uint32_t key, JSReceiver::DeleteMode mode)
Handle< Object > NewNumberFromUint(uint32_t value, PretenureFlag pretenure=NOT_TENURED)
static void ValidateContents(JSObject *holder, int length)
ElementsKind GetHoleyElementsKind(ElementsKind packed_kind)
const char * name() const
void ElementsRemoved(int n)
FastHoleyDoubleElementsAccessor(const char *name)
FastHoleySmiElementsAccessor(const char *name)
static MUST_USE_RESULT MaybeObject * GetImpl(Object *receiver, JSObject *obj, uint32_t key, SeededNumberDictionary *backing_store)
bool IsFastDoubleElementsKind(ElementsKind kind)
static MaybeObject * CopyElementsImpl(FixedArrayBase *from, uint32_t from_start, FixedArrayBase *to, ElementsKind to_kind, uint32_t to_start, int packed_size, int copy_size)