Index: src/compiler/control-builders.h |
diff --git a/src/compiler/control-builders.h b/src/compiler/control-builders.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9b604c126186026ee014ad0c6ab2ce541bc4797a |
--- /dev/null |
+++ b/src/compiler/control-builders.h |
@@ -0,0 +1,144 @@ |
+// Copyright 2013 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef V8_COMPILER_CONTROL_BUILDERS_H_ |
+#define V8_COMPILER_CONTROL_BUILDERS_H_ |
+ |
+#include "src/v8.h" |
+ |
+#include "src/compiler/graph-builder.h" |
+#include "src/compiler/node.h" |
+ |
+namespace v8 { |
+namespace internal { |
+namespace compiler { |
+ |
+ |
+// Base class for all control builders. Also provides a common interface for |
+// control builders to handle 'break' and 'continue' statements when they are |
+// used to model breakable statements. |
+class ControlBuilder { |
+ public: |
+ explicit ControlBuilder(StructuredGraphBuilder* builder) |
+ : builder_(builder) {} |
+ virtual ~ControlBuilder() {} |
+ |
+ // Interface for break and continue. |
+ virtual void Break() { UNREACHABLE(); } |
+ virtual void Continue() { UNREACHABLE(); } |
+ |
+ protected: |
+ typedef StructuredGraphBuilder Builder; |
+ typedef StructuredGraphBuilder::Environment Environment; |
+ |
+ Zone* zone() const { return builder_->zone(); } |
+ Environment* environment() { return builder_->environment_internal(); } |
+ void set_environment(Environment* env) { builder_->set_environment(env); } |
+ |
+ Builder* builder_; |
+}; |
+ |
+ |
+// Tracks control flow for a conditional statement. |
+class IfBuilder : public ControlBuilder { |
+ public: |
+ explicit IfBuilder(StructuredGraphBuilder* builder) |
+ : ControlBuilder(builder), |
+ then_environment_(NULL), |
+ else_environment_(NULL) {} |
+ |
+ // Primitive control commands. |
+ void If(Node* condition); |
+ void Then(); |
+ void Else(); |
+ void End(); |
+ |
+ private: |
+ Environment* then_environment_; // Environment after the 'then' body. |
+ Environment* else_environment_; // Environment for the 'else' body. |
+}; |
+ |
+ |
+// Tracks control flow for an iteration statement. |
+class LoopBuilder : public ControlBuilder { |
+ public: |
+ explicit LoopBuilder(StructuredGraphBuilder* builder) |
+ : ControlBuilder(builder), |
+ loop_environment_(NULL), |
+ continue_environment_(NULL), |
+ break_environment_(NULL) {} |
+ |
+ // Primitive control commands. |
+ void BeginLoop(); |
+ void EndBody(); |
+ void EndLoop(); |
+ |
+ // Primitive support for break and continue. |
+ virtual void Continue(); |
+ virtual void Break(); |
+ |
+ // Compound control command for conditional break. |
+ void BreakUnless(Node* condition); |
+ |
+ private: |
+ Environment* loop_environment_; // Environment of the loop header. |
+ Environment* continue_environment_; // Environment after the loop body. |
+ Environment* break_environment_; // Environment after the loop exits. |
+}; |
+ |
+ |
+// Tracks control flow for a switch statement. |
+class SwitchBuilder : public ControlBuilder { |
+ public: |
+ explicit SwitchBuilder(StructuredGraphBuilder* builder, int case_count) |
+ : ControlBuilder(builder), |
+ body_environment_(NULL), |
+ label_environment_(NULL), |
+ break_environment_(NULL), |
+ body_environments_(case_count, zone()) {} |
+ |
+ // Primitive control commands. |
+ void BeginSwitch(); |
+ void BeginLabel(int index, Node* condition); |
+ void EndLabel(); |
+ void DefaultAt(int index); |
+ void BeginCase(int index); |
+ void EndCase(); |
+ void EndSwitch(); |
+ |
+ // Primitive support for break. |
+ virtual void Break(); |
+ |
+ // The number of cases within a switch is statically known. |
+ int case_count() const { return body_environments_.capacity(); } |
+ |
+ private: |
+ Environment* body_environment_; // Environment after last case body. |
+ Environment* label_environment_; // Environment for next label condition. |
+ Environment* break_environment_; // Environment after the switch exits. |
+ ZoneList<Environment*> body_environments_; |
+}; |
+ |
+ |
+// Tracks control flow for a block statement. |
+class BlockBuilder : public ControlBuilder { |
+ public: |
+ explicit BlockBuilder(StructuredGraphBuilder* builder) |
+ : ControlBuilder(builder), break_environment_(NULL) {} |
+ |
+ // Primitive control commands. |
+ void BeginBlock(); |
+ void EndBlock(); |
+ |
+ // Primitive support for break. |
+ virtual void Break(); |
+ |
+ private: |
+ Environment* break_environment_; // Environment after the block exits. |
+}; |
+} |
+} |
+} // namespace v8::internal::compiler |
+ |
+#endif // V8_COMPILER_CONTROL_BUILDERS_H_ |