OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 #ifndef V8_FULL_CODEGEN_H_ | 5 #ifndef V8_FULL_CODEGEN_H_ |
6 #define V8_FULL_CODEGEN_H_ | 6 #define V8_FULL_CODEGEN_H_ |
7 | 7 |
8 #include "src/v8.h" | 8 #include "src/v8.h" |
9 | 9 |
10 #include "src/allocation.h" | 10 #include "src/allocation.h" |
11 #include "src/assert-scope.h" | 11 #include "src/assert-scope.h" |
12 #include "src/ast.h" | 12 #include "src/ast.h" |
13 #include "src/bit-vector.h" | 13 #include "src/bit-vector.h" |
14 #include "src/code-stubs.h" | 14 #include "src/code-stubs.h" |
15 #include "src/codegen.h" | 15 #include "src/codegen.h" |
16 #include "src/compiler.h" | 16 #include "src/compiler.h" |
17 #include "src/globals.h" | 17 #include "src/globals.h" |
18 #include "src/objects.h" | 18 #include "src/objects.h" |
| 19 #include "src/scopes.h" |
19 | 20 |
20 namespace v8 { | 21 namespace v8 { |
21 namespace internal { | 22 namespace internal { |
22 | 23 |
23 // Forward declarations. | 24 // Forward declarations. |
24 class JumpPatchSite; | 25 class JumpPatchSite; |
25 | 26 |
26 // AST node visitor which can tell whether a given statement will be breakable | 27 // AST node visitor which can tell whether a given statement will be breakable |
27 // when the code is compiled by the full compiler in the debugger. This means | 28 // when the code is compiled by the full compiler in the debugger. This means |
28 // that there will be an IC (load/store/call) in the code generated for the | 29 // that there will be an IC (load/store/call) in the code generated for the |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 | 214 |
214 // A nested block statement. | 215 // A nested block statement. |
215 class NestedBlock : public Breakable { | 216 class NestedBlock : public Breakable { |
216 public: | 217 public: |
217 NestedBlock(FullCodeGenerator* codegen, Block* block) | 218 NestedBlock(FullCodeGenerator* codegen, Block* block) |
218 : Breakable(codegen, block) { | 219 : Breakable(codegen, block) { |
219 } | 220 } |
220 virtual ~NestedBlock() {} | 221 virtual ~NestedBlock() {} |
221 | 222 |
222 virtual NestedStatement* Exit(int* stack_depth, int* context_length) { | 223 virtual NestedStatement* Exit(int* stack_depth, int* context_length) { |
223 if (statement()->AsBlock()->scope() != NULL) { | 224 auto block_scope = statement()->AsBlock()->scope(); |
224 ++(*context_length); | 225 if (block_scope != nullptr) { |
| 226 if (block_scope->ContextLocalCount() > 0) ++(*context_length); |
225 } | 227 } |
226 return previous_; | 228 return previous_; |
227 } | 229 } |
228 }; | 230 }; |
229 | 231 |
230 // The try block of a try/catch statement. | 232 // The try block of a try/catch statement. |
231 class TryCatch : public NestedStatement { | 233 class TryCatch : public NestedStatement { |
232 public: | 234 public: |
233 static const int kElementCount = TryBlockConstant::kElementCount; | 235 static const int kElementCount = TryBlockConstant::kElementCount; |
234 | 236 |
(...skipping 726 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
961 public: | 963 public: |
962 EnterBlockScopeIfNeeded(FullCodeGenerator* codegen, Scope* scope, | 964 EnterBlockScopeIfNeeded(FullCodeGenerator* codegen, Scope* scope, |
963 BailoutId entry_id, BailoutId declarations_id, | 965 BailoutId entry_id, BailoutId declarations_id, |
964 BailoutId exit_id); | 966 BailoutId exit_id); |
965 ~EnterBlockScopeIfNeeded(); | 967 ~EnterBlockScopeIfNeeded(); |
966 | 968 |
967 private: | 969 private: |
968 MacroAssembler* masm() const { return codegen_->masm(); } | 970 MacroAssembler* masm() const { return codegen_->masm(); } |
969 | 971 |
970 FullCodeGenerator* codegen_; | 972 FullCodeGenerator* codegen_; |
971 Scope* scope_; | |
972 Scope* saved_scope_; | 973 Scope* saved_scope_; |
973 BailoutId exit_id_; | 974 BailoutId exit_id_; |
| 975 bool needs_block_context_; |
974 }; | 976 }; |
975 | 977 |
976 MacroAssembler* masm_; | 978 MacroAssembler* masm_; |
977 CompilationInfo* info_; | 979 CompilationInfo* info_; |
978 Scope* scope_; | 980 Scope* scope_; |
979 Label return_label_; | 981 Label return_label_; |
980 NestedStatement* nesting_stack_; | 982 NestedStatement* nesting_stack_; |
981 int loop_depth_; | 983 int loop_depth_; |
982 ZoneList<Handle<Object> >* globals_; | 984 ZoneList<Handle<Object> >* globals_; |
983 Handle<FixedArray> modules_; | 985 Handle<FixedArray> modules_; |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1098 | 1100 |
1099 Address start_; | 1101 Address start_; |
1100 Address instruction_start_; | 1102 Address instruction_start_; |
1101 uint32_t length_; | 1103 uint32_t length_; |
1102 }; | 1104 }; |
1103 | 1105 |
1104 | 1106 |
1105 } } // namespace v8::internal | 1107 } } // namespace v8::internal |
1106 | 1108 |
1107 #endif // V8_FULL_CODEGEN_H_ | 1109 #endif // V8_FULL_CODEGEN_H_ |
OLD | NEW |