| Index: src/elements.cc
|
| diff --git a/src/elements.cc b/src/elements.cc
|
| index 2faa9ff9abaf6feba0c107b4168cde3876cc6454..748b420cda863facede6c0e056da75ad721bd7e8 100644
|
| --- a/src/elements.cc
|
| +++ b/src/elements.cc
|
| @@ -604,7 +604,7 @@ class ElementsAccessorBase : public ElementsAccessor {
|
| static bool HasElementImpl(Isolate* isolate, Handle<JSObject> holder,
|
| uint32_t index,
|
| Handle<FixedArrayBase> backing_store,
|
| - PropertyFilter filter) {
|
| + PropertyFilter filter = ALL_PROPERTIES) {
|
| return Subclass::GetEntryForIndexImpl(isolate, *holder, *backing_store,
|
| index, filter) != kMaxUInt32;
|
| }
|
| @@ -619,15 +619,16 @@ class ElementsAccessorBase : public ElementsAccessor {
|
| }
|
|
|
| Handle<Object> Get(Handle<JSObject> holder, uint32_t entry) final {
|
| - return Subclass::GetImpl(holder, entry);
|
| + return Subclass::GetInternalImpl(holder, entry);
|
| }
|
|
|
| - static Handle<Object> GetImpl(Handle<JSObject> holder, uint32_t entry) {
|
| - return Subclass::GetImpl(holder->elements(), entry);
|
| + static Handle<Object> GetInternalImpl(Handle<JSObject> holder,
|
| + uint32_t entry) {
|
| + return Subclass::GetImpl(holder->GetIsolate(), holder->elements(), entry);
|
| }
|
|
|
| - static Handle<Object> GetImpl(FixedArrayBase* backing_store, uint32_t entry) {
|
| - Isolate* isolate = backing_store->GetIsolate();
|
| + static Handle<Object> GetImpl(Isolate* isolate, FixedArrayBase* backing_store,
|
| + uint32_t entry) {
|
| uint32_t index = GetIndexForEntryImpl(backing_store, entry);
|
| return handle(BackingStore::cast(backing_store)->get(index), isolate);
|
| }
|
| @@ -1032,7 +1033,7 @@ class ElementsAccessorBase : public ElementsAccessor {
|
| PropertyDetails details = Subclass::GetDetailsImpl(*object, entry);
|
|
|
| if (details.kind() == kData) {
|
| - value = Subclass::GetImpl(object, entry);
|
| + value = Subclass::GetImpl(isolate, object->elements(), entry);
|
| } else {
|
| LookupIterator it(isolate, object, index, LookupIterator::OWN);
|
| ASSIGN_RETURN_ON_EXCEPTION_VALUE(
|
| @@ -1257,6 +1258,17 @@ class ElementsAccessorBase : public ElementsAccessor {
|
| return Subclass::GetDetailsImpl(holder, entry);
|
| }
|
|
|
| + Handle<FixedArray> CreateListFromArray(Isolate* isolate,
|
| + Handle<JSArray> array) final {
|
| + return Subclass::CreateListFromArrayImpl(isolate, array);
|
| + };
|
| +
|
| + static Handle<FixedArray> CreateListFromArrayImpl(Isolate* isolate,
|
| + Handle<JSArray> array) {
|
| + UNREACHABLE();
|
| + return Handle<FixedArray>();
|
| + }
|
| +
|
| private:
|
| DISALLOW_COPY_AND_ASSIGN(ElementsAccessorBase);
|
| };
|
| @@ -1382,12 +1394,9 @@ class DictionaryElementsAccessor
|
| return backing_store->ValueAt(entry);
|
| }
|
|
|
| - static Handle<Object> GetImpl(Handle<JSObject> holder, uint32_t entry) {
|
| - return GetImpl(holder->elements(), entry);
|
| - }
|
| -
|
| - static Handle<Object> GetImpl(FixedArrayBase* backing_store, uint32_t entry) {
|
| - return handle(GetRaw(backing_store, entry), backing_store->GetIsolate());
|
| + static Handle<Object> GetImpl(Isolate* isolate, FixedArrayBase* backing_store,
|
| + uint32_t entry) {
|
| + return handle(GetRaw(backing_store, entry), isolate);
|
| }
|
|
|
| static inline void SetImpl(Handle<JSObject> holder, uint32_t entry,
|
| @@ -1770,7 +1779,7 @@ class FastElementsAccessor : public ElementsAccessorBase<Subclass, KindTraits> {
|
| if (IsHoleyElementsKind(kind)) {
|
| if (BackingStore::cast(*store)->is_the_hole(isolate, i)) continue;
|
| }
|
| - Handle<Object> value = Subclass::GetImpl(*store, i);
|
| + Handle<Object> value = Subclass::GetImpl(isolate, *store, i);
|
| dictionary = SeededNumberDictionary::AddNumberEntry(
|
| dictionary, i, value, details, used_as_prototype);
|
| j++;
|
| @@ -1931,7 +1940,7 @@ class FastElementsAccessor : public ElementsAccessorBase<Subclass, KindTraits> {
|
| for (uint32_t i = 0; i < length; i++) {
|
| if (IsFastPackedElementsKind(KindTraits::Kind) ||
|
| HasEntryImpl(isolate, *elements, i)) {
|
| - accumulator->AddKey(Subclass::GetImpl(*elements, i), convert);
|
| + accumulator->AddKey(Subclass::GetImpl(isolate, *elements, i), convert);
|
| }
|
| }
|
| }
|
| @@ -2072,7 +2081,7 @@ class FastElementsAccessor : public ElementsAccessorBase<Subclass, KindTraits> {
|
| uint32_t length = elements->length();
|
| for (uint32_t index = 0; index < length; ++index) {
|
| if (!HasEntryImpl(isolate, *elements, index)) continue;
|
| - Handle<Object> value = Subclass::GetImpl(*elements, index);
|
| + Handle<Object> value = Subclass::GetImpl(isolate, *elements, index);
|
| if (get_entries) {
|
| value = MakeEntryPair(isolate, index, value);
|
| }
|
| @@ -2262,6 +2271,24 @@ class FastElementsAccessor : public ElementsAccessorBase<Subclass, KindTraits> {
|
| }
|
| }
|
|
|
| + static Handle<FixedArray> CreateListFromArrayImpl(Isolate* isolate,
|
| + Handle<JSArray> array) {
|
| + uint32_t length = 0;
|
| + array->length()->ToArrayLength(&length);
|
| + Handle<FixedArray> result = isolate->factory()->NewFixedArray(length);
|
| + Handle<FixedArrayBase> elements(array->elements(), isolate);
|
| + for (uint32_t i = 0; i < length; i++) {
|
| + if (!Subclass::HasElementImpl(isolate, array, i, elements)) continue;
|
| + Handle<Object> value;
|
| + value = Subclass::GetImpl(isolate, *elements, i);
|
| + if (value->IsName()) {
|
| + value = isolate->factory()->InternalizeName(Handle<Name>::cast(value));
|
| + }
|
| + result->set(i, *value);
|
| + }
|
| + return result;
|
| + }
|
| +
|
| private:
|
| // SpliceShrinkStep might modify the backing_store.
|
| static void SpliceShrinkStep(Isolate* isolate, Handle<JSArray> receiver,
|
| @@ -2320,7 +2347,8 @@ class FastElementsAccessor : public ElementsAccessorBase<Subclass, KindTraits> {
|
| DCHECK(length > 0);
|
| int new_length = length - 1;
|
| int remove_index = remove_position == AT_START ? 0 : new_length;
|
| - Handle<Object> result = Subclass::GetImpl(*backing_store, remove_index);
|
| + Handle<Object> result =
|
| + Subclass::GetImpl(isolate, *backing_store, remove_index);
|
| if (remove_position == AT_START) {
|
| Subclass::MoveElements(isolate, receiver, backing_store, 0, 1, new_length,
|
| 0, 0);
|
| @@ -2541,12 +2569,8 @@ class FastDoubleElementsAccessor
|
| explicit FastDoubleElementsAccessor(const char* name)
|
| : FastElementsAccessor<Subclass, KindTraits>(name) {}
|
|
|
| - static Handle<Object> GetImpl(Handle<JSObject> holder, uint32_t entry) {
|
| - return GetImpl(holder->elements(), entry);
|
| - }
|
| -
|
| - static Handle<Object> GetImpl(FixedArrayBase* backing_store, uint32_t entry) {
|
| - Isolate* isolate = backing_store->GetIsolate();
|
| + static Handle<Object> GetImpl(Isolate* isolate, FixedArrayBase* backing_store,
|
| + uint32_t entry) {
|
| return FixedDoubleArray::get(FixedDoubleArray::cast(backing_store), entry,
|
| isolate);
|
| }
|
| @@ -2693,11 +2717,8 @@ class TypedElementsAccessor
|
| BackingStore::cast(backing_store)->SetValue(entry, value);
|
| }
|
|
|
| - static Handle<Object> GetImpl(Handle<JSObject> holder, uint32_t entry) {
|
| - return GetImpl(holder->elements(), entry);
|
| - }
|
| -
|
| - static Handle<Object> GetImpl(FixedArrayBase* backing_store, uint32_t entry) {
|
| + static Handle<Object> GetImpl(Isolate* isolate, FixedArrayBase* backing_store,
|
| + uint32_t entry) {
|
| return BackingStore::get(BackingStore::cast(backing_store), entry);
|
| }
|
|
|
| @@ -2761,10 +2782,11 @@ class TypedElementsAccessor
|
| static void AddElementsToKeyAccumulatorImpl(Handle<JSObject> receiver,
|
| KeyAccumulator* accumulator,
|
| AddKeyConversion convert) {
|
| + Isolate* isolate = receiver->GetIsolate();
|
| Handle<FixedArrayBase> elements(receiver->elements());
|
| uint32_t length = AccessorClass::GetCapacityImpl(*receiver, *elements);
|
| for (uint32_t i = 0; i < length; i++) {
|
| - Handle<Object> value = AccessorClass::GetImpl(*elements, i);
|
| + Handle<Object> value = AccessorClass::GetImpl(isolate, *elements, i);
|
| accumulator->AddKey(value, convert);
|
| }
|
| }
|
| @@ -2778,7 +2800,8 @@ class TypedElementsAccessor
|
| Handle<FixedArrayBase> elements(object->elements());
|
| uint32_t length = AccessorClass::GetCapacityImpl(*object, *elements);
|
| for (uint32_t index = 0; index < length; ++index) {
|
| - Handle<Object> value = AccessorClass::GetImpl(*elements, index);
|
| + Handle<Object> value =
|
| + AccessorClass::GetImpl(isolate, *elements, index);
|
| if (get_entries) {
|
| value = MakeEntryPair(isolate, index, value);
|
| }
|
| @@ -2901,12 +2924,8 @@ class SloppyArgumentsElementsAccessor
|
| USE(KindTraits::Kind);
|
| }
|
|
|
| - static Handle<Object> GetImpl(Handle<JSObject> holder, uint32_t entry) {
|
| - return GetImpl(holder->elements(), entry);
|
| - }
|
| -
|
| - static Handle<Object> GetImpl(FixedArrayBase* parameters, uint32_t entry) {
|
| - Isolate* isolate = parameters->GetIsolate();
|
| + static Handle<Object> GetImpl(Isolate* isolate, FixedArrayBase* parameters,
|
| + uint32_t entry) {
|
| Handle<FixedArray> parameter_map(FixedArray::cast(parameters), isolate);
|
| uint32_t length = parameter_map->length() - 2;
|
| if (entry < length) {
|
| @@ -2919,7 +2938,7 @@ class SloppyArgumentsElementsAccessor
|
| } else {
|
| // Object is not mapped, defer to the arguments.
|
| Handle<Object> result = ArgumentsAccessor::GetImpl(
|
| - FixedArray::cast(parameter_map->get(1)), entry - length);
|
| + isolate, FixedArray::cast(parameter_map->get(1)), entry - length);
|
| // Elements of the arguments object in slow mode might be slow aliases.
|
| if (result->IsAliasedArgumentsEntry()) {
|
| DisallowHeapAllocation no_gc;
|
| @@ -3017,7 +3036,7 @@ class SloppyArgumentsElementsAccessor
|
| uint32_t length = GetCapacityImpl(*receiver, *elements);
|
| for (uint32_t entry = 0; entry < length; entry++) {
|
| if (!HasEntryImpl(isolate, *elements, entry)) continue;
|
| - Handle<Object> value = GetImpl(*elements, entry);
|
| + Handle<Object> value = GetImpl(isolate, *elements, entry);
|
| accumulator->AddKey(value, convert);
|
| }
|
| }
|
| @@ -3153,7 +3172,8 @@ class SloppyArgumentsElementsAccessor
|
| continue;
|
| }
|
|
|
| - Handle<Object> element_k = GetImpl(*parameter_map, entry);
|
| + Handle<Object> element_k =
|
| + Subclass::GetImpl(isolate, *parameter_map, entry);
|
|
|
| if (element_k->IsAccessorPair()) {
|
| LookupIterator it(isolate, object, k, LookupIterator::OWN);
|
| @@ -3192,7 +3212,8 @@ class SloppyArgumentsElementsAccessor
|
| continue;
|
| }
|
|
|
| - Handle<Object> element_k = GetImpl(*parameter_map, entry);
|
| + Handle<Object> element_k =
|
| + Subclass::GetImpl(isolate, *parameter_map, entry);
|
|
|
| if (element_k->IsAccessorPair()) {
|
| LookupIterator it(isolate, object, k, LookupIterator::OWN);
|
| @@ -3337,7 +3358,7 @@ class FastSloppyArgumentsElementsAccessor
|
| uint32_t entry = GetEntryForIndexImpl(isolate, *receiver, parameters, i,
|
| ALL_PROPERTIES);
|
| if (entry != kMaxUInt32 && HasEntryImpl(isolate, parameters, entry)) {
|
| - elements->set(insertion_index, *GetImpl(parameters, entry));
|
| + elements->set(insertion_index, *GetImpl(isolate, parameters, entry));
|
| } else {
|
| elements->set_the_hole(isolate, insertion_index);
|
| }
|
| @@ -3437,6 +3458,11 @@ class StringWrapperElementsAccessor
|
| USE(KindTraits::Kind);
|
| }
|
|
|
| + static Handle<Object> GetInternalImpl(Handle<JSObject> holder,
|
| + uint32_t entry) {
|
| + return GetImpl(holder, entry);
|
| + }
|
| +
|
| static Handle<Object> GetImpl(Handle<JSObject> holder, uint32_t entry) {
|
| Isolate* isolate = holder->GetIsolate();
|
| Handle<String> string(GetString(*holder), isolate);
|
| @@ -3445,7 +3471,14 @@ class StringWrapperElementsAccessor
|
| return isolate->factory()->LookupSingleCharacterStringFromCode(
|
| String::Flatten(string)->Get(entry));
|
| }
|
| - return BackingStoreAccessor::GetImpl(holder, entry - length);
|
| + return BackingStoreAccessor::GetImpl(isolate, holder->elements(),
|
| + entry - length);
|
| + }
|
| +
|
| + static Handle<Object> GetImpl(Isolate* isolate, FixedArrayBase* elements,
|
| + uint32_t entry) {
|
| + UNREACHABLE();
|
| + return Handle<Object>();
|
| }
|
|
|
| static PropertyDetails GetDetailsImpl(JSObject* holder, uint32_t entry) {
|
|
|