Index: src/compiler/bytecode-graph-builder.cc |
diff --git a/src/compiler/bytecode-graph-builder.cc b/src/compiler/bytecode-graph-builder.cc |
index 83ff7b7b27099358aa37c6977e95388c439c7eff..d6e744f1c205725ed8e016580017aecad7f6672e 100644 |
--- a/src/compiler/bytecode-graph-builder.cc |
+++ b/src/compiler/bytecode-graph-builder.cc |
@@ -1663,7 +1663,11 @@ void BytecodeGraphBuilder::EnterAndExitExceptionHandlers(int current_offset) { |
if (current_offset < next_start) break; // Not yet covered by range. |
int next_end = table->GetRangeEnd(current_exception_handler_); |
int next_handler = table->GetRangeHandler(current_exception_handler_); |
- exception_handlers_.push({next_start, next_end, next_handler}); |
+ // TODO(mstarzinger): We are hijacking the "depth" field in the exception |
+ // handler table to hold the context register. We should rename the field. |
+ int context_register = table->GetRangeDepth(current_exception_handler_); |
+ exception_handlers_.push( |
+ {next_start, next_end, next_handler, context_register}); |
current_exception_handler_++; |
} |
} |
@@ -1720,15 +1724,19 @@ Node* BytecodeGraphBuilder::MakeNode(const Operator* op, int value_input_count, |
// Add implicit exception continuation for throwing nodes. |
if (!result->op()->HasProperty(Operator::kNoThrow) && inside_handler) { |
int handler_offset = exception_handlers_.top().handler_offset_; |
+ int context_index = exception_handlers_.top().context_register_; |
+ interpreter::Register context_register(context_index); |
// TODO(mstarzinger): Thread through correct prediction! |
IfExceptionHint hint = IfExceptionHint::kLocallyCaught; |
Environment* success_env = environment()->CopyForConditional(); |
const Operator* op = common()->IfException(hint); |
Node* effect = environment()->GetEffectDependency(); |
Node* on_exception = graph()->NewNode(op, effect, result); |
+ Node* context = environment()->LookupRegister(context_register); |
environment()->UpdateControlDependency(on_exception); |
environment()->UpdateEffectDependency(on_exception); |
environment()->BindAccumulator(on_exception); |
+ environment()->SetContext(context); |
MergeIntoSuccessorEnvironment(handler_offset); |
set_environment(success_env); |
} |