Index: src/compiler/ast-graph-builder.h |
diff --git a/src/compiler/ast-graph-builder.h b/src/compiler/ast-graph-builder.h |
index 861bd5baa36e8320be889c47e1135e32c6b9f23e..3f3872d25ea767920a37f1616488a1ab87794b29 100644 |
--- a/src/compiler/ast-graph-builder.h |
+++ b/src/compiler/ast-graph-builder.h |
@@ -171,8 +171,18 @@ class AstGraphBuilder : public StructuredGraphBuilder, public AstVisitor { |
// Dispatched from VisitForInStatement. |
void VisitForInAssignment(Expression* expr, Node* value); |
- void BuildLazyBailout(Node* node, BailoutId ast_id); |
- void BuildLazyBailoutWithPushedNode(Node* node, BailoutId ast_id); |
+ // Flag that describes how to combine the current environment with |
+ // the output of a node to obtain a framestate for lazy bailout. |
+ enum OutputFrameStateCombine { |
+ PUSH_OUTPUT, // Push the output on the expression stack. |
+ IGNORE_OUTPUT // Use the frame state as-is. |
+ }; |
+ |
+ // Builds deoptimization for a given node. |
+ void PrepareFrameState(Node* node, BailoutId ast_id, |
+ OutputFrameStateCombine combine = IGNORE_OUTPUT); |
+ |
+ OutputFrameStateCombine StateCombineFromAstContext(); |
DEFINE_AST_VISITOR_SUBCLASS_MEMBERS(); |
DISALLOW_COPY_AND_ASSIGN(AstGraphBuilder); |
@@ -206,11 +216,9 @@ class AstGraphBuilder::Environment |
DCHECK(variable->IsStackAllocated()); |
if (variable->IsParameter()) { |
values()->at(variable->index() + 1) = node; |
- parameters_dirty_ = true; |
} else { |
DCHECK(variable->IsStackLocal()); |
values()->at(variable->index() + parameters_count_) = node; |
- locals_dirty_ = true; |
} |
} |
Node* Lookup(Variable* variable) { |
@@ -226,7 +234,6 @@ class AstGraphBuilder::Environment |
// Operations on the operand stack. |
void Push(Node* node) { |
values()->push_back(node); |
- stack_dirty_ = true; |
} |
Node* Top() { |
DCHECK(stack_height() > 0); |
@@ -236,7 +243,6 @@ class AstGraphBuilder::Environment |
DCHECK(stack_height() > 0); |
Node* back = values()->back(); |
values()->pop_back(); |
- stack_dirty_ = true; |
return back; |
} |
@@ -245,7 +251,6 @@ class AstGraphBuilder::Environment |
DCHECK(depth >= 0 && depth < stack_height()); |
int index = static_cast<int>(values()->size()) - depth - 1; |
values()->at(index) = node; |
- stack_dirty_ = true; |
} |
Node* Peek(int depth) { |
DCHECK(depth >= 0 && depth < stack_height()); |
@@ -255,7 +260,6 @@ class AstGraphBuilder::Environment |
void Drop(int depth) { |
DCHECK(depth >= 0 && depth <= stack_height()); |
values()->erase(values()->end() - depth, values()->end()); |
- stack_dirty_ = true; |
} |
// Preserve a checkpoint of the environment for the IR graph. Any |
@@ -263,14 +267,13 @@ class AstGraphBuilder::Environment |
Node* Checkpoint(BailoutId ast_id); |
private: |
+ void UpdateStateValues(Node** state_values, int offset, int count); |
+ |
int parameters_count_; |
int locals_count_; |
Node* parameters_node_; |
Node* locals_node_; |
Node* stack_node_; |
- bool parameters_dirty_; |
- bool locals_dirty_; |
- bool stack_dirty_; |
}; |
@@ -282,10 +285,15 @@ class AstGraphBuilder::AstContext BASE_EMBEDDED { |
bool IsValue() const { return kind_ == Expression::kValue; } |
bool IsTest() const { return kind_ == Expression::kTest; } |
+ // Determines how to combine the frame state with the value |
+ // that is about to be plugged into this AstContext. |
+ AstGraphBuilder::OutputFrameStateCombine GetStateCombine() { |
+ return IsEffect() ? IGNORE_OUTPUT : PUSH_OUTPUT; |
+ } |
+ |
// Plug a node into this expression context. Call this function in tail |
// position in the Visit functions for expressions. |
virtual void ProduceValue(Node* value) = 0; |
- virtual void ProduceValueWithLazyBailout(Node* value) = 0; |
// Unplugs a node from this expression context. Call this to retrieve the |
// result of another Visit function that already plugged the context. |
@@ -295,8 +303,7 @@ class AstGraphBuilder::AstContext BASE_EMBEDDED { |
void ReplaceValue() { ProduceValue(ConsumeValue()); } |
protected: |
- AstContext(AstGraphBuilder* owner, Expression::Context kind, |
- BailoutId bailout_id); |
+ AstContext(AstGraphBuilder* owner, Expression::Context kind); |
virtual ~AstContext(); |
AstGraphBuilder* owner() const { return owner_; } |
@@ -308,8 +315,6 @@ class AstGraphBuilder::AstContext BASE_EMBEDDED { |
int original_height_; |
#endif |
- BailoutId bailout_id_; |
- |
private: |
Expression::Context kind_; |
AstGraphBuilder* owner_; |
@@ -320,11 +325,10 @@ class AstGraphBuilder::AstContext BASE_EMBEDDED { |
// Context to evaluate expression for its side effects only. |
class AstGraphBuilder::AstEffectContext V8_FINAL : public AstContext { |
public: |
- explicit AstEffectContext(AstGraphBuilder* owner, BailoutId bailout_id) |
- : AstContext(owner, Expression::kEffect, bailout_id) {} |
+ explicit AstEffectContext(AstGraphBuilder* owner) |
+ : AstContext(owner, Expression::kEffect) {} |
virtual ~AstEffectContext(); |
virtual void ProduceValue(Node* value) V8_OVERRIDE; |
- virtual void ProduceValueWithLazyBailout(Node* value) V8_OVERRIDE; |
virtual Node* ConsumeValue() V8_OVERRIDE; |
}; |
@@ -332,11 +336,10 @@ class AstGraphBuilder::AstEffectContext V8_FINAL : public AstContext { |
// Context to evaluate expression for its value (and side effects). |
class AstGraphBuilder::AstValueContext V8_FINAL : public AstContext { |
public: |
- explicit AstValueContext(AstGraphBuilder* owner, BailoutId bailout_id) |
- : AstContext(owner, Expression::kValue, bailout_id) {} |
+ explicit AstValueContext(AstGraphBuilder* owner) |
+ : AstContext(owner, Expression::kValue) {} |
virtual ~AstValueContext(); |
virtual void ProduceValue(Node* value) V8_OVERRIDE; |
- virtual void ProduceValueWithLazyBailout(Node* value) V8_OVERRIDE; |
virtual Node* ConsumeValue() V8_OVERRIDE; |
}; |
@@ -344,11 +347,10 @@ class AstGraphBuilder::AstValueContext V8_FINAL : public AstContext { |
// Context to evaluate expression for a condition value (and side effects). |
class AstGraphBuilder::AstTestContext V8_FINAL : public AstContext { |
public: |
- explicit AstTestContext(AstGraphBuilder* owner, BailoutId bailout_id) |
- : AstContext(owner, Expression::kTest, bailout_id) {} |
+ explicit AstTestContext(AstGraphBuilder* owner) |
+ : AstContext(owner, Expression::kTest) {} |
virtual ~AstTestContext(); |
virtual void ProduceValue(Node* value) V8_OVERRIDE; |
- virtual void ProduceValueWithLazyBailout(Node* value) V8_OVERRIDE; |
virtual Node* ConsumeValue() V8_OVERRIDE; |
}; |