Index: src/compiler/ast-graph-builder.cc |
diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc |
index 06abeac20cd2777684202a3c184277b006473677..c0036dfde5b391d2a5e8cf593c661fa2b94c27ba 100644 |
--- a/src/compiler/ast-graph-builder.cc |
+++ b/src/compiler/ast-graph-builder.cc |
@@ -356,14 +356,17 @@ class AstGraphBuilder::ControlScopeForIteration : public ControlScope { |
// Control scope implementation for a TryCatchStatement. |
class AstGraphBuilder::ControlScopeForCatch : public ControlScope { |
public: |
- ControlScopeForCatch(AstGraphBuilder* owner, TryCatchBuilder* control) |
- : ControlScope(owner), control_(control) { |
+ ControlScopeForCatch(AstGraphBuilder* owner, TryCatchStatement* stmt, |
+ TryCatchBuilder* control) |
+ : ControlScope(owner), |
+ control_(control), |
+ outer_prediction_(owner->try_catch_prediction_) { |
builder()->try_nesting_level_++; // Increment nesting. |
- builder()->try_catch_nesting_level_++; |
+ builder()->try_catch_prediction_ = stmt->catch_predicted(); |
} |
~ControlScopeForCatch() { |
builder()->try_nesting_level_--; // Decrement nesting. |
- builder()->try_catch_nesting_level_--; |
+ builder()->try_catch_prediction_ = outer_prediction_; |
} |
protected: |
@@ -382,19 +385,25 @@ class AstGraphBuilder::ControlScopeForCatch : public ControlScope { |
private: |
TryCatchBuilder* control_; |
+ bool outer_prediction_; |
}; |
// Control scope implementation for a TryFinallyStatement. |
class AstGraphBuilder::ControlScopeForFinally : public ControlScope { |
public: |
- ControlScopeForFinally(AstGraphBuilder* owner, DeferredCommands* commands, |
- TryFinallyBuilder* control) |
- : ControlScope(owner), commands_(commands), control_(control) { |
+ ControlScopeForFinally(AstGraphBuilder* owner, TryFinallyStatement* stmt, |
+ DeferredCommands* commands, TryFinallyBuilder* control) |
+ : ControlScope(owner), |
+ commands_(commands), |
+ control_(control), |
+ outer_prediction_(owner->try_catch_prediction_) { |
builder()->try_nesting_level_++; // Increment nesting. |
+ builder()->try_catch_prediction_ = stmt->catch_predicted(); |
} |
~ControlScopeForFinally() { |
builder()->try_nesting_level_--; // Decrement nesting. |
+ builder()->try_catch_prediction_ = outer_prediction_; |
} |
protected: |
@@ -407,6 +416,7 @@ class AstGraphBuilder::ControlScopeForFinally : public ControlScope { |
private: |
DeferredCommands* commands_; |
TryFinallyBuilder* control_; |
+ bool outer_prediction_; |
}; |
@@ -463,7 +473,6 @@ class AstGraphBuilder::FrameStateBeforeAndAfter { |
Node* frame_state_before_; |
}; |
- |
AstGraphBuilder::AstGraphBuilder(Zone* local_zone, CompilationInfo* info, |
JSGraph* jsgraph, LoopAssignmentAnalysis* loop, |
TypeHintAnalysis* type_hint_analysis) |
@@ -476,8 +485,8 @@ AstGraphBuilder::AstGraphBuilder(Zone* local_zone, CompilationInfo* info, |
globals_(0, local_zone), |
execution_control_(nullptr), |
execution_context_(nullptr), |
- try_catch_nesting_level_(0), |
try_nesting_level_(0), |
+ try_catch_prediction_(false), |
input_buffer_size_(0), |
input_buffer_(nullptr), |
exit_controls_(local_zone), |
@@ -1483,7 +1492,7 @@ void AstGraphBuilder::VisitTryCatchStatement(TryCatchStatement* stmt) { |
// that is intercepting 'throw' control commands. |
try_control.BeginTry(); |
{ |
- ControlScopeForCatch scope(this, &try_control); |
+ ControlScopeForCatch scope(this, stmt, &try_control); |
STATIC_ASSERT(TryBlockConstant::kElementCount == 1); |
environment()->Push(current_context()); |
Visit(stmt->try_block()); |
@@ -1529,7 +1538,7 @@ void AstGraphBuilder::VisitTryFinallyStatement(TryFinallyStatement* stmt) { |
// that is intercepting all control commands. |
try_control.BeginTry(); |
{ |
- ControlScopeForFinally scope(this, commands, &try_control); |
+ ControlScopeForFinally scope(this, stmt, commands, &try_control); |
STATIC_ASSERT(TryBlockConstant::kElementCount == 1); |
environment()->Push(current_context()); |
Visit(stmt->try_block()); |
@@ -4136,7 +4145,7 @@ Node* AstGraphBuilder::MakeNode(const Operator* op, int value_input_count, |
// Add implicit exception continuation for throwing nodes. |
if (!result->op()->HasProperty(Operator::kNoThrow) && inside_try_scope) { |
// Conservative prediction whether caught locally. |
- IfExceptionHint hint = try_catch_nesting_level_ > 0 |
+ IfExceptionHint hint = try_catch_prediction_ |
? IfExceptionHint::kLocallyCaught |
: IfExceptionHint::kLocallyUncaught; |
// Copy the environment for the success continuation. |