Chromium Code Reviews| Index: src/builtins.cc |
| diff --git a/src/builtins.cc b/src/builtins.cc |
| index b82d08637a685e2ea3f32880d7413e02aeccd93e..556a52cec046210efcf3aad2fb6bb123d0f408a1 100644 |
| --- a/src/builtins.cc |
| +++ b/src/builtins.cc |
| @@ -843,6 +843,12 @@ uint32_t EstimateElementCount(Handle<JSArray> array) { |
| #undef TYPED_ARRAY_CASE |
| // External arrays are always dense. |
| return length; |
| + case NO_ELEMENTS: |
| + return 0; |
| + case FAST_STRING_WRAPPER_ELEMENTS: |
| + case SLOW_STRING_WRAPPER_ELEMENTS: |
| + UNREACHABLE(); |
| + return 0; |
| } |
| // As an estimate, we assume that the prototype doesn't contain any |
| // inherited elements. |
| @@ -983,6 +989,28 @@ void CollectElementIndices(Handle<JSObject> object, uint32_t range, |
| } |
| break; |
| } |
| + case FAST_STRING_WRAPPER_ELEMENTS: |
| + case SLOW_STRING_WRAPPER_ELEMENTS: { |
| + DCHECK(object->IsJSValue()); |
| + Handle<JSValue> js_value = Handle<JSValue>::cast(object); |
| + DCHECK(js_value->value()->IsString()); |
| + Handle<String> string(String::cast(js_value->value()), isolate); |
| + int length = string->length(); |
| + int i = 0; |
| + int limit = length < range ? length : range; |
|
Toon Verwaest
2016/01/27 15:02:21
int limit = Min(length, range)
Jakob Kummerow
2016/01/29 14:31:26
Done.
|
| + for (; i < limit; i++) { |
| + indices->Add(i); |
| + } |
| + ElementsAccessor* accessor = object->GetElementsAccessor(); |
| + for (; i < range; i++) { |
| + if (accessor->HasElement(object, i)) { |
| + indices->Add(i); |
| + } |
| + } |
| + break; |
| + } |
| + case NO_ELEMENTS: |
| + break; |
| } |
| PrototypeIterator iter(isolate, object); |
| @@ -1218,6 +1246,13 @@ bool IterateElements(Isolate* isolate, Handle<JSReceiver> receiver, |
| } |
| break; |
| } |
| + case NO_ELEMENTS: |
| + break; |
| + case FAST_STRING_WRAPPER_ELEMENTS: |
| + case SLOW_STRING_WRAPPER_ELEMENTS: |
| + // |array| is guaranteed to be an array or typed array. |
| + UNREACHABLE(); |
| + break; |
| } |
| visitor->increase_index_offset(length); |
| return true; |
| @@ -1367,6 +1402,7 @@ Object* Slow_ArrayConcat(Arguments* args, Handle<Object> species, |
| case FAST_HOLEY_ELEMENTS: |
| case FAST_ELEMENTS: |
| case DICTIONARY_ELEMENTS: |
| + case NO_ELEMENTS: |
| DCHECK_EQ(0u, length); |
| break; |
| default: |
| @@ -1728,7 +1764,7 @@ BUILTIN(ObjectValues) { |
| CONVERT_TO_STRING)); |
| for (int i = 0; i < keys->length(); ++i) { |
| - auto key = Handle<Name>::cast(FixedArray::get(keys, i)); |
| + auto key = Handle<Name>::cast(FixedArray::get(*keys, i, isolate)); |
| Handle<Object> value; |
| ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| @@ -1754,7 +1790,7 @@ BUILTIN(ObjectEntries) { |
| CONVERT_TO_STRING)); |
| for (int i = 0; i < keys->length(); ++i) { |
| - auto key = Handle<Name>::cast(FixedArray::get(keys, i)); |
| + auto key = Handle<Name>::cast(FixedArray::get(*keys, i, isolate)); |
| Handle<Object> value; |
| ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |