Chromium Code Reviews| Index: src/full-codegen.cc |
| diff --git a/src/full-codegen.cc b/src/full-codegen.cc |
| index 5103f3ac89de75f49fd18a3823a4848a33da3601..5b292da2aadb887caba46fb525ca209769043b93 100644 |
| --- a/src/full-codegen.cc |
| +++ b/src/full-codegen.cc |
| @@ -319,9 +319,9 @@ bool FullCodeGenerator::MakeCode(CompilationInfo* info) { |
| Handle<Code> code = CodeGenerator::MakeCodeEpilogue(&masm, flags, info); |
| cgen.PopulateDeoptimizationData(code); |
| cgen.PopulateTypeFeedbackInfo(code); |
| + cgen.PopulateHandlerTable(code); |
| code->set_has_deoptimization_support(info->HasDeoptimizationSupport()); |
| code->set_has_reloc_info_for_serialization(info->will_serialize()); |
| - code->set_handler_table(*cgen.handler_table()); |
| code->set_compiled_optimizable(info->IsOptimizable()); |
| code->set_allow_osr_at_loop_nesting_level(0); |
| code->set_profiler_ticks(0); |
| @@ -401,6 +401,32 @@ void FullCodeGenerator::PopulateTypeFeedbackInfo(Handle<Code> code) { |
| } |
| +void FullCodeGenerator::PopulateHandlerTable(Handle<Code> code) { |
| + int handler_table_size = static_cast<int>(handler_table_.size()); |
| + Handle<HandlerTable> table = |
| + Handle<HandlerTable>::cast(isolate()->factory()->NewFixedArray( |
| + HandlerTable::LengthForRange(handler_table_size), TENURED)); |
| + for (int i = 0; i < handler_table_size; ++i) { |
| + HandlerTable::CatchPrediction prediction = |
| + handler_table_[i].try_catch_depth > 0 ? HandlerTable::CAUGHT |
| + : HandlerTable::UNCAUGHT; |
| + table->SetRangeStart(i, handler_table_[i].range_start); |
| + table->SetRangeEnd(i, handler_table_[i].range_end); |
| + table->SetRangeHandler(i, handler_table_[i].pc_offset, prediction); |
| + table->SetRangeDepth(i, handler_table_[i].stack_depth); |
| + } |
| + code->set_handler_table(*table); |
| +} |
| + |
| + |
| +int FullCodeGenerator::NewHandlerTableEntry() { |
| + int index = static_cast<int>(handler_table_.size()); |
| + HandlerTableEntry entry = {0, 0, 0, 0, 0}; |
| + handler_table_.push_back(entry); |
| + return index; |
| +} |
| + |
| + |
| bool FullCodeGenerator::MustCreateObjectLiteralWithRuntime( |
| ObjectLiteral* expr) const { |
| int literal_flags = expr->ComputeFlags(); |
| @@ -1229,11 +1255,12 @@ void FullCodeGenerator::VisitTryCatchStatement(TryCatchStatement* stmt) { |
| __ bind(&try_entry); |
| try_catch_depth_++; |
| - EnterTryBlock(stmt->index(), &handler_entry); |
| + int handler_index = NewHandlerTableEntry(); |
| + EnterTryBlock(handler_index, &handler_entry); |
| { TryCatch try_body(this); |
| Visit(stmt->try_block()); |
| } |
| - ExitTryBlock(stmt->index()); |
| + ExitTryBlock(handler_index); |
| try_catch_depth_--; |
| __ bind(&exit); |
| } |
| @@ -1286,11 +1313,12 @@ void FullCodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) { |
| // Set up try handler. |
| __ bind(&try_entry); |
| - EnterTryBlock(stmt->index(), &handler_entry); |
| + int handler_index = NewHandlerTableEntry(); |
| + EnterTryBlock(handler_index, &handler_entry); |
| { TryFinally try_body(this, &finally_entry); |
| Visit(stmt->try_block()); |
| } |
| - ExitTryBlock(stmt->index()); |
| + ExitTryBlock(handler_index); |
| // Execute the finally block on the way out. Clobber the unpredictable |
| // value in the result register with one that's safe for GC because the |
| // finally block will unconditionally preserve the result register on the |
| @@ -1451,18 +1479,18 @@ void FullCodeGenerator::VisitThrow(Throw* expr) { |
| } |
| -void FullCodeGenerator::EnterTryBlock(int index, Label* handler) { |
| - handler_table()->SetRangeStart(index, masm()->pc_offset()); |
| - HandlerTable::CatchPrediction prediction = |
| - try_catch_depth_ > 0 ? HandlerTable::CAUGHT : HandlerTable::UNCAUGHT; |
| - handler_table()->SetRangeHandler(index, handler->pos(), prediction); |
| +void FullCodeGenerator::EnterTryBlock(int handler_index, Label* handler) { |
| + HandlerTableEntry* entry = &handler_table_[handler_index]; |
| + entry->range_start = masm()->pc_offset(); |
| + entry->pc_offset = handler->pos(); |
|
Igor Sheludko
2015/06/08 14:30:13
nit: WDYT about calling it "handler_offset"?
Michael Starzinger
2015/06/08 14:34:27
Done.
|
| + entry->try_catch_depth = try_catch_depth_; |
| // Determine expression stack depth of try statement. |
| int stack_depth = info_->scope()->num_stack_slots(); // Include stack locals. |
| for (NestedStatement* current = nesting_stack_; current != NULL; /*nop*/) { |
| current = current->AccumulateDepth(&stack_depth); |
| } |
| - handler_table()->SetRangeDepth(index, stack_depth); |
| + entry->stack_depth = stack_depth; |
| // Push context onto operand stack. |
| STATIC_ASSERT(TryBlockConstant::kElementCount == 1); |
| @@ -1470,8 +1498,9 @@ void FullCodeGenerator::EnterTryBlock(int index, Label* handler) { |
| } |
| -void FullCodeGenerator::ExitTryBlock(int index) { |
| - handler_table()->SetRangeEnd(index, masm()->pc_offset()); |
| +void FullCodeGenerator::ExitTryBlock(int handler_index) { |
| + HandlerTableEntry* entry = &handler_table_[handler_index]; |
| + entry->range_end = masm()->pc_offset(); |
| // Drop context from operand stack. |
| __ Drop(TryBlockConstant::kElementCount); |