OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/interpreter/bytecode-generator.h" | 5 #include "src/interpreter/bytecode-generator.h" |
6 | 6 |
7 #include "src/ast/compile-time-value.h" | 7 #include "src/ast/compile-time-value.h" |
8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/compilation-info.h" | 10 #include "src/compilation-info.h" |
(...skipping 1075 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1086 | 1086 |
1087 void BytecodeGenerator::VisitReturnStatement(ReturnStatement* stmt) { | 1087 void BytecodeGenerator::VisitReturnStatement(ReturnStatement* stmt) { |
1088 builder()->SetStatementPosition(stmt); | 1088 builder()->SetStatementPosition(stmt); |
1089 VisitForAccumulatorValue(stmt->expression()); | 1089 VisitForAccumulatorValue(stmt->expression()); |
1090 execution_control()->ReturnAccumulator(); | 1090 execution_control()->ReturnAccumulator(); |
1091 } | 1091 } |
1092 | 1092 |
1093 void BytecodeGenerator::VisitWithStatement(WithStatement* stmt) { | 1093 void BytecodeGenerator::VisitWithStatement(WithStatement* stmt) { |
1094 builder()->SetStatementPosition(stmt); | 1094 builder()->SetStatementPosition(stmt); |
1095 VisitForAccumulatorValue(stmt->expression()); | 1095 VisitForAccumulatorValue(stmt->expression()); |
1096 VisitNewLocalWithContext(); | 1096 VisitNewLocalWithContext(stmt->scope()); |
1097 VisitInScope(stmt->statement(), stmt->scope()); | 1097 VisitInScope(stmt->statement(), stmt->scope()); |
1098 } | 1098 } |
1099 | 1099 |
1100 void BytecodeGenerator::VisitSwitchStatement(SwitchStatement* stmt) { | 1100 void BytecodeGenerator::VisitSwitchStatement(SwitchStatement* stmt) { |
1101 // We need this scope because we visit for register values. We have to | 1101 // We need this scope because we visit for register values. We have to |
1102 // maintain a execution result scope where registers can be allocated. | 1102 // maintain a execution result scope where registers can be allocated. |
1103 ZoneList<CaseClause*>* clauses = stmt->cases(); | 1103 ZoneList<CaseClause*>* clauses = stmt->cases(); |
1104 SwitchBuilder switch_builder(builder(), clauses->length()); | 1104 SwitchBuilder switch_builder(builder(), clauses->length()); |
1105 ControlScopeForBreakable scope(this, stmt, &switch_builder); | 1105 ControlScopeForBreakable scope(this, stmt, &switch_builder); |
1106 int default_index = -1; | 1106 int default_index = -1; |
(...skipping 2085 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3192 | 3192 |
3193 void BytecodeGenerator::VisitNewLocalBlockContext(Scope* scope) { | 3193 void BytecodeGenerator::VisitNewLocalBlockContext(Scope* scope) { |
3194 AccumulatorResultScope accumulator_execution_result(this); | 3194 AccumulatorResultScope accumulator_execution_result(this); |
3195 DCHECK(scope->is_block_scope()); | 3195 DCHECK(scope->is_block_scope()); |
3196 | 3196 |
3197 VisitFunctionClosureForContext(); | 3197 VisitFunctionClosureForContext(); |
3198 builder()->CreateBlockContext(scope->scope_info()); | 3198 builder()->CreateBlockContext(scope->scope_info()); |
3199 execution_result()->SetResultInAccumulator(); | 3199 execution_result()->SetResultInAccumulator(); |
3200 } | 3200 } |
3201 | 3201 |
3202 void BytecodeGenerator::VisitNewLocalWithContext() { | 3202 void BytecodeGenerator::VisitNewLocalWithContext(Scope* scope) { |
3203 AccumulatorResultScope accumulator_execution_result(this); | 3203 AccumulatorResultScope accumulator_execution_result(this); |
3204 | 3204 |
3205 Register extension_object = register_allocator()->NewRegister(); | 3205 Register extension_object = register_allocator()->NewRegister(); |
3206 | 3206 |
3207 builder()->ConvertAccumulatorToObject(extension_object); | 3207 builder()->ConvertAccumulatorToObject(extension_object); |
3208 VisitFunctionClosureForContext(); | 3208 VisitFunctionClosureForContext(); |
3209 builder()->CreateWithContext(extension_object); | 3209 builder()->CreateWithContext(extension_object, scope->scope_info()); |
3210 execution_result()->SetResultInAccumulator(); | 3210 execution_result()->SetResultInAccumulator(); |
3211 } | 3211 } |
3212 | 3212 |
3213 void BytecodeGenerator::VisitNewLocalCatchContext(Variable* variable, | 3213 void BytecodeGenerator::VisitNewLocalCatchContext(Variable* variable, |
3214 Scope* scope) { | 3214 Scope* scope) { |
3215 AccumulatorResultScope accumulator_execution_result(this); | 3215 AccumulatorResultScope accumulator_execution_result(this); |
3216 DCHECK(variable->IsContextSlot()); | 3216 DCHECK(variable->IsContextSlot()); |
3217 | 3217 |
3218 Register exception = register_allocator()->NewRegister(); | 3218 Register exception = register_allocator()->NewRegister(); |
3219 builder()->StoreAccumulatorInRegister(exception); | 3219 builder()->StoreAccumulatorInRegister(exception); |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3394 return execution_context()->scope()->language_mode(); | 3394 return execution_context()->scope()->language_mode(); |
3395 } | 3395 } |
3396 | 3396 |
3397 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { | 3397 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { |
3398 return TypeFeedbackVector::GetIndex(slot); | 3398 return TypeFeedbackVector::GetIndex(slot); |
3399 } | 3399 } |
3400 | 3400 |
3401 } // namespace interpreter | 3401 } // namespace interpreter |
3402 } // namespace internal | 3402 } // namespace internal |
3403 } // namespace v8 | 3403 } // namespace v8 |
OLD | NEW |