Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/builtins/builtins-utils.h" | |
| 5 #include "src/builtins/builtins.h" | 6 #include "src/builtins/builtins.h" |
| 6 #include "src/builtins/builtins-utils.h" | 7 #include "src/frames-inl.h" |
| 7 | 8 |
| 8 namespace v8 { | 9 namespace v8 { |
| 9 namespace internal { | 10 namespace internal { |
| 10 | 11 |
| 11 void Builtins::Generate_IteratorPrototypeIterator( | 12 void Builtins::Generate_IteratorPrototypeIterator( |
| 12 CodeStubAssembler* assembler) { | 13 CodeStubAssembler* assembler) { |
| 13 assembler->Return(assembler->Parameter(0)); | 14 assembler->Return(assembler->Parameter(0)); |
| 14 } | 15 } |
| 15 | 16 |
| 17 BUILTIN(ModuleNamespaceIterator) { | |
| 18 HandleScope scope(isolate); | |
| 19 DCHECK_EQ(1, args.length()); | |
| 20 Handle<Object> receiver = args.at<Object>(0); | |
| 21 | |
| 22 if (!receiver->IsJSModuleNamespace()) { | |
| 23 THROW_NEW_ERROR_RETURN_FAILURE( | |
| 24 isolate, NewTypeError(MessageTemplate::kIncompatibleMethodReceiver, | |
| 25 isolate->factory()->iterator_symbol(), receiver)); | |
| 26 } | |
| 27 auto ns = Handle<JSModuleNamespace>::cast(receiver); | |
| 28 | |
| 29 Handle<FixedArray> names = | |
| 30 KeyAccumulator::GetKeys(ns, KeyCollectionMode::kOwnOnly, SKIP_SYMBOLS) | |
| 31 .ToHandleChecked(); | |
| 32 return *isolate->factory()->NewJSFixedArrayIterator(names); | |
| 33 } | |
| 34 | |
| 35 BUILTIN(FixedArrayIteratorNext) { | |
|
Benedikt Meurer
2016/10/12 03:24:05
Nice idea!
| |
| 36 HandleScope scope(isolate); | |
| 37 DCHECK_EQ(1, args.length()); | |
| 38 Handle<Object> receiver = args.at<Object>(0); | |
| 39 | |
| 40 // It is an error if this function is called on anything other than the | |
| 41 // particular iterator object for which the function was created. | |
| 42 bool error = !receiver->IsJSFixedArrayIterator(); | |
| 43 if (!error) { | |
| 44 StackFrameIterator it(isolate); | |
| 45 error = BuiltinExitFrame::cast(it.frame())->function() != | |
| 46 Handle<JSFixedArrayIterator>::cast(receiver)->next(); | |
| 47 } | |
|
neis
2016/10/11 18:36:17
This is awesome, isn't it? Is there any better wa
adamk
2016/10/11 19:42:53
This looks about right to me (this "next" function
Benedikt Meurer
2016/10/12 03:24:05
Adam is right, you need this.
But please don't go
neis
2016/10/13 07:37:21
Thanks for pointing me to args.target(), that's ex
| |
| 48 if (error) { | |
| 49 THROW_NEW_ERROR_RETURN_FAILURE( | |
| 50 isolate, NewTypeError(MessageTemplate::kIncompatibleMethodReceiver, | |
| 51 isolate->factory()->next_string(), receiver)); | |
| 52 } | |
| 53 | |
| 54 auto iterator = Handle<JSFixedArrayIterator>::cast(receiver); | |
| 55 Handle<Object> value; | |
| 56 bool done; | |
| 57 | |
| 58 int index = iterator->index(); | |
| 59 if (index < iterator->array()->length()) { | |
| 60 value = handle(iterator->array()->get(index), isolate); | |
| 61 done = false; | |
| 62 iterator->set_index(index + 1); | |
| 63 } else { | |
| 64 value = isolate->factory()->undefined_value(); | |
| 65 done = true; | |
| 66 } | |
| 67 | |
| 68 return *isolate->factory()->NewJSIteratorResult(value, done); | |
| 69 } | |
| 70 | |
| 16 } // namespace internal | 71 } // namespace internal |
| 17 } // namespace v8 | 72 } // namespace v8 |
| OLD | NEW |