Chromium Code Reviews| Index: src/builtins.cc |
| diff --git a/src/builtins.cc b/src/builtins.cc |
| index d34d6c2c9787af3c26b226fdf8eea020c4b98943..836a53bfc17a6d099b93f7b81d8bb64981393310 100644 |
| --- a/src/builtins.cc |
| +++ b/src/builtins.cc |
| @@ -266,6 +266,7 @@ inline bool EnsureJSArrayWithWritableFastElements(Isolate* isolate, |
| Arguments* args, |
| int first_added_arg) { |
| if (!receiver->IsJSArray()) return false; |
| + |
| Handle<JSArray> array = Handle<JSArray>::cast(receiver); |
| ElementsKind origin_kind = array->GetElementsKind(); |
| if (IsDictionaryElementsKind(origin_kind)) return false; |
| @@ -1212,14 +1213,6 @@ bool IterateElements(Isolate* isolate, Handle<JSReceiver> receiver, |
| return true; |
| } |
| - |
| -bool HasConcatSpreadableModifier(Isolate* isolate, Handle<JSArray> obj) { |
| - Handle<Symbol> key(isolate->factory()->is_concat_spreadable_symbol()); |
| - Maybe<bool> maybe = JSReceiver::HasProperty(obj, key); |
| - return maybe.FromMaybe(false); |
| -} |
| - |
| - |
| static Maybe<bool> IsConcatSpreadable(Isolate* isolate, Handle<Object> obj) { |
| HandleScope handle_scope(isolate); |
| if (!obj->IsJSReceiver()) return Just(false); |
| @@ -1414,6 +1407,19 @@ Object* Slow_ArrayConcat(Arguments* args, Handle<Object> species, |
| } |
| } |
| +bool FastArrayHasIsConcatSpreadable(Isolate* isolate, Handle<JSArray> obj) { |
| + { |
| + DisallowHeapAllocation no_gc; |
| + Map* map = obj->map(); |
| + if (!isolate->IsArrayIsConcatSpreadableSet() && |
| + map->prototype() == *isolate->initial_array_prototype()) { |
|
Toon Verwaest
2016/03/31 08:09:46
isolate->[NATIVE_CONTEXT_FIELD]() does Handle<...>
|
| + // If there is only the 'length' property we are fine. |
| + if (map->NumberOfOwnDescriptors() == 1) return false; |
| + } |
| + } |
| + // TODO(cbruni): slower lookup for array subclasses |
| + return true; |
| +} |
| MaybeHandle<JSArray> Fast_ArrayConcat(Isolate* isolate, Arguments* args) { |
| int n_arguments = args->length(); |
| @@ -1433,7 +1439,7 @@ MaybeHandle<JSArray> Fast_ArrayConcat(Isolate* isolate, Arguments* args) { |
| return MaybeHandle<JSArray>(); |
| } |
| Handle<JSArray> array(JSArray::cast(arg), isolate); |
| - if (HasConcatSpreadableModifier(isolate, array)) { |
| + if (FastArrayHasIsConcatSpreadable(isolate, array)) { |
| return MaybeHandle<JSArray>(); |
| } |
| int len = Smi::cast(array->length())->value(); |
| @@ -1443,7 +1449,7 @@ MaybeHandle<JSArray> Fast_ArrayConcat(Isolate* isolate, Arguments* args) { |
| STATIC_ASSERT(FixedArray::kMaxLength < kHalfOfMaxInt); |
| USE(kHalfOfMaxInt); |
| result_len += len; |
| - DCHECK(result_len >= 0); |
| + DCHECK(0 <= result_len); |
|
Toon Verwaest
2016/03/31 08:09:46
DCHECK_LE(...)
|
| // Throw an Error if we overflow the FixedArray limits |
| if (FixedArray::kMaxLength < result_len) { |
| THROW_NEW_ERROR(isolate, |
| @@ -1452,7 +1458,7 @@ MaybeHandle<JSArray> Fast_ArrayConcat(Isolate* isolate, Arguments* args) { |
| } |
| } |
| } |
| - return ElementsAccessor::Concat(isolate, args, n_arguments); |
| + return ElementsAccessor::Concat(isolate, args, n_arguments, result_len); |
| } |
| } // namespace |