Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: src/compiler/ast-graph-builder.h

Issue 873423004: First stab at try-catch and try-finally in TurboFan. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressed moarer comments by Ben Titzer. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/compiler/ast-graph-builder.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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_COMPILER_AST_GRAPH_BUILDER_H_ 5 #ifndef V8_COMPILER_AST_GRAPH_BUILDER_H_
6 #define V8_COMPILER_AST_GRAPH_BUILDER_H_ 6 #define V8_COMPILER_AST_GRAPH_BUILDER_H_
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/ast.h" 10 #include "src/ast.h"
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 // Get the node that represents the outer function context. 56 // Get the node that represents the outer function context.
57 Node* GetFunctionContext(); 57 Node* GetFunctionContext();
58 // Get the node that represents the outer function closure. 58 // Get the node that represents the outer function closure.
59 Node* GetFunctionClosure(); 59 Node* GetFunctionClosure();
60 60
61 private: 61 private:
62 class AstContext; 62 class AstContext;
63 class AstEffectContext; 63 class AstEffectContext;
64 class AstValueContext; 64 class AstValueContext;
65 class AstTestContext; 65 class AstTestContext;
66 class BreakableScope;
67 class ContextScope; 66 class ContextScope;
67 class ControlScope;
68 class ControlScopeForBreakable;
69 class ControlScopeForIteration;
70 class ControlScopeForCatch;
71 class ControlScopeForFinally;
68 class Environment; 72 class Environment;
69 friend class ControlBuilder; 73 friend class ControlBuilder;
70 74
71 Zone* local_zone_; 75 Zone* local_zone_;
72 CompilationInfo* info_; 76 CompilationInfo* info_;
73 JSGraph* jsgraph_; 77 JSGraph* jsgraph_;
74 Environment* environment_; 78 Environment* environment_;
75 AstContext* ast_context_; 79 AstContext* ast_context_;
76 80
77 // List of global declarations for functions and variables. 81 // List of global declarations for functions and variables.
78 ZoneVector<Handle<Object>> globals_; 82 ZoneVector<Handle<Object>> globals_;
79 83
80 // Stack of breakable statements entered by the visitor. 84 // Stack of control scopes currently entered by the visitor.
81 BreakableScope* breakable_; 85 ControlScope* execution_control_;
82 86
83 // Stack of context objects pushed onto the chain by the visitor. 87 // Stack of context objects pushed onto the chain by the visitor.
84 ContextScope* execution_context_; 88 ContextScope* execution_context_;
85 89
86 // Nodes representing values in the activation record. 90 // Nodes representing values in the activation record.
87 SetOncePointer<Node> function_closure_; 91 SetOncePointer<Node> function_closure_;
88 SetOncePointer<Node> function_context_; 92 SetOncePointer<Node> function_context_;
89 93
90 // Temporary storage for building node input lists. 94 // Temporary storage for building node input lists.
91 int input_buffer_size_; 95 int input_buffer_size_;
(...skipping 11 matching lines...) Expand all
103 // Result of loop assignment analysis performed before graph creation. 107 // Result of loop assignment analysis performed before graph creation.
104 LoopAssignmentAnalysis* loop_assignment_analysis_; 108 LoopAssignmentAnalysis* loop_assignment_analysis_;
105 109
106 // Growth increment for the temporary buffer used to construct input lists to 110 // Growth increment for the temporary buffer used to construct input lists to
107 // new nodes. 111 // new nodes.
108 static const int kInputBufferSizeIncrement = 64; 112 static const int kInputBufferSizeIncrement = 64;
109 113
110 Zone* local_zone() const { return local_zone_; } 114 Zone* local_zone() const { return local_zone_; }
111 Environment* environment() { return environment_; } 115 Environment* environment() { return environment_; }
112 AstContext* ast_context() const { return ast_context_; } 116 AstContext* ast_context() const { return ast_context_; }
113 BreakableScope* breakable() const { return breakable_; } 117 ControlScope* execution_control() const { return execution_control_; }
114 ContextScope* execution_context() const { return execution_context_; } 118 ContextScope* execution_context() const { return execution_context_; }
115 CommonOperatorBuilder* common() const { return jsgraph_->common(); } 119 CommonOperatorBuilder* common() const { return jsgraph_->common(); }
116 CompilationInfo* info() const { return info_; } 120 CompilationInfo* info() const { return info_; }
117 StrictMode strict_mode() const; 121 StrictMode strict_mode() const;
118 JSGraph* jsgraph() { return jsgraph_; } 122 JSGraph* jsgraph() { return jsgraph_; }
119 Graph* graph() { return jsgraph_->graph(); } 123 Graph* graph() { return jsgraph_->graph(); }
120 Zone* graph_zone() { return graph()->zone(); } 124 Zone* graph_zone() { return graph()->zone(); }
121 JSOperatorBuilder* javascript() { return jsgraph_->javascript(); } 125 JSOperatorBuilder* javascript() { return jsgraph_->javascript(); }
122 ZoneVector<Handle<Object>>* globals() { return &globals_; } 126 ZoneVector<Handle<Object>>* globals() { return &globals_; }
123 inline Scope* current_scope() const; 127 inline Scope* current_scope() const;
124 Node* current_context() const { return current_context_; } 128 Node* current_context() const { return current_context_; }
125 Node* dead_control(); 129 Node* dead_control();
126 Node* exit_control() const { return exit_control_; } 130 Node* exit_control() const { return exit_control_; }
127 131
128 void set_ast_context(AstContext* ctx) { ast_context_ = ctx; } 132 void set_ast_context(AstContext* ctx) { ast_context_ = ctx; }
129 void set_breakable(BreakableScope* brk) { breakable_ = brk; } 133 void set_execution_control(ControlScope* ctrl) { execution_control_ = ctrl; }
130 void set_execution_context(ContextScope* ctx) { execution_context_ = ctx; } 134 void set_execution_context(ContextScope* ctx) { execution_context_ = ctx; }
131 void set_exit_control(Node* exit) { exit_control_ = exit; } 135 void set_exit_control(Node* exit) { exit_control_ = exit; }
132 void set_current_context(Node* ctx) { current_context_ = ctx; } 136 void set_current_context(Node* ctx) { current_context_ = ctx; }
133 void set_environment(Environment* env) { environment_ = env; } 137 void set_environment(Environment* env) { environment_ = env; }
134 138
135 // Node creation helpers. 139 // Node creation helpers.
136 Node* NewNode(const Operator* op, bool incomplete = false) { 140 Node* NewNode(const Operator* op, bool incomplete = false) {
137 return MakeNode(op, 0, static_cast<Node**>(NULL), incomplete); 141 return MakeNode(op, 0, static_cast<Node**>(NULL), incomplete);
138 } 142 }
139 143
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 234
231 // Builders for error reporting at runtime. 235 // Builders for error reporting at runtime.
232 Node* BuildThrowReferenceError(Variable* var, BailoutId bailout_id); 236 Node* BuildThrowReferenceError(Variable* var, BailoutId bailout_id);
233 Node* BuildThrowConstAssignError(BailoutId bailout_id); 237 Node* BuildThrowConstAssignError(BailoutId bailout_id);
234 238
235 // Builders for dynamic hole-checks at runtime. 239 // Builders for dynamic hole-checks at runtime.
236 Node* BuildHoleCheckSilent(Node* value, Node* for_hole, Node* not_hole); 240 Node* BuildHoleCheckSilent(Node* value, Node* for_hole, Node* not_hole);
237 Node* BuildHoleCheckThrow(Node* value, Variable* var, Node* not_hole, 241 Node* BuildHoleCheckThrow(Node* value, Variable* var, Node* not_hole,
238 BailoutId bailout_id); 242 BailoutId bailout_id);
239 243
244 // Builders for non-local control flow.
245 Node* BuildReturn(Node* return_value);
246 Node* BuildThrow(Node* exception_value);
247
240 // Builders for binary operations. 248 // Builders for binary operations.
241 Node* BuildBinaryOp(Node* left, Node* right, Token::Value op); 249 Node* BuildBinaryOp(Node* left, Node* right, Token::Value op);
242 250
243 // Builder for stack-check guards. 251 // Builder for stack-check guards.
244 Node* BuildStackCheck(); 252 Node* BuildStackCheck();
245 253
246 // Check if the given statement is an OSR entry. 254 // Check if the given statement is an OSR entry.
247 // If so, record the stack height into the compilation and return {true}. 255 // If so, record the stack height into the compilation and return {true}.
248 bool CheckOsrEntry(IterationStatement* stmt); 256 bool CheckOsrEntry(IterationStatement* stmt);
249 257
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 class AstGraphBuilder::AstTestContext FINAL : public AstContext { 530 class AstGraphBuilder::AstTestContext FINAL : public AstContext {
523 public: 531 public:
524 explicit AstTestContext(AstGraphBuilder* owner) 532 explicit AstTestContext(AstGraphBuilder* owner)
525 : AstContext(owner, Expression::kTest) {} 533 : AstContext(owner, Expression::kTest) {}
526 ~AstTestContext() FINAL; 534 ~AstTestContext() FINAL;
527 void ProduceValue(Node* value) FINAL; 535 void ProduceValue(Node* value) FINAL;
528 Node* ConsumeValue() FINAL; 536 Node* ConsumeValue() FINAL;
529 }; 537 };
530 538
531 539
532 // Scoped class tracking breakable statements entered by the visitor. Allows to
533 // properly 'break' and 'continue' iteration statements as well as to 'break'
534 // from blocks within switch statements.
535 class AstGraphBuilder::BreakableScope BASE_EMBEDDED {
536 public:
537 BreakableScope(AstGraphBuilder* owner, BreakableStatement* target,
538 ControlBuilder* control, int drop_extra)
539 : owner_(owner),
540 target_(target),
541 next_(owner->breakable()),
542 control_(control),
543 drop_extra_(drop_extra) {
544 owner_->set_breakable(this); // Push.
545 }
546
547 ~BreakableScope() {
548 owner_->set_breakable(next_); // Pop.
549 }
550
551 // Either 'break' or 'continue' the target statement.
552 void BreakTarget(BreakableStatement* target);
553 void ContinueTarget(BreakableStatement* target);
554
555 private:
556 AstGraphBuilder* owner_;
557 BreakableStatement* target_;
558 BreakableScope* next_;
559 ControlBuilder* control_;
560 int drop_extra_;
561
562 // Find the correct scope for the target statement. Note that this also drops
563 // extra operands from the environment for each scope skipped along the way.
564 BreakableScope* FindBreakable(BreakableStatement* target);
565 };
566
567
568 // Scoped class tracking context objects created by the visitor. Represents 540 // Scoped class tracking context objects created by the visitor. Represents
569 // mutations of the context chain within the function body and allows to 541 // mutations of the context chain within the function body and allows to
570 // change the current {scope} and {context} during visitation. 542 // change the current {scope} and {context} during visitation.
571 class AstGraphBuilder::ContextScope BASE_EMBEDDED { 543 class AstGraphBuilder::ContextScope BASE_EMBEDDED {
572 public: 544 public:
573 ContextScope(AstGraphBuilder* owner, Scope* scope, Node* context) 545 ContextScope(AstGraphBuilder* owner, Scope* scope, Node* context)
574 : owner_(owner), 546 : owner_(owner),
575 next_(owner->execution_context()), 547 next_(owner->execution_context()),
576 outer_(owner->current_context()), 548 outer_(owner->current_context()),
577 scope_(scope) { 549 scope_(scope) {
(...skipping 18 matching lines...) Expand all
596 568
597 Scope* AstGraphBuilder::current_scope() const { 569 Scope* AstGraphBuilder::current_scope() const {
598 return execution_context_->scope(); 570 return execution_context_->scope();
599 } 571 }
600 572
601 } // namespace compiler 573 } // namespace compiler
602 } // namespace internal 574 } // namespace internal
603 } // namespace v8 575 } // namespace v8
604 576
605 #endif // V8_COMPILER_AST_GRAPH_BUILDER_H_ 577 #endif // V8_COMPILER_AST_GRAPH_BUILDER_H_
OLDNEW
« no previous file with comments | « no previous file | src/compiler/ast-graph-builder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698