Chromium Code Reviews| Index: src/runtime/runtime-array.cc |
| diff --git a/src/runtime/runtime-array.cc b/src/runtime/runtime-array.cc |
| index 3c5e817de9a5e124c7a58827a771b76a3d2b1c36..b369a1a18801932caafa2fa8fe6cbec265dbbcac 100644 |
| --- a/src/runtime/runtime-array.cc |
| +++ b/src/runtime/runtime-array.cc |
| @@ -70,6 +70,7 @@ RUNTIME_FUNCTION(Runtime_SpecialArrayFunctions) { |
| InstallBuiltin(isolate, holder, "slice", Builtins::kArraySlice); |
| InstallBuiltin(isolate, holder, "splice", Builtins::kArraySplice); |
| InstallBuiltin(isolate, holder, "includes", Builtins::kArrayIncludes, 2); |
| + InstallBuiltin(isolate, holder, "indexOf", Builtins::kArrayIndexOf, 2); |
| return *holder; |
| } |
| @@ -374,8 +375,7 @@ RUNTIME_FUNCTION(Runtime_GrowArrayElements) { |
| uint32_t index = static_cast<uint32_t>(key); |
| if (index >= capacity) { |
| - if (object->map()->is_prototype_map() || |
| - object->WouldConvertToSlowElements(index)) { |
| + if (object->WouldConvertToSlowElements(index)) { |
|
Benedikt Meurer
2016/08/11 04:02:24
You seem to undo a correctness fix here.
mattloring
2016/08/15 17:31:09
Done.
|
| // We don't want to allow operations that cause lazy deopt. Return a Smi |
| // as a signal that optimized code should eagerly deoptimize. |
| return Smi::FromInt(0); |
| @@ -544,5 +544,86 @@ RUNTIME_FUNCTION(Runtime_ArrayIncludes_Slow) { |
| return isolate->heap()->false_value(); |
| } |
| +RUNTIME_FUNCTION(Runtime_ArrayIndexOf) { |
| + HandleScope shs(isolate); |
| + DCHECK(args.length() == 3); |
| + CONVERT_ARG_HANDLE_CHECKED(Object, search_element, 1); |
| + CONVERT_ARG_HANDLE_CHECKED(Object, from_index, 2); |
| + |
| + // Let O be ? ToObject(this value). |
| + Handle<JSReceiver> object; |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, object, Object::ToObject(isolate, handle(args[0], isolate))); |
|
Camillo Bruni
2016/08/12 10:46:49
nit: use args.at<Object>(0)
mattloring
2016/08/15 17:31:09
Done.
|
| + |
| + // Let len be ? ToLength(? Get(O, "length")). |
| + int64_t len; |
| + { |
| + if (object->map()->instance_type() == JS_ARRAY_TYPE) { |
|
Camillo Bruni
2016/08/12 10:46:49
nit: object->IsJSArray()
mattloring
2016/08/15 17:31:09
Done.
|
| + uint32_t len32 = 0; |
| + bool success = JSArray::cast(*object)->length()->ToArrayLength(&len32); |
| + DCHECK(success); |
| + USE(success); |
| + len = len32; |
| + } else { |
| + Handle<Object> len_; |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, len_, |
| + Object::GetProperty(object, isolate->factory()->length_string())); |
| + |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, len_, |
| + Object::ToLength(isolate, len_)); |
| + len = static_cast<int64_t>(len_->Number()); |
| + DCHECK_EQ(len, len_->Number()); |
| + } |
| + } |
| + |
| + if (len == 0) return *isolate->factory()->NewNumberFromInt64(-1); |
|
Camillo Bruni
2016/08/12 10:46:49
nit: return Smi::FromInt(-1);
mattloring
2016/08/15 17:31:09
Done.
|
| + |
| + // Let n be ? ToInteger(fromIndex). (If fromIndex is undefined, this step |
| + // produces the value 0.) |
| + int64_t start_from; |
| + { |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, from_index, |
| + Object::ToInteger(isolate, from_index)); |
| + double fp = from_index->Number(); |
| + if (fp > len) return *isolate->factory()->NewNumberFromInt64(-1); |
|
Camillo Bruni
2016/08/12 10:46:49
nit: return Smi::FromInt(-1);
mattloring
2016/08/15 17:31:09
Done.
|
| + start_from = static_cast<int64_t>(fp); |
| + } |
| + |
| + int64_t index; |
| + if (start_from >= 0) { |
| + index = start_from; |
| + } else { |
| + index = len + start_from; |
| + if (index < 0) { |
| + index = 0; |
| + } |
| + } |
| + |
| + // TODO(mattloring): specialize for reciever types as with include. |
|
Camillo Bruni
2016/08/12 10:46:49
Pretty please ;)
mattloring
2016/08/17 23:27:20
Added in the most recent patch set.
|
| + |
| + // Otherwise, perform slow lookups for special receiver types |
| + for (; index < len; ++index) { |
| + // Let elementK be the result of ? Get(O, ! ToString(k)). |
| + Handle<Object> element_k; |
| + { |
| + Handle<Object> index_obj = isolate->factory()->NewNumberFromInt64(index); |
| + bool success; |
| + LookupIterator it = LookupIterator::PropertyOrElement( |
| + isolate, object, index_obj, &success); |
| + DCHECK(success); |
| + if (!JSReceiver::HasProperty(&it).FromJust()) { |
| + continue; |
| + } |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, element_k, |
| + Object::GetProperty(&it)); |
| + if (search_element->StrictEquals(*element_k)) { |
| + return *index_obj; |
| + } |
| + } |
| + } |
| + return *isolate->factory()->NewNumberFromInt64(-1); |
|
Camillo Bruni
2016/08/12 10:46:49
nit: return Smi::FromInt(-1);
mattloring
2016/08/15 17:31:09
Done.
|
| +} |
| + |
| } // namespace internal |
| } // namespace v8 |