Chromium Code Reviews| Index: src/interpreter/bytecode-generator.cc |
| diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc |
| index 22972537abcbccb0e72a702ba07e9e4eb12a011a..b658460b058144339965e16df19eb6f36ca0722f 100644 |
| --- a/src/interpreter/bytecode-generator.cc |
| +++ b/src/interpreter/bytecode-generator.cc |
| @@ -851,7 +851,6 @@ void BytecodeGenerator::VisitForInAssignment(Expression* expr, |
| void BytecodeGenerator::VisitForInStatement(ForInStatement* stmt) { |
| EffectResultScope statement_result_scope(this); |
| - |
| if (stmt->subject()->IsNullLiteral() || |
| stmt->subject()->IsUndefinedLiteral(isolate())) { |
| // ForIn generates lots of code, skip if it wouldn't produce any effects. |
| @@ -870,29 +869,26 @@ void BytecodeGenerator::VisitForInStatement(ForInStatement* stmt) { |
| builder()->CastAccumulatorToJSObject(); |
| builder()->StoreAccumulatorInRegister(receiver); |
| builder()->CallRuntime(Runtime::kGetPropertyNamesFast, receiver, 1); |
| - builder()->ForInPrepare(receiver); |
| + Register cache_type = execution_result()->NewRegister(); |
| + Register cache_array = execution_result()->NewRegister(); |
| + Register cache_length = execution_result()->NewRegister(); |
| + builder()->ForInPrepare(receiver, cache_type, cache_array, cache_length); |
| loop_builder.BreakIfUndefined(); |
|
Benedikt Meurer
2015/12/16 20:00:14
This looks wrong/unnecessary (now). As far as I ca
|
| - Register for_in_state = execution_result()->NewRegister(); |
| - builder()->StoreAccumulatorInRegister(for_in_state); |
| - |
| // Check loop termination (accumulator holds index). |
| - Register index = receiver; // Re-using register as receiver no longer used. |
| + Register index = execution_result()->NewRegister(); |
| builder()->LoadLiteral(Smi::FromInt(0)); |
| + builder()->StoreAccumulatorInRegister(index); |
| loop_builder.LoopHeader(); |
| loop_builder.Condition(); |
| - builder()->StoreAccumulatorInRegister(index).ForInDone(for_in_state); |
| + builder()->ForInDone(index, cache_length); |
| loop_builder.BreakIfTrue(); |
| - builder()->ForInNext(for_in_state, index); |
| + builder()->ForInNext(receiver, cache_type, cache_array, index); |
| loop_builder.ContinueIfUndefined(); |
| - |
| VisitForInAssignment(stmt->each(), stmt->EachFeedbackSlot()); |
| Visit(stmt->body()); |
| - |
| - // TODO(oth): replace CountOperation here with ForInStep. |
| loop_builder.Next(); |
| - builder()->LoadAccumulatorWithRegister(index).CountOperation( |
| - Token::Value::ADD, language_mode_strength()); |
| + builder()->ForInStep(index); |
| loop_builder.JumpToHeader(); |
| loop_builder.LoopEnd(); |
| } |