| Index: src/elements.cc
|
| diff --git a/src/elements.cc b/src/elements.cc
|
| index d935fb1b9cdb7662805f10ab8f03521d407180d7..087b625c63852582a9d7f22d006e64b2799208cf 100644
|
| --- a/src/elements.cc
|
| +++ b/src/elements.cc
|
| @@ -768,9 +768,10 @@ class ElementsAccessorBase : public ElementsAccessor {
|
| return obj;
|
| }
|
|
|
| - MUST_USE_RESULT virtual MaybeObject* Delete(JSObject* obj,
|
| - uint32_t key,
|
| - JSReceiver::DeleteMode mode) = 0;
|
| + MUST_USE_RESULT virtual Handle<Object> Delete(
|
| + Handle<JSObject> obj,
|
| + uint32_t key,
|
| + JSReceiver::DeleteMode mode) = 0;
|
|
|
| MUST_USE_RESULT static MaybeObject* CopyElementsImpl(FixedArrayBase* from,
|
| uint32_t from_start,
|
| @@ -999,42 +1000,38 @@ class FastElementsAccessor
|
| Object);
|
| }
|
|
|
| - static MaybeObject* DeleteCommon(JSObject* obj,
|
| - uint32_t key,
|
| - JSReceiver::DeleteMode mode) {
|
| + static Handle<Object> DeleteCommon(Handle<JSObject> obj,
|
| + uint32_t key,
|
| + JSReceiver::DeleteMode mode) {
|
| ASSERT(obj->HasFastSmiOrObjectElements() ||
|
| obj->HasFastDoubleElements() ||
|
| obj->HasFastArgumentsElements());
|
| + Isolate* isolate = obj->GetIsolate();
|
| Heap* heap = obj->GetHeap();
|
| - Object* elements = obj->elements();
|
| - if (elements == heap->empty_fixed_array()) {
|
| - return heap->true_value();
|
| + Handle<Object> elements = handle(obj->elements(), isolate);
|
| + if (*elements == heap->empty_fixed_array()) {
|
| + return isolate->factory()->true_value();
|
| }
|
| - typename KindTraits::BackingStore* backing_store =
|
| - KindTraits::BackingStore::cast(elements);
|
| + Handle<BackingStore> backing_store = Handle<BackingStore>::cast(elements);
|
| bool is_sloppy_arguments_elements_map =
|
| backing_store->map() == heap->sloppy_arguments_elements_map();
|
| if (is_sloppy_arguments_elements_map) {
|
| - backing_store = KindTraits::BackingStore::cast(
|
| - FixedArray::cast(backing_store)->get(1));
|
| + backing_store = Handle<BackingStore>::cast(
|
| + handle(Handle<FixedArray>::cast(backing_store)->get(1), isolate));
|
| }
|
| uint32_t length = static_cast<uint32_t>(
|
| obj->IsJSArray()
|
| - ? Smi::cast(JSArray::cast(obj)->length())->value()
|
| + ? Smi::cast(Handle<JSArray>::cast(obj)->length())->value()
|
| : backing_store->length());
|
| if (key < length) {
|
| if (!is_sloppy_arguments_elements_map) {
|
| ElementsKind kind = KindTraits::Kind;
|
| if (IsFastPackedElementsKind(kind)) {
|
| - MaybeObject* transitioned =
|
| - obj->TransitionElementsKind(GetHoleyElementsKind(kind));
|
| - if (transitioned->IsFailure()) return transitioned;
|
| + JSObject::TransitionElementsKind(obj, GetHoleyElementsKind(kind));
|
| }
|
| if (IsFastSmiOrObjectElementsKind(KindTraits::Kind)) {
|
| - Object* writable;
|
| - MaybeObject* maybe = obj->EnsureWritableFastElements();
|
| - if (!maybe->ToObject(&writable)) return maybe;
|
| - backing_store = KindTraits::BackingStore::cast(writable);
|
| + Handle<Object> writable = JSObject::EnsureWritableFastElements(obj);
|
| + backing_store = Handle<BackingStore>::cast(writable);
|
| }
|
| }
|
| backing_store->set_the_hole(key);
|
| @@ -1044,7 +1041,7 @@ class FastElementsAccessor
|
| // one adjacent hole to the value being deleted.
|
| const int kMinLengthForSparsenessCheck = 64;
|
| if (backing_store->length() >= kMinLengthForSparsenessCheck &&
|
| - !heap->InNewSpace(backing_store) &&
|
| + !heap->InNewSpace(*backing_store) &&
|
| ((key > 0 && backing_store->is_the_hole(key - 1)) ||
|
| (key + 1 < length && backing_store->is_the_hole(key + 1)))) {
|
| int num_used = 0;
|
| @@ -1054,17 +1051,16 @@ class FastElementsAccessor
|
| if (4 * num_used > backing_store->length()) break;
|
| }
|
| if (4 * num_used <= backing_store->length()) {
|
| - MaybeObject* result = obj->NormalizeElements();
|
| - if (result->IsFailure()) return result;
|
| + JSObject::NormalizeElements(obj);
|
| }
|
| }
|
| }
|
| - return heap->true_value();
|
| + return isolate->factory()->true_value();
|
| }
|
|
|
| - virtual MaybeObject* Delete(JSObject* obj,
|
| - uint32_t key,
|
| - JSReceiver::DeleteMode mode) {
|
| + virtual Handle<Object> Delete(Handle<JSObject> obj,
|
| + uint32_t key,
|
| + JSReceiver::DeleteMode mode) {
|
| return DeleteCommon(obj, key, mode);
|
| }
|
|
|
| @@ -1396,11 +1392,11 @@ class TypedElementsAccessor
|
| return obj;
|
| }
|
|
|
| - MUST_USE_RESULT virtual MaybeObject* Delete(JSObject* obj,
|
| - uint32_t key,
|
| - JSReceiver::DeleteMode mode) {
|
| + MUST_USE_RESULT virtual Handle<Object> Delete(Handle<JSObject> obj,
|
| + uint32_t key,
|
| + JSReceiver::DeleteMode mode) {
|
| // External arrays always ignore deletes.
|
| - return obj->GetHeap()->true_value();
|
| + return obj->GetIsolate()->factory()->true_value();
|
| }
|
|
|
| static bool HasElementImpl(Object* receiver,
|
| @@ -1555,6 +1551,16 @@ class DictionaryElementsAccessor
|
| return heap->true_value();
|
| }
|
|
|
| + // TODO(ishell): Temporary wrapper until handlified.
|
| + MUST_USE_RESULT static Handle<Object> DeleteCommon(
|
| + Handle<JSObject> obj,
|
| + uint32_t key,
|
| + JSReceiver::DeleteMode mode) {
|
| + CALL_HEAP_FUNCTION(obj->GetIsolate(),
|
| + DeleteCommon(*obj, key, mode),
|
| + Object);
|
| + }
|
| +
|
| MUST_USE_RESULT static MaybeObject* CopyElementsImpl(FixedArrayBase* from,
|
| uint32_t from_start,
|
| FixedArrayBase* to,
|
| @@ -1571,9 +1577,9 @@ class DictionaryElementsAccessor
|
| friend class ElementsAccessorBase<DictionaryElementsAccessor,
|
| ElementsKindTraits<DICTIONARY_ELEMENTS> >;
|
|
|
| - MUST_USE_RESULT virtual MaybeObject* Delete(JSObject* obj,
|
| - uint32_t key,
|
| - JSReceiver::DeleteMode mode) {
|
| + MUST_USE_RESULT virtual Handle<Object> Delete(Handle<JSObject> obj,
|
| + uint32_t key,
|
| + JSReceiver::DeleteMode mode) {
|
| return DeleteCommon(obj, key, mode);
|
| }
|
|
|
| @@ -1763,18 +1769,21 @@ class SloppyArgumentsElementsAccessor : public ElementsAccessorBase<
|
| return obj;
|
| }
|
|
|
| - MUST_USE_RESULT virtual MaybeObject* Delete(JSObject* obj,
|
| - uint32_t key,
|
| - JSReceiver::DeleteMode mode) {
|
| - FixedArray* parameter_map = FixedArray::cast(obj->elements());
|
| - Object* probe = GetParameterMapArg(obj, parameter_map, key);
|
| + MUST_USE_RESULT virtual Handle<Object> Delete(Handle<JSObject> obj,
|
| + uint32_t key,
|
| + JSReceiver::DeleteMode mode) {
|
| + Isolate* isolate = obj->GetIsolate();
|
| + Handle<FixedArray> parameter_map =
|
| + handle(FixedArray::cast(obj->elements()), isolate);
|
| + Handle<Object> probe = GetParameterMapArg(obj, parameter_map, key);
|
| if (!probe->IsTheHole()) {
|
| // TODO(kmillikin): We could check if this was the last aliased
|
| // parameter, and revert to normal elements in that case. That
|
| // would enable GC of the context.
|
| parameter_map->set_the_hole(key + 2);
|
| } else {
|
| - FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
|
| + Handle<FixedArray> arguments =
|
| + handle(FixedArray::cast(parameter_map->get(1)), isolate);
|
| if (arguments->IsDictionary()) {
|
| return DictionaryElementsAccessor::DeleteCommon(obj, key, mode);
|
| } else {
|
| @@ -1784,7 +1793,7 @@ class SloppyArgumentsElementsAccessor : public ElementsAccessorBase<
|
| return FastHoleyObjectElementsAccessor::DeleteCommon(obj, key, mode);
|
| }
|
| }
|
| - return obj->GetHeap()->true_value();
|
| + return isolate->factory()->true_value();
|
| }
|
|
|
| MUST_USE_RESULT static MaybeObject* CopyElementsImpl(FixedArrayBase* from,
|
| @@ -1827,6 +1836,7 @@ class SloppyArgumentsElementsAccessor : public ElementsAccessorBase<
|
| }
|
|
|
| private:
|
| + // TODO(ishell): remove when all usages are handlified.
|
| static Object* GetParameterMapArg(JSObject* holder,
|
| FixedArray* parameter_map,
|
| uint32_t key) {
|
| @@ -1837,6 +1847,18 @@ class SloppyArgumentsElementsAccessor : public ElementsAccessorBase<
|
| ? parameter_map->get(key + 2)
|
| : parameter_map->GetHeap()->the_hole_value();
|
| }
|
| +
|
| + static Handle<Object> GetParameterMapArg(Handle<JSObject> holder,
|
| + Handle<FixedArray> parameter_map,
|
| + uint32_t key) {
|
| + Isolate* isolate = holder->GetIsolate();
|
| + uint32_t length = holder->IsJSArray()
|
| + ? Smi::cast(Handle<JSArray>::cast(holder)->length())->value()
|
| + : parameter_map->length();
|
| + return key < (length - 2)
|
| + ? handle(parameter_map->get(key + 2), isolate)
|
| + : Handle<Object>::cast(isolate->factory()->the_hole_value());
|
| + }
|
| };
|
|
|
|
|
|
|