v8  3.11.10(node0.8.26)
V8 is Google's open source JavaScript engine
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
elements.cc
Go to the documentation of this file.
1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 
28 #include "v8.h"
29 
30 #include "objects.h"
31 #include "elements.h"
32 #include "utils.h"
33 
34 
35 // Each concrete ElementsAccessor can handle exactly one ElementsKind,
36 // several abstract ElementsAccessor classes are used to allow sharing
37 // common code.
38 //
39 // Inheritance hierarchy:
40 // - ElementsAccessorBase (abstract)
41 // - FastElementsAccessor (abstract)
42 // - FastSmiOrObjectElementsAccessor
43 // - FastPackedSmiElementsAccessor
44 // - FastHoleySmiElementsAccessor
45 // - FastPackedObjectElementsAccessor
46 // - FastHoleyObjectElementsAccessor
47 // - FastDoubleElementsAccessor
48 // - FastPackedDoubleElementsAccessor
49 // - FastHoleyDoubleElementsAccessor
50 // - ExternalElementsAccessor (abstract)
51 // - ExternalByteElementsAccessor
52 // - ExternalUnsignedByteElementsAccessor
53 // - ExternalShortElementsAccessor
54 // - ExternalUnsignedShortElementsAccessor
55 // - ExternalIntElementsAccessor
56 // - ExternalUnsignedIntElementsAccessor
57 // - ExternalFloatElementsAccessor
58 // - ExternalDoubleElementsAccessor
59 // - PixelElementsAccessor
60 // - DictionaryElementsAccessor
61 // - NonStrictArgumentsElementsAccessor
62 
63 
64 namespace v8 {
65 namespace internal {
66 
67 
68 static const int kPackedSizeNotKnown = -1;
69 
70 
71 // First argument in list is the accessor class, the second argument is the
72 // accessor ElementsKind, and the third is the backing store class. Use the
73 // fast element handler for smi-only arrays. The implementation is currently
74 // identical. Note that the order must match that of the ElementsKind enum for
75 // the |accessor_array[]| below to work.
76 #define ELEMENTS_LIST(V) \
77  V(FastPackedSmiElementsAccessor, FAST_SMI_ELEMENTS, FixedArray) \
78  V(FastHoleySmiElementsAccessor, FAST_HOLEY_SMI_ELEMENTS, \
79  FixedArray) \
80  V(FastPackedObjectElementsAccessor, FAST_ELEMENTS, FixedArray) \
81  V(FastHoleyObjectElementsAccessor, FAST_HOLEY_ELEMENTS, FixedArray) \
82  V(FastPackedDoubleElementsAccessor, FAST_DOUBLE_ELEMENTS, \
83  FixedDoubleArray) \
84  V(FastHoleyDoubleElementsAccessor, FAST_HOLEY_DOUBLE_ELEMENTS, \
85  FixedDoubleArray) \
86  V(DictionaryElementsAccessor, DICTIONARY_ELEMENTS, \
87  SeededNumberDictionary) \
88  V(NonStrictArgumentsElementsAccessor, NON_STRICT_ARGUMENTS_ELEMENTS, \
89  FixedArray) \
90  V(ExternalByteElementsAccessor, EXTERNAL_BYTE_ELEMENTS, \
91  ExternalByteArray) \
92  V(ExternalUnsignedByteElementsAccessor, \
93  EXTERNAL_UNSIGNED_BYTE_ELEMENTS, ExternalUnsignedByteArray) \
94  V(ExternalShortElementsAccessor, EXTERNAL_SHORT_ELEMENTS, \
95  ExternalShortArray) \
96  V(ExternalUnsignedShortElementsAccessor, \
97  EXTERNAL_UNSIGNED_SHORT_ELEMENTS, ExternalUnsignedShortArray) \
98  V(ExternalIntElementsAccessor, EXTERNAL_INT_ELEMENTS, \
99  ExternalIntArray) \
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)
107 
108 
109 template<ElementsKind Kind> class ElementsKindTraits {
110  public:
112 };
113 
114 #define ELEMENTS_TRAITS(Class, KindParam, Store) \
115 template<> class ElementsKindTraits<KindParam> { \
116  public: \
117  static const ElementsKind Kind = KindParam; \
118  typedef Store BackingStore; \
119 };
121 #undef ELEMENTS_TRAITS
122 
123 
124 ElementsAccessor** ElementsAccessor::elements_accessors_;
125 
126 
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() &&
133  key->IsString() && String::cast(element)->Equals(String::cast(key))) {
134  return true;
135  }
136  }
137  return false;
138 }
139 
140 
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)));
146 }
147 
148 
150  ElementsKind from_kind,
151  uint32_t from_start,
152  FixedArray* to,
153  ElementsKind to_kind,
154  uint32_t to_start,
155  int raw_copy_size) {
156  ASSERT(to->map() != HEAP->fixed_cow_array_map());
157  int copy_size = raw_copy_size;
158  if (raw_copy_size < 0) {
159  ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd ||
161  copy_size = Min(from->length() - from_start,
162  to->length() - to_start);
163 #ifdef DEBUG
164  // FAST_*_ELEMENTS arrays cannot be uninitialized. Ensure they are already
165  // marked with the hole.
167  for (int i = to_start + copy_size; i < to->length(); ++i) {
168  ASSERT(to->get(i)->IsTheHole());
169  }
170  }
171 #endif
172  }
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;
178  Address to_address = to->address() + FixedArray::kHeaderSize;
179  Address from_address = from->address() + FixedArray::kHeaderSize;
180  CopyWords(reinterpret_cast<Object**>(to_address) + to_start,
181  reinterpret_cast<Object**>(from_address) + from_start,
182  copy_size);
183  if (IsFastObjectElementsKind(from_kind) &&
184  IsFastObjectElementsKind(to_kind)) {
185  Heap* heap = from->GetHeap();
186  if (!heap->InNewSpace(to)) {
187  heap->RecordWrites(to->address(),
188  to->OffsetOfElementAt(to_start),
189  copy_size);
190  }
191  heap->incremental_marking()->RecordWrites(to);
192  }
193 }
194 
195 
196 static void CopyDictionaryToObjectElements(SeededNumberDictionary* from,
197  uint32_t from_start,
198  FixedArray* to,
199  ElementsKind to_kind,
200  uint32_t to_start,
201  int raw_copy_size) {
202  int copy_size = raw_copy_size;
203  Heap* heap = from->GetHeap();
204  if (raw_copy_size < 0) {
205  ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd ||
207  copy_size = from->max_number_key() + 1 - from_start;
208 #ifdef DEBUG
209  // Fast object arrays cannot be uninitialized. Ensure they are already
210  // marked with the hole.
212  for (int i = to_start + copy_size; i < to->length(); ++i) {
213  ASSERT(to->get(i)->IsTheHole());
214  }
215  }
216 #endif
217  }
218  ASSERT(to != from);
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;
224  }
225  for (int i = 0; i < copy_size; i++) {
226  int entry = from->FindEntry(i + from_start);
227  if (entry != SeededNumberDictionary::kNotFound) {
228  Object* value = from->ValueAt(entry);
229  ASSERT(!value->IsTheHole());
230  to->set(i + to_start, value, SKIP_WRITE_BARRIER);
231  } else {
232  to->set_the_hole(i + to_start);
233  }
234  }
235  if (IsFastObjectElementsKind(to_kind)) {
236  if (!heap->InNewSpace(to)) {
237  heap->RecordWrites(to->address(),
238  to->OffsetOfElementAt(to_start),
239  copy_size);
240  }
241  heap->incremental_marking()->RecordWrites(to);
242  }
243 }
244 
245 
246 MUST_USE_RESULT static MaybeObject* CopyDoubleToObjectElements(
247  FixedDoubleArray* from,
248  uint32_t from_start,
249  FixedArray* to,
250  ElementsKind to_kind,
251  uint32_t to_start,
252  int raw_copy_size) {
254  int copy_size = raw_copy_size;
255  if (raw_copy_size < 0) {
256  ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd ||
258  copy_size = Min(from->length() - from_start,
259  to->length() - to_start);
260 #ifdef DEBUG
261  // FAST_*_ELEMENTS arrays cannot be uninitialized. Ensure they are already
262  // marked with the hole.
264  for (int i = to_start + copy_size; i < to->length(); ++i) {
265  ASSERT(to->get(i)->IsTheHole());
266  }
267  }
268 #endif
269  }
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) {
274  if (IsFastSmiElementsKind(to_kind)) {
275  UNIMPLEMENTED();
276  return Failure::Exception();
277  } else {
278  MaybeObject* maybe_value = from->get(i + from_start);
279  Object* value;
281  // Because Double -> Object elements transitions allocate HeapObjects
282  // iteratively, the allocate must succeed within a single GC cycle,
283  // otherwise the retry after the GC will also fail. In order to ensure
284  // that no GC is triggered, allocate HeapNumbers from old space if they
285  // can't be taken from new space.
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),
291  TENURED);
292  if (!maybe_value_object->ToObject(&value)) return maybe_value_object;
293  }
294  to->set(i + to_start, value, UPDATE_WRITE_BARRIER);
295  }
296  }
297  return to;
298 }
299 
300 
301 static void CopyDoubleToDoubleElements(FixedDoubleArray* from,
302  uint32_t from_start,
303  FixedDoubleArray* to,
304  uint32_t to_start,
305  int raw_copy_size) {
306  int copy_size = raw_copy_size;
307  if (raw_copy_size < 0) {
308  ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd ||
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) {
314  to->set_the_hole(i);
315  }
316  }
317  }
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;
321  Address to_address = to->address() + FixedDoubleArray::kHeaderSize;
322  Address from_address = from->address() + FixedDoubleArray::kHeaderSize;
323  to_address += kDoubleSize * to_start;
324  from_address += kDoubleSize * from_start;
325  int words_per_double = (kDoubleSize / kPointerSize);
326  CopyWords(reinterpret_cast<Object**>(to_address),
327  reinterpret_cast<Object**>(from_address),
328  words_per_double * copy_size);
329 }
330 
331 
332 static void CopySmiToDoubleElements(FixedArray* from,
333  uint32_t from_start,
334  FixedDoubleArray* to,
335  uint32_t to_start,
336  int raw_copy_size) {
337  int copy_size = raw_copy_size;
338  if (raw_copy_size < 0) {
339  ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd ||
341  copy_size = from->length() - from_start;
343  for (int i = to_start + copy_size; i < to->length(); ++i) {
344  to->set_the_hole(i);
345  }
346  }
347  }
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);
357  } else {
358  to->set(to_start, Smi::cast(hole_or_smi)->value());
359  }
360  }
361 }
362 
363 
364 static void CopyPackedSmiToDoubleElements(FixedArray* from,
365  uint32_t from_start,
366  FixedDoubleArray* to,
367  uint32_t to_start,
368  int packed_size,
369  int raw_copy_size) {
370  int copy_size = raw_copy_size;
371  uint32_t to_end;
372  if (raw_copy_size < 0) {
373  ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd ||
375  copy_size = from->length() - from_start;
377  to_end = to->length();
378  } else {
379  to_end = to_start + static_cast<uint32_t>(copy_size);
380  }
381  } else {
382  to_end = to_start + static_cast<uint32_t>(copy_size);
383  }
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());
394  }
395 
396  while (to_start < to_end) {
397  to->set_the_hole(to_start++);
398  }
399 }
400 
401 
402 static void CopyObjectToDoubleElements(FixedArray* from,
403  uint32_t from_start,
404  FixedDoubleArray* to,
405  uint32_t to_start,
406  int raw_copy_size) {
407  int copy_size = raw_copy_size;
408  if (raw_copy_size < 0) {
409  ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd ||
411  copy_size = from->length() - from_start;
413  for (int i = to_start + copy_size; i < to->length(); ++i) {
414  to->set_the_hole(i);
415  }
416  }
417  }
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);
427  } else {
428  to->set(to_start, hole_or_object->Number());
429  }
430  }
431 }
432 
433 
434 static void CopyDictionaryToDoubleElements(SeededNumberDictionary* from,
435  uint32_t from_start,
436  FixedDoubleArray* to,
437  uint32_t to_start,
438  int raw_copy_size) {
439  int copy_size = raw_copy_size;
440  if (copy_size < 0) {
441  ASSERT(copy_size == ElementsAccessor::kCopyToEnd ||
443  copy_size = from->max_number_key() + 1 - from_start;
445  for (int i = to_start + copy_size; i < to->length(); ++i) {
446  to->set_the_hole(i);
447  }
448  }
449  }
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;
454  }
455  for (int i = 0; i < copy_size; i++) {
456  int entry = from->FindEntry(i + from_start);
457  if (entry != SeededNumberDictionary::kNotFound) {
458  to->set(i + to_start, from->ValueAt(entry)->Number());
459  } else {
460  to->set_the_hole(i + to_start);
461  }
462  }
463 }
464 
465 
466 // Base class for element handler implementations. Contains the
467 // the common logic for objects with different ElementsKinds.
468 // Subclasses must specialize method for which the element
469 // implementation differs from the base class implementation.
470 //
471 // This class is intended to be used in the following way:
472 //
473 // class SomeElementsAccessor :
474 // public ElementsAccessorBase<SomeElementsAccessor,
475 // BackingStoreClass> {
476 // ...
477 // }
478 //
479 // This is an example of the Curiously Recurring Template Pattern (see
480 // http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern). We use
481 // CRTP to guarantee aggressive compile time optimizations (i.e. inlining and
482 // specialization of SomeElementsAccessor methods).
483 template <typename ElementsAccessorSubclass,
484  typename ElementsTraitsParam>
486  protected:
487  explicit ElementsAccessorBase(const char* name)
488  : ElementsAccessor(name) { }
489 
490  typedef ElementsTraitsParam ElementsTraits;
491  typedef typename ElementsTraitsParam::BackingStore BackingStore;
492 
493  virtual ElementsKind kind() const { return ElementsTraits::Kind; }
494 
495  static void ValidateContents(JSObject* holder, int length) {
496  }
497 
498  static void ValidateImpl(JSObject* holder) {
499  FixedArrayBase* fixed_array_base = holder->elements();
500  // When objects are first allocated, its elements are Failures.
501  if (fixed_array_base->IsFailure()) return;
502  if (!fixed_array_base->IsHeapObject()) return;
503  Map* map = fixed_array_base->map();
504  // Arrays that have been shifted in place can't be verified.
505  Heap* heap = holder->GetHeap();
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()) {
509  return;
510  }
511  int length = 0;
512  if (holder->IsJSArray()) {
513  Object* length_obj = JSArray::cast(holder)->length();
514  if (length_obj->IsSmi()) {
515  length = Smi::cast(length_obj)->value();
516  }
517  } else {
518  length = fixed_array_base->length();
519  }
520  ElementsAccessorSubclass::ValidateContents(holder, length);
521  }
522 
523  virtual void Validate(JSObject* holder) {
524  ElementsAccessorSubclass::ValidateImpl(holder);
525  }
526 
527  static bool HasElementImpl(Object* receiver,
528  JSObject* holder,
529  uint32_t key,
530  BackingStore* backing_store) {
531  MaybeObject* element =
532  ElementsAccessorSubclass::GetImpl(receiver, holder, key, backing_store);
533  return !element->IsTheHole();
534  }
535 
536  virtual bool HasElement(Object* receiver,
537  JSObject* holder,
538  uint32_t key,
539  FixedArrayBase* backing_store) {
540  if (backing_store == NULL) {
541  backing_store = holder->elements();
542  }
543  return ElementsAccessorSubclass::HasElementImpl(
544  receiver, holder, key, BackingStore::cast(backing_store));
545  }
546 
547  MUST_USE_RESULT virtual MaybeObject* Get(Object* receiver,
548  JSObject* holder,
549  uint32_t key,
550  FixedArrayBase* backing_store) {
551  if (backing_store == NULL) {
552  backing_store = holder->elements();
553  }
554  return ElementsAccessorSubclass::GetImpl(
555  receiver, holder, key, BackingStore::cast(backing_store));
556  }
557 
558  MUST_USE_RESULT static MaybeObject* GetImpl(Object* receiver,
559  JSObject* obj,
560  uint32_t key,
561  BackingStore* backing_store) {
562  return (key < ElementsAccessorSubclass::GetCapacityImpl(backing_store))
563  ? backing_store->get(key)
564  : backing_store->GetHeap()->the_hole_value();
565  }
566 
567  MUST_USE_RESULT virtual MaybeObject* SetLength(JSArray* array,
568  Object* length) {
569  return ElementsAccessorSubclass::SetLengthImpl(
570  array, length, BackingStore::cast(array->elements()));
571  }
572 
573  MUST_USE_RESULT static MaybeObject* SetLengthImpl(
574  JSObject* obj,
575  Object* length,
576  BackingStore* backing_store);
577 
578  MUST_USE_RESULT virtual MaybeObject* SetCapacityAndLength(
579  JSArray* array,
580  int capacity,
581  int length) {
582  return ElementsAccessorSubclass::SetFastElementsCapacityAndLength(
583  array,
584  capacity,
585  length);
586  }
587 
589  JSObject* obj,
590  int capacity,
591  int length) {
592  UNIMPLEMENTED();
593  return obj;
594  }
595 
596  MUST_USE_RESULT virtual MaybeObject* Delete(JSObject* obj,
597  uint32_t key,
598  JSReceiver::DeleteMode mode) = 0;
599 
601  uint32_t from_start,
602  FixedArrayBase* to,
603  ElementsKind to_kind,
604  uint32_t to_start,
605  int packed_size,
606  int copy_size) {
607  UNREACHABLE();
608  return NULL;
609  }
610 
611  MUST_USE_RESULT virtual MaybeObject* CopyElements(JSObject* from_holder,
612  uint32_t from_start,
613  FixedArrayBase* to,
614  ElementsKind to_kind,
615  uint32_t to_start,
616  int copy_size,
617  FixedArrayBase* from) {
618  int packed_size = kPackedSizeNotKnown;
619  if (from == NULL) {
620  from = from_holder->elements();
621  }
622 
623  if (from_holder) {
624  ElementsKind elements_kind = from_holder->GetElementsKind();
625  bool is_packed = IsFastPackedElementsKind(elements_kind) &&
626  from_holder->IsJSArray();
627  if (is_packed) {
628  packed_size = Smi::cast(JSArray::cast(from_holder)->length())->value();
629  if (copy_size >= 0 && packed_size > copy_size) {
630  packed_size = copy_size;
631  }
632  }
633  }
634  if (from->length() == 0) {
635  return from;
636  }
637  return ElementsAccessorSubclass::CopyElementsImpl(
638  from, from_start, to, to_kind, to_start, packed_size, copy_size);
639  }
640 
642  Object* receiver,
643  JSObject* holder,
644  FixedArray* to,
645  FixedArrayBase* from) {
646  int len0 = to->length();
647 #ifdef DEBUG
649  for (int i = 0; i < len0; i++) {
650  ASSERT(!to->get(i)->IsTheHole());
651  }
652  }
653 #endif
654  if (from == NULL) {
655  from = holder->elements();
656  }
657  BackingStore* backing_store = BackingStore::cast(from);
658  uint32_t len1 = ElementsAccessorSubclass::GetCapacityImpl(backing_store);
659 
660  // Optimize if 'other' is empty.
661  // We cannot optimize if 'this' is empty, as other may have holes.
662  if (len1 == 0) return to;
663 
664  // Compute how many elements are not in other.
665  uint32_t extra = 0;
666  for (uint32_t y = 0; y < len1; y++) {
667  uint32_t key =
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,
673  key, backing_store);
674  Object* value;
675  if (!maybe_value->ToObject(&value)) return maybe_value;
676  ASSERT(!value->IsTheHole());
677  if (!HasKey(to, value)) {
678  extra++;
679  }
680  }
681  }
682 
683  if (extra == 0) return to;
684 
685  // Allocate the result
686  FixedArray* result;
687  MaybeObject* maybe_obj =
688  backing_store->GetHeap()->AllocateFixedArray(len0 + extra);
689  if (!maybe_obj->To<FixedArray>(&result)) return maybe_obj;
690 
691  // Fill in the content
692  {
693  AssertNoAllocation no_gc;
694  WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc);
695  for (int i = 0; i < len0; i++) {
696  Object* e = to->get(i);
697  ASSERT(e->IsString() || e->IsNumber());
698  result->set(i, e, mode);
699  }
700  }
701  // Fill in the extra values.
702  uint32_t index = 0;
703  for (uint32_t y = 0; y < len1; y++) {
704  uint32_t key =
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,
710  key, backing_store);
711  Object* value;
712  if (!maybe_value->ToObject(&value)) return maybe_value;
713  if (!value->IsTheHole() && !HasKey(to, value)) {
714  result->set(len0 + index, value);
715  index++;
716  }
717  }
718  }
719  ASSERT(extra == index);
720  return result;
721  }
722 
723  protected:
724  static uint32_t GetCapacityImpl(BackingStore* backing_store) {
725  return backing_store->length();
726  }
727 
728  virtual uint32_t GetCapacity(FixedArrayBase* backing_store) {
729  return ElementsAccessorSubclass::GetCapacityImpl(
730  BackingStore::cast(backing_store));
731  }
732 
733  static uint32_t GetKeyForIndexImpl(BackingStore* backing_store,
734  uint32_t index) {
735  return index;
736  }
737 
738  virtual uint32_t GetKeyForIndex(FixedArrayBase* backing_store,
739  uint32_t index) {
740  return ElementsAccessorSubclass::GetKeyForIndexImpl(
741  BackingStore::cast(backing_store), index);
742  }
743 
744  private:
745  DISALLOW_COPY_AND_ASSIGN(ElementsAccessorBase);
746 };
747 
748 
749 // Super class for all fast element arrays.
750 template<typename FastElementsAccessorSubclass,
751  typename KindTraits,
752  int ElementSize>
754  : public ElementsAccessorBase<FastElementsAccessorSubclass, KindTraits> {
755  public:
756  explicit FastElementsAccessor(const char* name)
757  : ElementsAccessorBase<FastElementsAccessorSubclass,
758  KindTraits>(name) {}
759  protected:
760  friend class ElementsAccessorBase<FastElementsAccessorSubclass, KindTraits>;
762 
763  typedef typename KindTraits::BackingStore BackingStore;
764 
765  // Adjusts the length of the fast backing store or returns the new length or
766  // undefined in case conversion to a slow backing store should be performed.
767  static MaybeObject* SetLengthWithoutNormalize(BackingStore* backing_store,
768  JSArray* array,
769  Object* length_object,
770  uint32_t length) {
771  uint32_t old_capacity = backing_store->length();
772  Object* old_length = array->length();
773  bool same_size = old_length->IsSmi() &&
774  static_cast<uint32_t>(Smi::cast(old_length)->value()) == length;
775  ElementsKind kind = array->GetElementsKind();
776 
777  if (!same_size && IsFastElementsKind(kind) &&
778  !IsFastHoleyElementsKind(kind)) {
779  kind = GetHoleyElementsKind(kind);
780  MaybeObject* maybe_obj = array->TransitionElementsKind(kind);
781  if (maybe_obj->IsFailure()) return maybe_obj;
782  }
783 
784  // Check whether the backing store should be shrunk.
785  if (length <= old_capacity) {
786  if (array->HasFastSmiOrObjectElements()) {
787  MaybeObject* maybe_obj = array->EnsureWritableFastElements();
788  if (!maybe_obj->To(&backing_store)) return maybe_obj;
789  }
790  if (2 * length <= old_capacity) {
791  // If more than half the elements won't be used, trim the array.
792  if (length == 0) {
793  array->initialize_elements();
794  } else {
795  backing_store->set_length(length);
796  Address filler_start = backing_store->address() +
797  BackingStore::OffsetOfElementAt(length);
798  int filler_size = (old_capacity - length) * ElementSize;
799  array->GetHeap()->CreateFillerObjectAt(filler_start, filler_size);
800  }
801  } else {
802  // Otherwise, fill the unused tail with holes.
803  int old_length = FastD2I(array->length()->Number());
804  for (int i = length; i < old_length; i++) {
805  backing_store->set_the_hole(i);
806  }
807  }
808  return length_object;
809  }
810 
811  // Check whether the backing store should be expanded.
812  uint32_t min = JSObject::NewElementsCapacity(old_capacity);
813  uint32_t new_capacity = length > min ? length : min;
814  if (!array->ShouldConvertToSlowElements(new_capacity)) {
815  MaybeObject* result = FastElementsAccessorSubclass::
816  SetFastElementsCapacityAndLength(array, new_capacity, length);
817  if (result->IsFailure()) return result;
818  array->ValidateElements();
819  return length_object;
820  }
821 
822  // Request conversion to slow elements.
823  return array->GetHeap()->undefined_value();
824  }
825 
826  static MaybeObject* DeleteCommon(JSObject* obj,
827  uint32_t key,
828  JSReceiver::DeleteMode mode) {
830  obj->HasFastDoubleElements() ||
831  obj->HasFastArgumentsElements());
832  typename KindTraits::BackingStore* backing_store =
833  KindTraits::BackingStore::cast(obj->elements());
834  Heap* heap = obj->GetHeap();
835  if (backing_store->map() == heap->non_strict_arguments_elements_map()) {
836  backing_store =
837  KindTraits::BackingStore::cast(
838  FixedArray::cast(backing_store)->get(1));
839  } else {
840  ElementsKind kind = KindTraits::Kind;
841  if (IsFastPackedElementsKind(kind)) {
842  MaybeObject* transitioned =
844  if (transitioned->IsFailure()) return transitioned;
845  }
846  if (IsFastSmiOrObjectElementsKind(KindTraits::Kind)) {
847  Object* writable;
848  MaybeObject* maybe = obj->EnsureWritableFastElements();
849  if (!maybe->ToObject(&writable)) return maybe;
850  backing_store = KindTraits::BackingStore::cast(writable);
851  }
852  }
853  uint32_t length = static_cast<uint32_t>(
854  obj->IsJSArray()
855  ? Smi::cast(JSArray::cast(obj)->length())->value()
856  : backing_store->length());
857  if (key < length) {
858  backing_store->set_the_hole(key);
859  // If an old space backing store is larger than a certain size and
860  // has too few used values, normalize it.
861  // To avoid doing the check on every delete we require at least
862  // one adjacent hole to the value being deleted.
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)))) {
868  int num_used = 0;
869  for (int i = 0; i < backing_store->length(); ++i) {
870  if (!backing_store->is_the_hole(i)) ++num_used;
871  // Bail out early if more than 1/4 is used.
872  if (4 * num_used > backing_store->length()) break;
873  }
874  if (4 * num_used <= backing_store->length()) {
875  MaybeObject* result = obj->NormalizeElements();
876  if (result->IsFailure()) return result;
877  }
878  }
879  }
880  return heap->true_value();
881  }
882 
883  virtual MaybeObject* Delete(JSObject* obj,
884  uint32_t key,
885  JSReceiver::DeleteMode mode) {
886  return DeleteCommon(obj, key, mode);
887  }
888 
889  static bool HasElementImpl(
890  Object* receiver,
891  JSObject* holder,
892  uint32_t key,
893  typename KindTraits::BackingStore* backing_store) {
894  if (key >= static_cast<uint32_t>(backing_store->length())) {
895  return false;
896  }
897  return !backing_store->is_the_hole(key);
898  }
899 
900  static void ValidateContents(JSObject* holder, int length) {
901 #if DEBUG
902  FixedArrayBase* elements = holder->elements();
903  Heap* heap = elements->GetHeap();
904  Map* map = elements->map();
905  ASSERT((IsFastSmiOrObjectElementsKind(KindTraits::Kind) &&
906  (map == heap->fixed_array_map() ||
907  map == heap->fixed_cow_array_map())) ||
908  (IsFastDoubleElementsKind(KindTraits::Kind) ==
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);
914  ASSERT((!IsFastSmiElementsKind(KindTraits::Kind) ||
915  static_cast<Object*>(backing_store->get(i))->IsSmi()) ||
916  (IsFastHoleyElementsKind(KindTraits::Kind) ==
917  backing_store->is_the_hole(i)));
918  }
919 #endif
920  }
921 };
922 
923 
924 template<typename FastElementsAccessorSubclass,
925  typename KindTraits>
927  : public FastElementsAccessor<FastElementsAccessorSubclass,
928  KindTraits,
929  kPointerSize> {
930  public:
931  explicit FastSmiOrObjectElementsAccessor(const char* name)
932  : FastElementsAccessor<FastElementsAccessorSubclass,
933  KindTraits,
934  kPointerSize>(name) {}
935 
936  static MaybeObject* CopyElementsImpl(FixedArrayBase* from,
937  uint32_t from_start,
938  FixedArrayBase* to,
939  ElementsKind to_kind,
940  uint32_t to_start,
941  int packed_size,
942  int copy_size) {
943  if (IsFastSmiOrObjectElementsKind(to_kind)) {
945  FixedArray::cast(from), KindTraits::Kind, from_start,
946  FixedArray::cast(to), to_kind, to_start, copy_size);
947  } else if (IsFastDoubleElementsKind(to_kind)) {
948  if (IsFastSmiElementsKind(KindTraits::Kind)) {
949  if (IsFastPackedElementsKind(KindTraits::Kind) &&
950  packed_size != kPackedSizeNotKnown) {
951  CopyPackedSmiToDoubleElements(
952  FixedArray::cast(from), from_start,
953  FixedDoubleArray::cast(to), to_start,
954  packed_size, copy_size);
955  } else {
956  CopySmiToDoubleElements(
957  FixedArray::cast(from), from_start,
958  FixedDoubleArray::cast(to), to_start, copy_size);
959  }
960  } else {
961  CopyObjectToDoubleElements(
962  FixedArray::cast(from), from_start,
963  FixedDoubleArray::cast(to), to_start, copy_size);
964  }
965  } else {
966  UNREACHABLE();
967  }
968  return to->GetHeap()->undefined_value();
969  }
970 
971 
972  static MaybeObject* SetFastElementsCapacityAndLength(JSObject* obj,
973  uint32_t capacity,
974  uint32_t length) {
975  JSObject::SetFastElementsCapacitySmiMode set_capacity_mode =
976  obj->HasFastSmiElements()
979  return obj->SetFastElementsCapacityAndLength(capacity,
980  length,
981  set_capacity_mode);
982  }
983 };
984 
985 
988  FastPackedSmiElementsAccessor,
989  ElementsKindTraits<FAST_SMI_ELEMENTS> > {
990  public:
991  explicit FastPackedSmiElementsAccessor(const char* name)
995 };
996 
997 
1000  FastHoleySmiElementsAccessor,
1001  ElementsKindTraits<FAST_HOLEY_SMI_ELEMENTS> > {
1002  public:
1003  explicit FastHoleySmiElementsAccessor(const char* name)
1007 };
1008 
1009 
1012  FastPackedObjectElementsAccessor,
1013  ElementsKindTraits<FAST_ELEMENTS> > {
1014  public:
1018  ElementsKindTraits<FAST_ELEMENTS> >(name) {}
1019 };
1020 
1021 
1024  FastHoleyObjectElementsAccessor,
1025  ElementsKindTraits<FAST_HOLEY_ELEMENTS> > {
1026  public:
1031 };
1032 
1033 
1034 template<typename FastElementsAccessorSubclass,
1035  typename KindTraits>
1037  : public FastElementsAccessor<FastElementsAccessorSubclass,
1038  KindTraits,
1039  kDoubleSize> {
1040  public:
1041  explicit FastDoubleElementsAccessor(const char* name)
1042  : FastElementsAccessor<FastElementsAccessorSubclass,
1043  KindTraits,
1044  kDoubleSize>(name) {}
1045 
1046  static MaybeObject* SetFastElementsCapacityAndLength(JSObject* obj,
1047  uint32_t capacity,
1048  uint32_t length) {
1049  return obj->SetFastDoubleElementsCapacityAndLength(capacity,
1050  length);
1051  }
1052 
1053  protected:
1054  static MaybeObject* CopyElementsImpl(FixedArrayBase* from,
1055  uint32_t from_start,
1056  FixedArrayBase* to,
1057  ElementsKind to_kind,
1058  uint32_t to_start,
1059  int packed_size,
1060  int copy_size) {
1061  switch (to_kind) {
1062  case FAST_SMI_ELEMENTS:
1063  case FAST_ELEMENTS:
1065  case FAST_HOLEY_ELEMENTS:
1066  return CopyDoubleToObjectElements(
1067  FixedDoubleArray::cast(from), from_start, FixedArray::cast(to),
1068  to_kind, to_start, copy_size);
1069  case FAST_DOUBLE_ELEMENTS:
1071  CopyDoubleToDoubleElements(FixedDoubleArray::cast(from), from_start,
1073  to_start, copy_size);
1074  return from;
1075  default:
1076  UNREACHABLE();
1077  }
1078  return to->GetHeap()->undefined_value();
1079  }
1080 };
1081 
1082 
1084  : public FastDoubleElementsAccessor<
1085  FastPackedDoubleElementsAccessor,
1086  ElementsKindTraits<FAST_DOUBLE_ELEMENTS> > {
1087  public:
1088  friend class ElementsAccessorBase<FastPackedDoubleElementsAccessor,
1092  FastPackedDoubleElementsAccessor,
1094 };
1095 
1096 
1098  : public FastDoubleElementsAccessor<
1099  FastHoleyDoubleElementsAccessor,
1100  ElementsKindTraits<FAST_HOLEY_DOUBLE_ELEMENTS> > {
1101  public:
1102  friend class ElementsAccessorBase<
1103  FastHoleyDoubleElementsAccessor,
1107  FastHoleyDoubleElementsAccessor,
1109 };
1110 
1111 
1112 // Super class for all external element arrays.
1113 template<typename ExternalElementsAccessorSubclass,
1114  ElementsKind Kind>
1116  : public ElementsAccessorBase<ExternalElementsAccessorSubclass,
1117  ElementsKindTraits<Kind> > {
1118  public:
1119  explicit ExternalElementsAccessor(const char* name)
1120  : ElementsAccessorBase<ExternalElementsAccessorSubclass,
1121  ElementsKindTraits<Kind> >(name) {}
1122 
1123  protected:
1125 
1126  friend class ElementsAccessorBase<ExternalElementsAccessorSubclass,
1128 
1129  MUST_USE_RESULT static MaybeObject* GetImpl(Object* receiver,
1130  JSObject* obj,
1131  uint32_t key,
1132  BackingStore* backing_store) {
1133  return
1134  key < ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store)
1135  ? backing_store->get(key)
1136  : backing_store->GetHeap()->undefined_value();
1137  }
1138 
1139  MUST_USE_RESULT static MaybeObject* SetLengthImpl(
1140  JSObject* obj,
1141  Object* length,
1142  BackingStore* backing_store) {
1143  // External arrays do not support changing their length.
1144  UNREACHABLE();
1145  return obj;
1146  }
1147 
1148  MUST_USE_RESULT virtual MaybeObject* Delete(JSObject* obj,
1149  uint32_t key,
1150  JSReceiver::DeleteMode mode) {
1151  // External arrays always ignore deletes.
1152  return obj->GetHeap()->true_value();
1153  }
1154 
1155  static bool HasElementImpl(Object* receiver,
1156  JSObject* holder,
1157  uint32_t key,
1158  BackingStore* backing_store) {
1159  uint32_t capacity =
1160  ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store);
1161  return key < capacity;
1162  }
1163 };
1164 
1165 
1167  : public ExternalElementsAccessor<ExternalByteElementsAccessor,
1168  EXTERNAL_BYTE_ELEMENTS> {
1169  public:
1170  explicit ExternalByteElementsAccessor(const char* name)
1172  EXTERNAL_BYTE_ELEMENTS>(name) {}
1173 };
1174 
1175 
1177  : public ExternalElementsAccessor<ExternalUnsignedByteElementsAccessor,
1178  EXTERNAL_UNSIGNED_BYTE_ELEMENTS> {
1179  public:
1183 };
1184 
1185 
1187  : public ExternalElementsAccessor<ExternalShortElementsAccessor,
1188  EXTERNAL_SHORT_ELEMENTS> {
1189  public:
1190  explicit ExternalShortElementsAccessor(const char* name)
1192  EXTERNAL_SHORT_ELEMENTS>(name) {}
1193 };
1194 
1195 
1197  : public ExternalElementsAccessor<ExternalUnsignedShortElementsAccessor,
1198  EXTERNAL_UNSIGNED_SHORT_ELEMENTS> {
1199  public:
1203 };
1204 
1205 
1207  : public ExternalElementsAccessor<ExternalIntElementsAccessor,
1208  EXTERNAL_INT_ELEMENTS> {
1209  public:
1210  explicit ExternalIntElementsAccessor(const char* name)
1212  EXTERNAL_INT_ELEMENTS>(name) {}
1213 };
1214 
1215 
1217  : public ExternalElementsAccessor<ExternalUnsignedIntElementsAccessor,
1218  EXTERNAL_UNSIGNED_INT_ELEMENTS> {
1219  public:
1223 };
1224 
1225 
1227  : public ExternalElementsAccessor<ExternalFloatElementsAccessor,
1228  EXTERNAL_FLOAT_ELEMENTS> {
1229  public:
1230  explicit ExternalFloatElementsAccessor(const char* name)
1232  EXTERNAL_FLOAT_ELEMENTS>(name) {}
1233 };
1234 
1235 
1237  : public ExternalElementsAccessor<ExternalDoubleElementsAccessor,
1238  EXTERNAL_DOUBLE_ELEMENTS> {
1239  public:
1240  explicit ExternalDoubleElementsAccessor(const char* name)
1242  EXTERNAL_DOUBLE_ELEMENTS>(name) {}
1243 };
1244 
1245 
1247  : public ExternalElementsAccessor<PixelElementsAccessor,
1248  EXTERNAL_PIXEL_ELEMENTS> {
1249  public:
1250  explicit PixelElementsAccessor(const char* name)
1252  EXTERNAL_PIXEL_ELEMENTS>(name) {}
1253 };
1254 
1255 
1257  : public ElementsAccessorBase<DictionaryElementsAccessor,
1258  ElementsKindTraits<DICTIONARY_ELEMENTS> > {
1259  public:
1260  explicit DictionaryElementsAccessor(const char* name)
1263 
1264  // Adjusts the length of the dictionary backing store and returns the new
1265  // length according to ES5 section 15.4.5.2 behavior.
1267  SeededNumberDictionary* dict,
1268  JSArray* array,
1269  Object* length_object,
1270  uint32_t length) {
1271  if (length == 0) {
1272  // If the length of a slow array is reset to zero, we clear
1273  // the array and flush backing storage. This has the added
1274  // benefit that the array returns to fast mode.
1275  Object* obj;
1276  MaybeObject* maybe_obj = array->ResetElements();
1277  if (!maybe_obj->ToObject(&obj)) return maybe_obj;
1278  } else {
1279  uint32_t new_length = length;
1280  uint32_t old_length = static_cast<uint32_t>(array->length()->Number());
1281  if (new_length < old_length) {
1282  // Find last non-deletable element in range of elements to be
1283  // deleted and adjust range accordingly.
1284  Heap* heap = array->GetHeap();
1285  int capacity = dict->Capacity();
1286  for (int i = 0; i < capacity; i++) {
1287  Object* key = dict->KeyAt(i);
1288  if (key->IsNumber()) {
1289  uint32_t number = static_cast<uint32_t>(key->Number());
1290  if (new_length <= number && number < old_length) {
1291  PropertyDetails details = dict->DetailsAt(i);
1292  if (details.IsDontDelete()) new_length = number + 1;
1293  }
1294  }
1295  }
1296  if (new_length != length) {
1297  MaybeObject* maybe_object = heap->NumberFromUint32(new_length);
1298  if (!maybe_object->To(&length_object)) return maybe_object;
1299  }
1300 
1301  // Remove elements that should be deleted.
1302  int removed_entries = 0;
1303  Object* the_hole_value = heap->the_hole_value();
1304  for (int i = 0; i < capacity; i++) {
1305  Object* key = dict->KeyAt(i);
1306  if (key->IsNumber()) {
1307  uint32_t number = static_cast<uint32_t>(key->Number());
1308  if (new_length <= number && number < old_length) {
1309  dict->SetEntry(i, the_hole_value, the_hole_value);
1310  removed_entries++;
1311  }
1312  }
1313  }
1314 
1315  // Update the number of elements.
1316  dict->ElementsRemoved(removed_entries);
1317  }
1318  }
1319  return length_object;
1320  }
1321 
1322  MUST_USE_RESULT static MaybeObject* DeleteCommon(
1323  JSObject* obj,
1324  uint32_t key,
1325  JSReceiver::DeleteMode mode) {
1326  Isolate* isolate = obj->GetIsolate();
1327  Heap* heap = isolate->heap();
1328  FixedArray* backing_store = FixedArray::cast(obj->elements());
1329  bool is_arguments =
1331  if (is_arguments) {
1332  backing_store = FixedArray::cast(backing_store->get(1));
1333  }
1334  SeededNumberDictionary* dictionary =
1335  SeededNumberDictionary::cast(backing_store);
1336  int entry = dictionary->FindEntry(key);
1337  if (entry != SeededNumberDictionary::kNotFound) {
1338  Object* result = dictionary->DeleteProperty(entry, mode);
1339  if (result == heap->true_value()) {
1340  MaybeObject* maybe_elements = dictionary->Shrink(key);
1341  FixedArray* new_elements = NULL;
1342  if (!maybe_elements->To(&new_elements)) {
1343  return maybe_elements;
1344  }
1345  if (is_arguments) {
1346  FixedArray::cast(obj->elements())->set(1, new_elements);
1347  } else {
1348  obj->set_elements(new_elements);
1349  }
1350  }
1351  if (mode == JSObject::STRICT_DELETION &&
1352  result == heap->false_value()) {
1353  // In strict mode, attempting to delete a non-configurable property
1354  // throws an exception.
1355  HandleScope scope(isolate);
1356  Handle<Object> holder(obj);
1357  Handle<Object> name = isolate->factory()->NewNumberFromUint(key);
1358  Handle<Object> args[2] = { name, holder };
1359  Handle<Object> error =
1360  isolate->factory()->NewTypeError("strict_delete_property",
1361  HandleVector(args, 2));
1362  return isolate->Throw(*error);
1363  }
1364  }
1365  return heap->true_value();
1366  }
1367 
1369  uint32_t from_start,
1370  FixedArrayBase* to,
1371  ElementsKind to_kind,
1372  uint32_t to_start,
1373  int packed_size,
1374  int copy_size) {
1375  switch (to_kind) {
1376  case FAST_SMI_ELEMENTS:
1377  case FAST_ELEMENTS:
1379  case FAST_HOLEY_ELEMENTS:
1380  CopyDictionaryToObjectElements(
1381  SeededNumberDictionary::cast(from), from_start,
1382  FixedArray::cast(to), to_kind, to_start, copy_size);
1383  return from;
1384  case FAST_DOUBLE_ELEMENTS:
1386  CopyDictionaryToDoubleElements(
1387  SeededNumberDictionary::cast(from), from_start,
1388  FixedDoubleArray::cast(to), to_start, copy_size);
1389  return from;
1390  default:
1391  UNREACHABLE();
1392  }
1393  return to->GetHeap()->undefined_value();
1394  }
1395 
1396 
1397  protected:
1400 
1401  MUST_USE_RESULT virtual MaybeObject* Delete(JSObject* obj,
1402  uint32_t key,
1403  JSReceiver::DeleteMode mode) {
1404  return DeleteCommon(obj, key, mode);
1405  }
1406 
1407  MUST_USE_RESULT static MaybeObject* GetImpl(
1408  Object* receiver,
1409  JSObject* obj,
1410  uint32_t key,
1411  SeededNumberDictionary* backing_store) {
1412  int entry = backing_store->FindEntry(key);
1413  if (entry != SeededNumberDictionary::kNotFound) {
1414  Object* element = backing_store->ValueAt(entry);
1415  PropertyDetails details = backing_store->DetailsAt(entry);
1416  if (details.type() == CALLBACKS) {
1417  return obj->GetElementWithCallback(receiver,
1418  element,
1419  key,
1420  obj);
1421  } else {
1422  return element;
1423  }
1424  }
1425  return obj->GetHeap()->the_hole_value();
1426  }
1427 
1428  static bool HasElementImpl(Object* receiver,
1429  JSObject* holder,
1430  uint32_t key,
1431  SeededNumberDictionary* backing_store) {
1432  return backing_store->FindEntry(key) !=
1434  }
1435 
1437  uint32_t index) {
1438  Object* key = dict->KeyAt(index);
1439  return Smi::cast(key)->value();
1440  }
1441 };
1442 
1443 
1445  NonStrictArgumentsElementsAccessor,
1446  ElementsKindTraits<NON_STRICT_ARGUMENTS_ELEMENTS> > {
1447  public:
1452  protected:
1453  friend class ElementsAccessorBase<
1456 
1457  MUST_USE_RESULT static MaybeObject* GetImpl(Object* receiver,
1458  JSObject* obj,
1459  uint32_t key,
1460  FixedArray* parameter_map) {
1461  Object* probe = GetParameterMapArg(obj, parameter_map, key);
1462  if (!probe->IsTheHole()) {
1463  Context* context = Context::cast(parameter_map->get(0));
1464  int context_index = Smi::cast(probe)->value();
1465  ASSERT(!context->get(context_index)->IsTheHole());
1466  return context->get(context_index);
1467  } else {
1468  // Object is not mapped, defer to the arguments.
1469  FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
1470  MaybeObject* maybe_result = ElementsAccessor::ForArray(arguments)->Get(
1471  receiver, obj, key, arguments);
1472  Object* result;
1473  if (!maybe_result->ToObject(&result)) return maybe_result;
1474  // Elements of the arguments object in slow mode might be slow aliases.
1475  if (result->IsAliasedArgumentsEntry()) {
1477  Context* context = Context::cast(parameter_map->get(0));
1478  int context_index = entry->aliased_context_slot();
1479  ASSERT(!context->get(context_index)->IsTheHole());
1480  return context->get(context_index);
1481  } else {
1482  return result;
1483  }
1484  }
1485  }
1486 
1487  MUST_USE_RESULT static MaybeObject* SetLengthImpl(
1488  JSObject* obj,
1489  Object* length,
1490  FixedArray* parameter_map) {
1491  // TODO(mstarzinger): This was never implemented but will be used once we
1492  // correctly implement [[DefineOwnProperty]] on arrays.
1493  UNIMPLEMENTED();
1494  return obj;
1495  }
1496 
1497  MUST_USE_RESULT virtual MaybeObject* Delete(JSObject* obj,
1498  uint32_t key,
1499  JSReceiver::DeleteMode mode) {
1500  FixedArray* parameter_map = FixedArray::cast(obj->elements());
1501  Object* probe = GetParameterMapArg(obj, parameter_map, key);
1502  if (!probe->IsTheHole()) {
1503  // TODO(kmillikin): We could check if this was the last aliased
1504  // parameter, and revert to normal elements in that case. That
1505  // would enable GC of the context.
1506  parameter_map->set_the_hole(key + 2);
1507  } else {
1508  FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
1509  if (arguments->IsDictionary()) {
1510  return DictionaryElementsAccessor::DeleteCommon(obj, key, mode);
1511  } else {
1512  // It's difficult to access the version of DeleteCommon that is declared
1513  // in the templatized super class, call the concrete implementation in
1514  // the class for the most generalized ElementsKind subclass.
1515  return FastHoleyObjectElementsAccessor::DeleteCommon(obj, key, mode);
1516  }
1517  }
1518  return obj->GetHeap()->true_value();
1519  }
1520 
1522  uint32_t from_start,
1523  FixedArrayBase* to,
1524  ElementsKind to_kind,
1525  uint32_t to_start,
1526  int packed_size,
1527  int copy_size) {
1528  FixedArray* parameter_map = FixedArray::cast(from);
1529  FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
1530  ElementsAccessor* accessor = ElementsAccessor::ForArray(arguments);
1531  return accessor->CopyElements(NULL, from_start, to, to_kind,
1532  to_start, copy_size, arguments);
1533  }
1534 
1535  static uint32_t GetCapacityImpl(FixedArray* parameter_map) {
1536  FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1));
1537  return Max(static_cast<uint32_t>(parameter_map->length() - 2),
1538  ForArray(arguments)->GetCapacity(arguments));
1539  }
1540 
1541  static uint32_t GetKeyForIndexImpl(FixedArray* dict,
1542  uint32_t index) {
1543  return index;
1544  }
1545 
1546  static bool HasElementImpl(Object* receiver,
1547  JSObject* holder,
1548  uint32_t key,
1549  FixedArray* parameter_map) {
1550  Object* probe = GetParameterMapArg(holder, parameter_map, key);
1551  if (!probe->IsTheHole()) {
1552  return true;
1553  } else {
1554  FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1));
1555  ElementsAccessor* accessor = ElementsAccessor::ForArray(arguments);
1556  return !accessor->Get(receiver, holder, key, arguments)->IsTheHole();
1557  }
1558  }
1559 
1560  private:
1561  static Object* GetParameterMapArg(JSObject* holder,
1562  FixedArray* parameter_map,
1563  uint32_t key) {
1564  uint32_t length = holder->IsJSArray()
1565  ? Smi::cast(JSArray::cast(holder)->length())->value()
1566  : parameter_map->length();
1567  return key < (length - 2 )
1568  ? parameter_map->get(key + 2)
1569  : parameter_map->GetHeap()->the_hole_value();
1570  }
1571 };
1572 
1573 
1575  switch (array->map()->instance_type()) {
1576  case FIXED_ARRAY_TYPE:
1577  if (array->IsDictionary()) {
1578  return elements_accessors_[DICTIONARY_ELEMENTS];
1579  } else {
1580  return elements_accessors_[FAST_HOLEY_ELEMENTS];
1581  }
1583  return elements_accessors_[EXTERNAL_BYTE_ELEMENTS];
1585  return elements_accessors_[EXTERNAL_UNSIGNED_BYTE_ELEMENTS];
1587  return elements_accessors_[EXTERNAL_SHORT_ELEMENTS];
1589  return elements_accessors_[EXTERNAL_UNSIGNED_SHORT_ELEMENTS];
1591  return elements_accessors_[EXTERNAL_INT_ELEMENTS];
1593  return elements_accessors_[EXTERNAL_UNSIGNED_INT_ELEMENTS];
1595  return elements_accessors_[EXTERNAL_FLOAT_ELEMENTS];
1597  return elements_accessors_[EXTERNAL_DOUBLE_ELEMENTS];
1599  return elements_accessors_[EXTERNAL_PIXEL_ELEMENTS];
1600  default:
1601  UNREACHABLE();
1602  return NULL;
1603  }
1604 }
1605 
1606 
1608  static ElementsAccessor* accessor_array[] = {
1609 #define ACCESSOR_ARRAY(Class, Kind, Store) new Class(#Kind),
1611 #undef ACCESSOR_ARRAY
1612  };
1613 
1614  STATIC_ASSERT((sizeof(accessor_array) / sizeof(*accessor_array)) ==
1616 
1617  elements_accessors_ = accessor_array;
1618 }
1619 
1620 
1622 #define ACCESSOR_DELETE(Class, Kind, Store) delete elements_accessors_[Kind];
1624 #undef ACCESSOR_DELETE
1625  elements_accessors_ = NULL;
1626 }
1627 
1628 
1629 template <typename ElementsAccessorSubclass, typename ElementsKindTraits>
1630 MUST_USE_RESULT MaybeObject* ElementsAccessorBase<ElementsAccessorSubclass,
1632  SetLengthImpl(JSObject* obj,
1633  Object* length,
1634  typename ElementsKindTraits::BackingStore* backing_store) {
1635  JSArray* array = JSArray::cast(obj);
1636 
1637  // Fast case: The new length fits into a Smi.
1638  MaybeObject* maybe_smi_length = length->ToSmi();
1639  Object* smi_length = Smi::FromInt(0);
1640  if (maybe_smi_length->ToObject(&smi_length) && smi_length->IsSmi()) {
1641  const int value = Smi::cast(smi_length)->value();
1642  if (value >= 0) {
1643  Object* new_length;
1644  MaybeObject* result = ElementsAccessorSubclass::
1645  SetLengthWithoutNormalize(backing_store, array, smi_length, value);
1646  if (!result->ToObject(&new_length)) return result;
1647  ASSERT(new_length->IsSmi() || new_length->IsUndefined());
1648  if (new_length->IsSmi()) {
1649  array->set_length(Smi::cast(new_length));
1650  return array;
1651  }
1652  } else {
1653  return ThrowArrayLengthRangeError(array->GetHeap());
1654  }
1655  }
1656 
1657  // Slow case: The new length does not fit into a Smi or conversion
1658  // to slow elements is needed for other reasons.
1659  if (length->IsNumber()) {
1660  uint32_t value;
1661  if (length->ToArrayIndex(&value)) {
1662  SeededNumberDictionary* dictionary;
1663  MaybeObject* maybe_object = array->NormalizeElements();
1664  if (!maybe_object->To(&dictionary)) return maybe_object;
1665  Object* new_length;
1666  MaybeObject* result = DictionaryElementsAccessor::
1667  SetLengthWithoutNormalize(dictionary, array, length, value);
1668  if (!result->ToObject(&new_length)) return result;
1669  ASSERT(new_length->IsNumber());
1670  array->set_length(new_length);
1671  return array;
1672  } else {
1673  return ThrowArrayLengthRangeError(array->GetHeap());
1674  }
1675  }
1676 
1677  // Fall-back case: The new length is not a number so make the array
1678  // size one and set only element to length.
1679  FixedArray* new_backing_store;
1680  MaybeObject* maybe_obj = array->GetHeap()->AllocateFixedArray(1);
1681  if (!maybe_obj->To(&new_backing_store)) return maybe_obj;
1682  new_backing_store->set(0, length);
1683  { MaybeObject* result = array->SetContent(new_backing_store);
1684  if (result->IsFailure()) return result;
1685  }
1686  return array;
1687 }
1688 
1689 
1690 } } // namespace v8::internal
byte * Address
Definition: globals.h:172
bool FLAG_enable_slow_asserts
static MUST_USE_RESULT MaybeObject * SetLengthImpl(JSObject *obj, Object *length, BackingStore *backing_store)
Definition: elements.cc:1139
Object * KeyAt(int entry)
Definition: objects.h:2816
static MUST_USE_RESULT MaybeObject * GetImpl(Object *receiver, JSObject *obj, uint32_t key, BackingStore *backing_store)
Definition: elements.cc:1129
FastDoubleElementsAccessor(const char *name)
Definition: elements.cc:1041
#define ACCESSOR_DELETE(Class, Kind, Store)
#define ACCESSOR_ARRAY(Class, Kind, Store)
MUST_USE_RESULT MaybeObject * AllocateFixedArray(int length, PretenureFlag pretenure)
Definition: heap.cc:4712
static MUST_USE_RESULT MaybeObject * GetImpl(Object *receiver, JSObject *obj, uint32_t key, FixedArray *parameter_map)
Definition: elements.cc:1457
void set(int index, Object *value)
Definition: objects-inl.h:1695
virtual MUST_USE_RESULT MaybeObject * Delete(JSObject *obj, uint32_t key, JSReceiver::DeleteMode mode)
Definition: elements.cc:1497
bool InNewSpace(Object *object)
Definition: heap-inl.h:292
static String * cast(Object *obj)
static uint32_t GetCapacityImpl(FixedArray *parameter_map)
Definition: elements.cc:1535
virtual MUST_USE_RESULT MaybeObject * AddElementsToFixedArray(Object *receiver, JSObject *holder, FixedArray *to, FixedArrayBase *from)
Definition: elements.cc:641
static bool HasElementImpl(Object *receiver, JSObject *holder, uint32_t key, SeededNumberDictionary *backing_store)
Definition: elements.cc:1428
ElementsTraitsParam::BackingStore BackingStore
Definition: elements.cc:491
void set_length(Smi *length)
Definition: objects-inl.h:4991
static Smi * FromInt(int value)
Definition: objects-inl.h:973
bool IsFastObjectElementsKind(ElementsKind kind)
MUST_USE_RESULT MaybeObject * ToSmi()
Definition: objects-inl.h:815
virtual MUST_USE_RESULT MaybeObject * SetCapacityAndLength(JSArray *array, int capacity, int length)
Definition: elements.cc:578
static bool HasElementImpl(Object *receiver, JSObject *holder, uint32_t key, BackingStore *backing_store)
Definition: elements.cc:1155
value format" "after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false, "print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false, "print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false, "report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true, "garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true, "flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true, "use incremental marking") DEFINE_bool(incremental_marking_steps, true, "do incremental marking steps") DEFINE_bool(trace_incremental_marking, false, "trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true, "Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false, "Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true, "use inline caching") DEFINE_bool(native_code_counters, false, "generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false, "Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true, "Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false, "Never perform compaction on full GC-testing only") DEFINE_bool(compact_code_space, true, "Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true, "Flush inline caches prior to mark compact collection and" "flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0, "Default seed for initializing random generator" "(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true, "allows verbose printing") DEFINE_bool(allow_natives_syntax, false, "allow natives syntax") DEFINE_bool(trace_sim, false, "Trace simulator execution") DEFINE_bool(check_icache, false, "Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0, "Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8, "Stack alingment in bytes in simulator(4 or 8, 8 is default)") DEFINE_bool(trace_exception, false, "print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false, "preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true, "randomize hashes to avoid predictable hash collisions" "(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0, "Fixed seed to use to hash property keys(0 means random)" "(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false, "activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true, "generate optimized regexp code") DEFINE_bool(testing_bool_flag, true, "testing_bool_flag") DEFINE_int(testing_int_flag, 13, "testing_int_flag") DEFINE_float(testing_float_flag, 2.5, "float-flag") DEFINE_string(testing_string_flag, "Hello, world!", "string-flag") DEFINE_int(testing_prng_seed, 42, "Seed used for threading test randomness") DEFINE_string(testing_serialization_file, "/tmp/serdes", "file in which to serialize heap") DEFINE_bool(help, false, "Print usage message, including flags, on console") DEFINE_bool(dump_counters, false, "Dump counters on exit") DEFINE_string(map_counters, "", "Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT, "Pass all remaining arguments to the script.Alias for\"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#43"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2#define FLAG_MODE_DEFINE_DEFAULTS#1"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flag-definitions.h"1#define FLAG_FULL(ftype, ctype, nam, def, cmt)#define FLAG_READONLY(ftype, ctype, nam, def, cmt)#define DEFINE_implication(whenflag, thenflag)#define DEFINE_bool(nam, def, cmt)#define DEFINE_int(nam, def, cmt)#define DEFINE_float(nam, def, cmt)#define DEFINE_string(nam, def, cmt)#define DEFINE_args(nam, def, cmt)#define FLAG DEFINE_bool(use_strict, false,"enforce strict mode") DEFINE_bool(es5_readonly, false,"activate correct semantics for inheriting readonliness") DEFINE_bool(es52_globals, false,"activate new semantics for global var declarations") DEFINE_bool(harmony_typeof, false,"enable harmony semantics for typeof") DEFINE_bool(harmony_scoping, false,"enable harmony block scoping") DEFINE_bool(harmony_modules, false,"enable harmony modules (implies block scoping)") DEFINE_bool(harmony_proxies, false,"enable harmony proxies") DEFINE_bool(harmony_collections, false,"enable harmony collections (sets, maps, and weak maps)") DEFINE_bool(harmony, false,"enable all harmony features (except typeof)") DEFINE_implication(harmony, harmony_scoping) DEFINE_implication(harmony, harmony_modules) DEFINE_implication(harmony, harmony_proxies) DEFINE_implication(harmony, harmony_collections) DEFINE_implication(harmony_modules, harmony_scoping) DEFINE_bool(packed_arrays, false,"optimizes arrays that have no holes") DEFINE_bool(smi_only_arrays, true,"tracks arrays with only smi values") DEFINE_bool(clever_optimizations, true,"Optimize object size, Array shift, DOM strings and string +") DEFINE_bool(unbox_double_arrays, true,"automatically unbox arrays of doubles") DEFINE_bool(string_slices, true,"use string slices") DEFINE_bool(crankshaft, true,"use crankshaft") DEFINE_string(hydrogen_filter,"","optimization filter") DEFINE_bool(use_range, true,"use hydrogen range analysis") DEFINE_bool(eliminate_dead_phis, true,"eliminate dead phis") DEFINE_bool(use_gvn, true,"use hydrogen global value numbering") DEFINE_bool(use_canonicalizing, true,"use hydrogen instruction canonicalizing") DEFINE_bool(use_inlining, true,"use function inlining") DEFINE_int(max_inlined_source_size, 600,"maximum source size in bytes considered for a single inlining") DEFINE_int(max_inlined_nodes, 196,"maximum number of AST nodes considered for a single inlining") DEFINE_int(max_inlined_nodes_cumulative, 196,"maximum cumulative number of AST nodes considered for inlining") DEFINE_bool(loop_invariant_code_motion, true,"loop invariant code motion") DEFINE_bool(collect_megamorphic_maps_from_stub_cache, true,"crankshaft harvests type feedback from stub cache") DEFINE_bool(hydrogen_stats, false,"print statistics for hydrogen") DEFINE_bool(trace_hydrogen, false,"trace generated hydrogen to file") DEFINE_string(trace_phase,"Z","trace generated IR for specified phases") DEFINE_bool(trace_inlining, false,"trace inlining decisions") DEFINE_bool(trace_alloc, false,"trace register allocator") DEFINE_bool(trace_all_uses, false,"trace all use positions") DEFINE_bool(trace_range, false,"trace range analysis") DEFINE_bool(trace_gvn, false,"trace global value numbering") DEFINE_bool(trace_representation, false,"trace representation types") DEFINE_bool(stress_pointer_maps, false,"pointer map for every instruction") DEFINE_bool(stress_environments, false,"environment for every instruction") DEFINE_int(deopt_every_n_times, 0,"deoptimize every n times a deopt point is passed") DEFINE_bool(trap_on_deopt, false,"put a break point before deoptimizing") DEFINE_bool(deoptimize_uncommon_cases, true,"deoptimize uncommon cases") DEFINE_bool(polymorphic_inlining, true,"polymorphic inlining") DEFINE_bool(use_osr, true,"use on-stack replacement") DEFINE_bool(array_bounds_checks_elimination, false,"perform array bounds checks elimination") DEFINE_bool(array_index_dehoisting, false,"perform array index dehoisting") DEFINE_bool(trace_osr, false,"trace on-stack replacement") DEFINE_int(stress_runs, 0,"number of stress runs") DEFINE_bool(optimize_closures, true,"optimize closures") DEFINE_bool(inline_construct, true,"inline constructor calls") DEFINE_bool(inline_arguments, true,"inline functions with arguments object") DEFINE_int(loop_weight, 1,"loop weight for representation inference") DEFINE_bool(optimize_for_in, true,"optimize functions containing for-in loops") DEFINE_bool(experimental_profiler, true,"enable all profiler experiments") DEFINE_bool(watch_ic_patching, false,"profiler considers IC stability") DEFINE_int(frame_count, 1,"number of stack frames inspected by the profiler") DEFINE_bool(self_optimization, false,"primitive functions trigger their own optimization") DEFINE_bool(direct_self_opt, false,"call recompile stub directly when self-optimizing") DEFINE_bool(retry_self_opt, false,"re-try self-optimization if it failed") DEFINE_bool(count_based_interrupts, false,"trigger profiler ticks based on counting instead of timing") DEFINE_bool(interrupt_at_exit, false,"insert an interrupt check at function exit") DEFINE_bool(weighted_back_edges, false,"weight back edges by jump distance for interrupt triggering") DEFINE_int(interrupt_budget, 5900,"execution budget before interrupt is triggered") DEFINE_int(type_info_threshold, 15,"percentage of ICs that must have type info to allow optimization") DEFINE_int(self_opt_count, 130,"call count before self-optimization") DEFINE_implication(experimental_profiler, watch_ic_patching) DEFINE_implication(experimental_profiler, self_optimization) DEFINE_implication(experimental_profiler, retry_self_opt) DEFINE_implication(experimental_profiler, count_based_interrupts) DEFINE_implication(experimental_profiler, interrupt_at_exit) DEFINE_implication(experimental_profiler, weighted_back_edges) DEFINE_bool(trace_opt_verbose, false,"extra verbose compilation tracing") DEFINE_implication(trace_opt_verbose, trace_opt) DEFINE_bool(debug_code, false,"generate extra code (assertions) for debugging") DEFINE_bool(code_comments, false,"emit comments in code disassembly") DEFINE_bool(enable_sse2, true,"enable use of SSE2 instructions if available") DEFINE_bool(enable_sse3, true,"enable use of SSE3 instructions if available") DEFINE_bool(enable_sse4_1, true,"enable use of SSE4.1 instructions if available") DEFINE_bool(enable_cmov, true,"enable use of CMOV instruction if available") DEFINE_bool(enable_rdtsc, true,"enable use of RDTSC instruction if available") DEFINE_bool(enable_sahf, true,"enable use of SAHF instruction if available (X64 only)") DEFINE_bool(enable_vfp3, true,"enable use of VFP3 instructions if available - this implies ""enabling ARMv7 instructions (ARM only)") DEFINE_bool(enable_armv7, true,"enable use of ARMv7 instructions if available (ARM only)") DEFINE_bool(enable_fpu, true,"enable use of MIPS FPU instructions if available (MIPS only)") DEFINE_string(expose_natives_as, NULL,"expose natives in global object") DEFINE_string(expose_debug_as, NULL,"expose debug in global object") DEFINE_bool(expose_gc, false,"expose gc extension") DEFINE_bool(expose_externalize_string, false,"expose externalize string extension") DEFINE_int(stack_trace_limit, 10,"number of stack frames to capture") DEFINE_bool(builtins_in_stack_traces, false,"show built-in functions in stack traces") DEFINE_bool(disable_native_files, false,"disable builtin natives files") DEFINE_bool(inline_new, true,"use fast inline allocation") DEFINE_bool(stack_trace_on_abort, true,"print a stack trace if an assertion failure occurs") DEFINE_bool(trace, false,"trace function calls") DEFINE_bool(mask_constants_with_cookie, true,"use random jit cookie to mask large constants") DEFINE_bool(lazy, true,"use lazy compilation") DEFINE_bool(trace_opt, false,"trace lazy optimization") DEFINE_bool(trace_opt_stats, false,"trace lazy optimization statistics") DEFINE_bool(opt, true,"use adaptive optimizations") DEFINE_bool(always_opt, false,"always try to optimize functions") DEFINE_bool(prepare_always_opt, false,"prepare for turning on always opt") DEFINE_bool(trace_deopt, false,"trace deoptimization") DEFINE_int(min_preparse_length, 1024,"minimum length for automatic enable preparsing") DEFINE_bool(always_full_compiler, false,"try to use the dedicated run-once backend for all code") DEFINE_bool(trace_bailout, false,"print reasons for falling back to using the classic V8 backend") DEFINE_bool(compilation_cache, true,"enable compilation cache") DEFINE_bool(cache_prototype_transitions, true,"cache prototype transitions") DEFINE_bool(trace_debug_json, false,"trace debugging JSON request/response") DEFINE_bool(debugger_auto_break, true,"automatically set the debug break flag when debugger commands are ""in the queue") DEFINE_bool(enable_liveedit, true,"enable liveedit experimental feature") DEFINE_bool(break_on_abort, true,"always cause a debug break before aborting") DEFINE_int(stack_size, kPointerSize *123,"default size of stack region v8 is allowed to use (in kBytes)") DEFINE_int(max_stack_trace_source_length, 300,"maximum length of function source code printed in a stack trace.") DEFINE_bool(always_inline_smi_code, false,"always inline smi code in non-opt code") DEFINE_int(max_new_space_size, 0,"max size of the new generation (in kBytes)") DEFINE_int(max_old_space_size, 0,"max size of the old generation (in Mbytes)") DEFINE_int(max_executable_size, 0,"max size of executable memory (in Mbytes)") DEFINE_bool(gc_global, false,"always perform global GCs") DEFINE_int(gc_interval,-1,"garbage collect after <n> allocations") DEFINE_bool(trace_gc, false,"print one trace line following each garbage collection") DEFINE_bool(trace_gc_nvp, false,"print one detailed trace line in name=value format ""after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false,"print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false,"print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false,"report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true,"garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true,"flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true,"use incremental marking") DEFINE_bool(incremental_marking_steps, true,"do incremental marking steps") DEFINE_bool(trace_incremental_marking, false,"trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true,"Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false,"Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true,"use inline caching") DEFINE_bool(native_code_counters, false,"generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false,"Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true,"Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false,"Never perform compaction on full GC - testing only") DEFINE_bool(compact_code_space, true,"Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true,"Flush inline caches prior to mark compact collection and ""flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0,"Default seed for initializing random generator ""(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true,"allows verbose printing") DEFINE_bool(allow_natives_syntax, false,"allow natives syntax") DEFINE_bool(trace_sim, false,"Trace simulator execution") DEFINE_bool(check_icache, false,"Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0,"Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8,"Stack alingment in bytes in simulator (4 or 8, 8 is default)") DEFINE_bool(trace_exception, false,"print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false,"preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true,"randomize hashes to avoid predictable hash collisions ""(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0,"Fixed seed to use to hash property keys (0 means random)""(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false,"activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true,"generate optimized regexp code") DEFINE_bool(testing_bool_flag, true,"testing_bool_flag") DEFINE_int(testing_int_flag, 13,"testing_int_flag") DEFINE_float(testing_float_flag, 2.5,"float-flag") DEFINE_string(testing_string_flag,"Hello, world!","string-flag") DEFINE_int(testing_prng_seed, 42,"Seed used for threading test randomness") DEFINE_string(testing_serialization_file,"/tmp/serdes","file in which to serialize heap") DEFINE_bool(help, false,"Print usage message, including flags, on console") DEFINE_bool(dump_counters, false,"Dump counters on exit") DEFINE_string(map_counters,"","Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT,"Pass all remaining arguments to the script. Alias for \"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#47"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2 namespace{struct Flag{enum FlagType{TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_ARGS} name
Definition: flags.cc:1349
T Max(T a, T b)
Definition: utils.h:222
static bool HasElementImpl(Object *receiver, JSObject *holder, uint32_t key, BackingStore *backing_store)
Definition: elements.cc:527
static MUST_USE_RESULT MaybeObject * SetLengthImpl(JSObject *obj, Object *length, BackingStore *backing_store)
Definition: elements.cc:1632
virtual void Validate(JSObject *holder)
Definition: elements.cc:523
ExternalElementsAccessor(const char *name)
Definition: elements.cc:1119
virtual MUST_USE_RESULT MaybeObject * SetLength(JSArray *array, Object *length)
Definition: elements.cc:567
static Failure * Exception()
Definition: objects-inl.h:1016
static MaybeObject * SetFastElementsCapacityAndLength(JSObject *obj, uint32_t capacity, uint32_t length)
Definition: elements.cc:1046
static AliasedArgumentsEntry * cast(Object *obj)
DictionaryElementsAccessor(const char *name)
Definition: elements.cc:1260
static Handle< Object > TransitionElementsKind(Handle< JSObject > object, ElementsKind to_kind)
Definition: objects.cc:9848
#define ASSERT(condition)
Definition: checks.h:270
virtual MUST_USE_RESULT MaybeObject * Delete(JSObject *obj, uint32_t key, JSReceiver::DeleteMode mode)
Definition: elements.cc:1401
KindTraits::BackingStore BackingStore
Definition: elements.cc:763
static MUST_USE_RESULT MaybeObject * SetLengthWithoutNormalize(SeededNumberDictionary *dict, JSArray *array, Object *length_object, uint32_t length)
Definition: elements.cc:1266
virtual MUST_USE_RESULT MaybeObject * Delete(JSObject *obj, uint32_t key, JSReceiver::DeleteMode mode)
Definition: elements.cc:1148
static Context * cast(Object *context)
Definition: contexts.h:207
#define ELEMENTS_LIST(V)
Definition: elements.cc:76
ElementsTraitsParam ElementsTraits
Definition: elements.cc:490
virtual bool HasElement(Object *receiver, JSObject *holder, uint32_t key, FixedArrayBase *backing_store)
Definition: elements.cc:536
FastElementsAccessor(const char *name)
Definition: elements.cc:756
static uint32_t GetKeyForIndexImpl(SeededNumberDictionary *dict, uint32_t index)
Definition: elements.cc:1436
Factory * factory()
Definition: isolate.h:977
bool IsFastElementsKind(ElementsKind kind)
MUST_USE_RESULT MaybeObject * EnsureWritableFastElements()
Definition: objects-inl.h:4608
void set_the_hole(int index)
Definition: objects-inl.h:1838
static Smi * cast(Object *object)
bool Equals(String *other)
Definition: objects-inl.h:2275
static MUST_USE_RESULT MaybeObject * DeleteCommon(JSObject *obj, uint32_t key, JSReceiver::DeleteMode mode)
Definition: elements.cc:1322
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)
Definition: elements.cc:1368
static const int kCopyToEnd
Definition: elements.h:99
static uint32_t GetKeyForIndexImpl(FixedArray *dict, uint32_t index)
Definition: elements.cc:1541
Object * ValueAt(int entry)
Definition: objects.h:3039
void CopyWords(T *dst, T *src, int num_words)
Definition: v8utils.h:124
#define UNREACHABLE()
Definition: checks.h:50
virtual ElementsKind kind() const
Definition: elements.cc:493
static void ValidateImpl(JSObject *holder)
Definition: elements.cc:498
STATIC_ASSERT((FixedDoubleArray::kHeaderSize &kDoubleAlignmentMask)==0)
static SeededNumberDictionary * cast(Object *obj)
Definition: objects.h:3207
MUST_USE_RESULT MaybeObject * SetContent(FixedArrayBase *storage)
Definition: objects-inl.h:5004
#define MUST_USE_RESULT
Definition: globals.h:360
bool IsFastPackedElementsKind(ElementsKind kind)
const int kDoubleSize
Definition: globals.h:232
static void ValidateContents(JSObject *holder, int length)
Definition: elements.cc:900
static MUST_USE_RESULT MaybeObject * SetFastElementsCapacityAndLength(JSObject *obj, int capacity, int length)
Definition: elements.cc:588
virtual MUST_USE_RESULT MaybeObject * Get(Object *receiver, JSObject *holder, uint32_t key, FixedArrayBase *backing_store)
Definition: elements.cc:547
static MaybeObject * DeleteCommon(JSObject *obj, uint32_t key, JSReceiver::DeleteMode mode)
Definition: elements.cc:826
bool ToArrayIndex(uint32_t *index)
Definition: objects-inl.h:1637
MUST_USE_RESULT MaybeObject * ResetElements()
Definition: objects-inl.h:1394
ElementsKind GetElementsKind()
Definition: objects-inl.h:4503
const int kPointerSize
Definition: globals.h:234
static uint32_t GetKeyForIndexImpl(BackingStore *backing_store, uint32_t index)
Definition: elements.cc:733
static MaybeObject * CopyElementsImpl(FixedArrayBase *from, uint32_t from_start, FixedArrayBase *to, ElementsKind to_kind, uint32_t to_start, int packed_size, int copy_size)
Definition: elements.cc:1054
static bool HasElementImpl(Object *receiver, JSObject *holder, uint32_t key, FixedArray *parameter_map)
Definition: elements.cc:1546
static void InitializeOncePerProcess()
Definition: elements.cc:1607
static MUST_USE_RESULT MaybeObject * GetImpl(Object *receiver, JSObject *obj, uint32_t key, BackingStore *backing_store)
Definition: elements.cc:558
static FixedDoubleArray * cast(Object *obj)
#define ELEMENTS_TRAITS(Class, KindParam, Store)
Definition: elements.cc:114
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)
Definition: elements.cc:600
MUST_USE_RESULT MaybeObject * SetFastElementsCapacityAndLength(int capacity, int length, SetFastElementsCapacitySmiMode smi_mode)
Definition: objects.cc:8584
static ElementsAccessor * ForArray(FixedArrayBase *array)
Definition: elements.cc:1574
WriteBarrierMode GetWriteBarrierMode(const AssertNoAllocation &)
Definition: objects-inl.h:1769
MUST_USE_RESULT MaybeObject * Shrink(Key key)
Definition: objects.cc:12272
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)
Definition: isolate.cc:918
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)
Definition: elements.cc:611
static int OffsetOfElementAt(int index)
Definition: objects.h:2291
static JSArray * cast(Object *obj)
bool IsFastSmiOrObjectElementsKind(ElementsKind kind)
void RecordWrites(Address address, int start, int len)
Definition: heap-inl.h:340
const int kElementsKindCount
Definition: elements-kind.h:76
static const int kHeaderSize
Definition: objects.h:2233
MUST_USE_RESULT MaybeObject * SetFastDoubleElementsCapacityAndLength(int capacity, int length)
Definition: objects.cc:8650
void CopyObjectToObjectElements(FixedArray *from, ElementsKind from_kind, uint32_t from_start, FixedArray *to, ElementsKind to_kind, uint32_t to_start, int raw_copy_size)
Definition: elements.cc:149
bool ShouldConvertToSlowElements(int new_capacity)
Definition: objects.cc:10080
static const int kCopyToEndAndInitializeToHole
Definition: elements.h:104
ElementsKindTraits< Kind >::BackingStore BackingStore
Definition: elements.cc:1124
static MaybeObject * SetLengthWithoutNormalize(BackingStore *backing_store, JSArray *array, Object *length_object, uint32_t length)
Definition: elements.cc:767
MUST_USE_RESULT MaybeObject * NumberFromUint32(uint32_t value, PretenureFlag pretenure=NOT_TENURED)
Definition: heap-inl.h:237
IncrementalMarking * incremental_marking()
Definition: heap.h:1524
static MUST_USE_RESULT MaybeObject * SetLengthImpl(JSObject *obj, Object *length, FixedArray *parameter_map)
Definition: elements.cc:1487
#define UNIMPLEMENTED()
Definition: checks.h:48
PropertyDetails DetailsAt(int entry)
Definition: objects.h:3049
Object * DeleteProperty(int entry, JSObject::DeleteMode mode)
Definition: objects.cc:12257
Handle< Object > NewTypeError(const char *type, Vector< Handle< Object > > args)
Definition: factory.cc:614
static Handle< SeededNumberDictionary > NormalizeElements(Handle< JSObject > object)
Definition: objects.cc:3368
#define HEAP
Definition: isolate.h:1408
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 trace on stack replacement optimize closures functions with arguments object optimize functions containing for in loops profiler considers IC stability primitive functions trigger their own optimization re try self optimization if it failed insert an interrupt check at function exit execution budget before interrupt is triggered call count before self optimization self_optimization count_based_interrupts weighted_back_edges trace_opt 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 enable use of ARMv7 instructions if enable use of MIPS FPU instructions if NULL
Definition: flags.cc:274
InstanceType instance_type()
Definition: objects-inl.h:2864
static FixedArray * cast(Object *obj)
static bool HasElementImpl(Object *receiver, JSObject *holder, uint32_t key, typename KindTraits::BackingStore *backing_store)
Definition: elements.cc:889
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)
Definition: elements.cc:1521
void SetEntry(int entry, Object *key, Object *value)
Definition: objects-inl.h:4858
Object * get(int index)
Definition: objects-inl.h:1675
bool IsFastHoleyElementsKind(ElementsKind kind)
bool HasFastArgumentsElements()
Definition: objects.cc:9246
void CreateFillerObjectAt(Address addr, int size)
Definition: heap.cc:3447
static MaybeObject * SetFastElementsCapacityAndLength(JSObject *obj, uint32_t capacity, uint32_t length)
Definition: elements.cc:972
virtual uint32_t GetCapacity(FixedArrayBase *backing_store)
Definition: elements.cc:728
PixelElementsAccessor(const char *name)
Definition: elements.cc:1250
Definition: objects.h:6746
Vector< Handle< Object > > HandleVector(v8::internal::Handle< T > *elms, int length)
Definition: v8utils.h:114
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)
Definition: elements.cc:738
T Min(T a, T b)
Definition: utils.h:229
static int NewElementsCapacity(int old_capacity)
Definition: objects.h:1748
static FixedArrayBase * cast(Object *object)
Definition: objects-inl.h:1669
ElementsAccessorBase(const char *name)
Definition: elements.cc:487
static uint32_t GetCapacityImpl(BackingStore *backing_store)
Definition: elements.cc:724
virtual MaybeObject * Delete(JSObject *obj, uint32_t key, JSReceiver::DeleteMode mode)
Definition: elements.cc:883
Handle< Object > NewNumberFromUint(uint32_t value, PretenureFlag pretenure=NOT_TENURED)
Definition: factory.cc:597
static void ValidateContents(JSObject *holder, int length)
Definition: elements.cc:495
ElementsKind GetHoleyElementsKind(ElementsKind packed_kind)
const char * name() const
Definition: elements.h:47
void ElementsRemoved(int n)
Definition: objects.h:2801
int FastD2I(double x)
Definition: conversions.h:64
static MUST_USE_RESULT MaybeObject * GetImpl(Object *receiver, JSObject *obj, uint32_t key, SeededNumberDictionary *backing_store)
Definition: elements.cc:1407
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)
Definition: elements.cc:936