| Index: src/interpreter/bytecode-generator.cc
|
| diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc
|
| index 13351845de104a06bd8cf275beb2ea1631db2d70..9469fb58b8b657f7369dde57e3a5b06e070a5752 100644
|
| --- a/src/interpreter/bytecode-generator.cc
|
| +++ b/src/interpreter/bytecode-generator.cc
|
| @@ -583,6 +583,7 @@ BytecodeGenerator::BytecodeGenerator(CompilationInfo* info)
|
| generator_state_(),
|
| loop_depth_(0),
|
| home_object_symbol_(info->isolate()->factory()->home_object_symbol()),
|
| + iterator_symbol_(info->isolate()->factory()->iterator_symbol()),
|
| empty_fixed_array_(info->isolate()->factory()->empty_fixed_array()) {
|
| AstValueFactory* ast_value_factory = info->parse_info()->ast_value_factory();
|
| const AstRawString* prototype_string = ast_value_factory->prototype_string();
|
| @@ -2852,6 +2853,33 @@ void BytecodeGenerator::VisitEmptyParentheses(EmptyParentheses* expr) {
|
| UNREACHABLE();
|
| }
|
|
|
| +void BytecodeGenerator::VisitGetIterator(GetIterator* expr) {
|
| + FeedbackVectorSlot load_slot = expr->IteratorPropertyFeedbackSlot();
|
| + FeedbackVectorSlot call_slot = expr->IteratorCallFeedbackSlot();
|
| +
|
| + RegisterList args = register_allocator()->NewRegisterList(1);
|
| + Register method = register_allocator()->NewRegister();
|
| + Register obj = args[0];
|
| +
|
| + VisitForAccumulatorValue(expr->iterable());
|
| +
|
| + // Let method be GetMethod(obj, @@iterator).
|
| + builder()
|
| + ->StoreAccumulatorInRegister(obj)
|
| + .LoadNamedProperty(obj, iterator_symbol(), feedback_index(load_slot))
|
| + .StoreAccumulatorInRegister(method);
|
| +
|
| + // Let iterator be Call(method, obj).
|
| + builder()->Call(method, args, feedback_index(call_slot),
|
| + Call::NAMED_PROPERTY_CALL);
|
| +
|
| + // If Type(iterator) is not Object, throw a TypeError exception.
|
| + BytecodeLabel no_type_error;
|
| + builder()->JumpIfJSReceiver(&no_type_error);
|
| + builder()->CallRuntime(Runtime::kThrowSymbolIteratorInvalid);
|
| + builder()->Bind(&no_type_error);
|
| +}
|
| +
|
| void BytecodeGenerator::VisitThisFunction(ThisFunction* expr) {
|
| builder()->LoadAccumulatorWithRegister(Register::function_closure());
|
| }
|
|
|