Index: src/builtins.cc |
diff --git a/src/builtins.cc b/src/builtins.cc |
index 1ed2fd125315eea8ca4af113cab5a668ad25cb3c..cd64000f3a762bd6cd9c955bc2d334bac51bfec3 100644 |
--- a/src/builtins.cc |
+++ b/src/builtins.cc |
@@ -1172,16 +1172,6 @@ bool IterateElements(Isolate* isolate, Handle<JSObject> receiver, |
} |
-bool HasConcatSpreadableModifier(Isolate* isolate, Handle<JSArray> obj) { |
- if (!FLAG_harmony_concat_spreadable) return false; |
- Handle<Symbol> key(isolate->factory()->is_concat_spreadable_symbol()); |
- Maybe<bool> maybe = |
- JSReceiver::HasProperty(Handle<JSReceiver>::cast(obj), key); |
- if (!maybe.IsJust()) return false; |
- return maybe.FromJust(); |
-} |
- |
- |
bool IsConcatSpreadable(Isolate* isolate, Handle<Object> obj) { |
HandleScope handle_scope(isolate); |
if (!obj->IsSpecObject()) return false; |
@@ -1380,10 +1370,23 @@ Object* Slow_ArrayConcat(Arguments* args, Isolate* isolate) { |
} |
+bool FastArrayIsConcatSpreadable(Isolate* isolate, Handle<JSArray> obj) { |
+ if (!FLAG_harmony_concat_spreadable) return true; |
+ int nof = obj->map()->NumberOfOwnDescriptors(); |
+ // If there is only the 'length' property we are fine. |
+ if (nof == 1) return true; |
+ // In the other case do a full property lookup of @@isConcatSpreadable. |
+ return IsConcatSpreadable(isolate, obj); |
+} |
+ |
+ |
MaybeHandle<JSArray> Fast_ArrayConcat(Isolate* isolate, Arguments* args) { |
+ // TODO(cbruni): check for @@isConcatSpreadable set on the array/object |
+ // prototype |
if (!isolate->IsFastArrayConstructorPrototypeChainIntact()) { |
return MaybeHandle<JSArray>(); |
} |
+ if (isolate->IsArrayIsConcatSpreadableSet()) return MaybeHandle<JSArray>(); |
int n_arguments = args->length(); |
int result_len = 0; |
{ |
@@ -1398,7 +1401,8 @@ MaybeHandle<JSArray> Fast_ArrayConcat(Isolate* isolate, Arguments* args) { |
if (!array->HasFastElements()) return MaybeHandle<JSArray>(); |
PrototypeIterator iter(isolate, arg); |
if (iter.GetCurrent() != array_proto) return MaybeHandle<JSArray>(); |
- if (HasConcatSpreadableModifier(isolate, array)) { |
+ bool is_concat_spreadable = FastArrayIsConcatSpreadable(isolate, array); |
+ if (!is_concat_spreadable || isolate->has_pending_exception()) { |
return MaybeHandle<JSArray>(); |
} |
int len = Smi::cast(array->length())->value(); |