Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index f7d0fd5b65fc5fa923c7dfbccf9cda42128a6795..a1586e40701ac7928a9b876f16588fd2279ad9a8 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -8458,6 +8458,36 @@ Handle<DeoptimizationOutputData> DeoptimizationOutputData::New( |
} |
+int HandlerTable::LookupRange(int pc_offset, int* stack_depth_out) { |
+ int innermost_handler = -1, innermost_start = -1; |
+ for (int i = 0; i < length(); i += kRangeEntrySize) { |
+ int start_offset = Smi::cast(get(i + kRangeStartIndex))->value(); |
+ int end_offset = Smi::cast(get(i + kRangeEndIndex))->value(); |
+ int handler_offset = Smi::cast(get(i + kRangeHandlerIndex))->value(); |
+ int stack_depth = Smi::cast(get(i + kRangeDepthIndex))->value(); |
+ if (pc_offset > start_offset && pc_offset <= end_offset) { |
+ DCHECK_NE(start_offset, innermost_start); |
+ if (start_offset < innermost_start) continue; |
+ innermost_handler = handler_offset; |
+ innermost_start = start_offset; |
+ *stack_depth_out = stack_depth; |
+ } |
+ } |
+ return innermost_handler; |
+} |
+ |
+ |
+// TODO(turbofan): Make sure table is sorted and use binary search. |
+int HandlerTable::LookupReturn(int pc_offset) { |
+ for (int i = 0; i < length(); i += kReturnEntrySize) { |
+ int return_offset = Smi::cast(get(i + kReturnOffsetIndex))->value(); |
+ int handler_offset = Smi::cast(get(i + kReturnHandlerIndex))->value(); |
+ if (pc_offset == return_offset) return handler_offset; |
+ } |
+ return -1; |
+} |
+ |
+ |
#ifdef DEBUG |
bool DescriptorArray::IsEqualTo(DescriptorArray* other) { |
if (IsEmpty()) return other->IsEmpty(); |
@@ -11484,6 +11514,30 @@ void DeoptimizationOutputData::DeoptimizationOutputDataPrint( |
} |
+void HandlerTable::HandlerTableRangePrint(std::ostream& os) { |
+ os << " from to hdlr\n"; |
+ for (int i = 0; i < length(); i += kRangeEntrySize) { |
+ int pc_start = Smi::cast(get(i + kRangeStartIndex))->value(); |
+ int pc_end = Smi::cast(get(i + kRangeEndIndex))->value(); |
+ int handler = Smi::cast(get(i + kRangeHandlerIndex))->value(); |
+ int depth = Smi::cast(get(i + kRangeDepthIndex))->value(); |
+ os << " (" << std::setw(4) << pc_start << "," << std::setw(4) << pc_end |
+ << ") -> " << std::setw(4) << handler << " (depth=" << depth << ")\n"; |
+ } |
+} |
+ |
+ |
+void HandlerTable::HandlerTableReturnPrint(std::ostream& os) { |
+ os << " off hdlr\n"; |
+ for (int i = 0; i < length(); i += kReturnEntrySize) { |
+ int pc_offset = Smi::cast(get(i + kReturnOffsetIndex))->value(); |
+ int handler = Smi::cast(get(i + kReturnHandlerIndex))->value(); |
+ os << " " << std::setw(4) << pc_offset << " -> " << std::setw(4) |
+ << handler << "\n"; |
+ } |
+} |
+ |
+ |
const char* Code::ICState2String(InlineCacheState state) { |
switch (state) { |
case UNINITIALIZED: return "UNINITIALIZED"; |
@@ -11630,13 +11684,12 @@ void Code::Disassemble(const char* name, std::ostream& os) { // NOLINT |
#endif |
} |
- if (handler_table()->length() > 0 && is_turbofanned()) { |
+ if (handler_table()->length() > 0) { |
os << "Handler Table (size = " << handler_table()->Size() << ")\n"; |
- for (int i = 0; i < handler_table()->length(); i += 2) { |
- int pc_offset = Smi::cast(handler_table()->get(i))->value(); |
- int handler = Smi::cast(handler_table()->get(i + 1))->value(); |
- os << static_cast<const void*>(instruction_start() + pc_offset) << " " |
- << std::setw(4) << pc_offset << " " << std::setw(4) << handler << "\n"; |
+ if (kind() == FUNCTION) { |
+ HandlerTable::cast(handler_table())->HandlerTableRangePrint(os); |
+ } else if (kind() == OPTIMIZED_FUNCTION) { |
+ HandlerTable::cast(handler_table())->HandlerTableReturnPrint(os); |
} |
os << "\n"; |
} |