Chromium Code Reviews| Index: src/builtins/builtins-spread.cc |
| diff --git a/src/builtins/builtins-spread.cc b/src/builtins/builtins-spread.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..87a55ba1a40960d2a2d856299632242bc71f6f0a |
| --- /dev/null |
| +++ b/src/builtins/builtins-spread.cc |
| @@ -0,0 +1,49 @@ |
| +// Copyright 2016 the V8 project authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "src/builtins/builtins-utils.h" |
| +#include "src/builtins/builtins.h" |
| + |
| +namespace v8 { |
| +namespace internal { |
| + |
| +BUILTIN(SpreadIterablePrepare) { |
| + HandleScope scope(isolate); |
| + DCHECK_EQ(2, args.length()); |
| + Handle<Object> spread = args.at<Object>(1); |
| + |
| + if (spread->IsJSArray()) { |
| + // Check that the spread arg has fast elements |
| + Handle<JSArray> spread_array = Handle<JSArray>::cast(spread); |
| + ElementsKind array_kind = spread_array->GetElementsKind(); |
| + |
| + if (IsFastElementsKind(array_kind)) { |
| + // Check that the iterator hasn't been touched |
| + Handle<Object> iterator_func; |
| + Handle<Name> it_name = isolate->factory()->iterator_symbol(); |
| + |
| + if (Object::GetProperty(spread, it_name).ToHandle(&iterator_func)) { |
|
Yang
2016/11/08 14:08:41
Does this violate the spec? GetProperty may be obs
petermarshall
2016/11/10 12:19:20
Yeah it does violate the spec. I added a test case
|
| + JSObject* default_iterator = |
| + isolate->native_context()->initial_array_iterator(); |
| + |
| + if (*iterator_func == default_iterator) { |
| + return *spread; |
| + } |
| + } |
| + } |
| + } |
| + |
| + Handle<JSFunction> spread_iterable_function = isolate->spread_iterable(); |
| + |
| + Handle<Object> spreaded; |
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| + isolate, spreaded, |
| + Execution::Call(isolate, spread_iterable_function, |
| + isolate->factory()->undefined_value(), 1, &spread)); |
| + |
| + return *spreaded; |
| +} |
| + |
| +} // namespace internal |
| +} // namespace v8 |