| Index: src/runtime/runtime-array.cc
|
| diff --git a/src/runtime/runtime-array.cc b/src/runtime/runtime-array.cc
|
| index c3a6d80ecf5ba422f0a2ff1ffa632a4cb5bd1269..523d8f5faa30653a0aae97e5d58096ef53bd3c4c 100644
|
| --- a/src/runtime/runtime-array.cc
|
| +++ b/src/runtime/runtime-array.cc
|
| @@ -104,19 +104,19 @@ class ArrayConcatVisitor {
|
| storage_(Handle<FixedArray>::cast(
|
| isolate->global_handles()->Create(*storage))),
|
| index_offset_(0u),
|
| - fast_elements_(fast_elements),
|
| - exceeds_array_limit_(false) {}
|
| + bit_field_(FastElementsField::encode(fast_elements) |
|
| + ExceedsLimitField::encode(false)) {}
|
|
|
| ~ArrayConcatVisitor() { clear_storage(); }
|
|
|
| void visit(uint32_t i, Handle<Object> elm) {
|
| if (i > JSObject::kMaxElementCount - index_offset_) {
|
| - exceeds_array_limit_ = true;
|
| + set_exceeds_array_limit(true);
|
| return;
|
| }
|
| uint32_t index = index_offset_ + i;
|
|
|
| - if (fast_elements_) {
|
| + if (fast_elements()) {
|
| if (index < static_cast<uint32_t>(storage_->length())) {
|
| storage_->set(index, *elm);
|
| return;
|
| @@ -128,7 +128,7 @@ class ArrayConcatVisitor {
|
| SetDictionaryMode();
|
| // Fall-through to dictionary mode.
|
| }
|
| - DCHECK(!fast_elements_);
|
| + DCHECK(!fast_elements());
|
| Handle<SeededNumberDictionary> dict(
|
| SeededNumberDictionary::cast(*storage_));
|
| Handle<SeededNumberDictionary> result =
|
| @@ -149,21 +149,23 @@ class ArrayConcatVisitor {
|
| // If the initial length estimate was off (see special case in visit()),
|
| // but the array blowing the limit didn't contain elements beyond the
|
| // provided-for index range, go to dictionary mode now.
|
| - if (fast_elements_ &&
|
| + if (fast_elements() &&
|
| index_offset_ >
|
| static_cast<uint32_t>(FixedArrayBase::cast(*storage_)->length())) {
|
| SetDictionaryMode();
|
| }
|
| }
|
|
|
| - bool exceeds_array_limit() { return exceeds_array_limit_; }
|
| + bool exceeds_array_limit() const {
|
| + return ExceedsLimitField::decode(bit_field_);
|
| + }
|
|
|
| Handle<JSArray> ToArray() {
|
| Handle<JSArray> array = isolate_->factory()->NewJSArray(0);
|
| Handle<Object> length =
|
| isolate_->factory()->NewNumber(static_cast<double>(index_offset_));
|
| Handle<Map> map = JSObject::GetElementsTransitionMap(
|
| - array, fast_elements_ ? FAST_HOLEY_ELEMENTS : DICTIONARY_ELEMENTS);
|
| + array, fast_elements() ? FAST_HOLEY_ELEMENTS : DICTIONARY_ELEMENTS);
|
| array->set_map(*map);
|
| array->set_length(*length);
|
| array->set_elements(*storage_);
|
| @@ -173,7 +175,7 @@ class ArrayConcatVisitor {
|
| private:
|
| // Convert storage to dictionary mode.
|
| void SetDictionaryMode() {
|
| - DCHECK(fast_elements_);
|
| + DCHECK(fast_elements());
|
| Handle<FixedArray> current_storage(*storage_);
|
| Handle<SeededNumberDictionary> slow_storage(
|
| SeededNumberDictionary::New(isolate_, current_storage->length()));
|
| @@ -191,7 +193,7 @@ class ArrayConcatVisitor {
|
| }
|
| clear_storage();
|
| set_storage(*slow_storage);
|
| - fast_elements_ = false;
|
| + set_fast_elements(false);
|
| }
|
|
|
| inline void clear_storage() {
|
| @@ -203,13 +205,23 @@ class ArrayConcatVisitor {
|
| Handle<FixedArray>::cast(isolate_->global_handles()->Create(storage));
|
| }
|
|
|
| + class FastElementsField : public BitField<bool, 0, 1> {};
|
| + class ExceedsLimitField : public BitField<bool, 1, 1> {};
|
| +
|
| + bool fast_elements() const { return FastElementsField::decode(bit_field_); }
|
| + void set_fast_elements(bool fast) {
|
| + bit_field_ = FastElementsField::update(bit_field_, fast);
|
| + }
|
| + void set_exceeds_array_limit(bool exceeds) {
|
| + bit_field_ = ExceedsLimitField::update(bit_field_, exceeds);
|
| + }
|
| +
|
| Isolate* isolate_;
|
| Handle<FixedArray> storage_; // Always a global handle.
|
| // Index after last seen index. Always less than or equal to
|
| // JSObject::kMaxElementCount.
|
| uint32_t index_offset_;
|
| - bool fast_elements_ : 1;
|
| - bool exceeds_array_limit_ : 1;
|
| + uint32_t bit_field_;
|
| };
|
|
|
|
|
|
|