Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(202)

Unified Diff: src/full-codegen.cc

Issue 1157213004: Drop computed handler count and index from AST. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressed comments. Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/full-codegen.h ('k') | src/ia32/full-codegen-ia32.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/full-codegen.cc
diff --git a/src/full-codegen.cc b/src/full-codegen.cc
index 5103f3ac89de75f49fd18a3823a4848a33da3601..16f0b55780bb88d52a743fd79191dc26d4befedc 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].handler_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->handler_offset = handler->pos();
+ 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);
« no previous file with comments | « src/full-codegen.h ('k') | src/ia32/full-codegen-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698