Index: src/frames.cc |
diff --git a/src/frames.cc b/src/frames.cc |
index e0df15964709a732d9bcea6049a45f15f8c8bbee..f52b3ce4e47a1bf0fd099723fb36d0f0ac604128 100644 |
--- a/src/frames.cc |
+++ b/src/frames.cc |
@@ -380,12 +380,6 @@ Code* StackFrame::GetSafepointData(Isolate* isolate, |
} |
-bool StackFrame::HasHandler() const { |
- StackHandlerIterator it(this, top_handler()); |
- return !it.done(); |
-} |
- |
- |
#ifdef DEBUG |
static bool GcSafeCodeContains(HeapObject* object, Address addr); |
#endif |
@@ -608,15 +602,6 @@ void StandardFrame::SetCallerFp(Address caller_fp) { |
} |
-bool StandardFrame::IsExpressionInsideHandler(int n) const { |
- Address address = GetExpressionAddress(n); |
- for (StackHandlerIterator it(this, top_handler()); !it.done(); it.Advance()) { |
- if (it.handler()->includes(address)) return true; |
- } |
- return false; |
-} |
- |
- |
void StandardFrame::IterateCompiledFrame(ObjectVisitor* v) const { |
// Make sure that we're not doing "safe" stack frame iteration. We cannot |
// possibly find pointers in optimized frames in that state. |
@@ -710,12 +695,6 @@ int StubFrame::GetNumberOfIncomingArguments() const { |
void OptimizedFrame::Iterate(ObjectVisitor* v) const { |
-#ifdef DEBUG |
- // Make sure that optimized frames do not contain any stack handlers. |
- StackHandlerIterator it(this, top_handler()); |
- DCHECK(it.done()); |
-#endif |
- |
IterateCompiledFrame(v); |
} |
@@ -782,6 +761,15 @@ void JavaScriptFrame::Summarize(List<FrameSummary>* functions) { |
} |
+int JavaScriptFrame::LookupExceptionHandlerInTable(int* stack_slots) { |
+ Code* code = LookupCode(); |
+ DCHECK(!code->is_optimized_code()); |
+ HandlerTable* table = HandlerTable::cast(code->handler_table()); |
+ int pc_offset = static_cast<int>(pc() - code->entry()); |
+ return table->LookupRange(pc_offset, stack_slots); |
+} |
+ |
+ |
void JavaScriptFrame::PrintFunctionAndOffset(JSFunction* function, Code* code, |
Address pc, FILE* file, |
bool print_line_number) { |
@@ -843,66 +831,19 @@ void JavaScriptFrame::PrintTop(Isolate* isolate, FILE* file, bool print_args, |
} |
-void JavaScriptFrame::SaveOperandStack(FixedArray* store, |
- int* stack_handler_index) const { |
+void JavaScriptFrame::SaveOperandStack(FixedArray* store) const { |
int operands_count = store->length(); |
DCHECK_LE(operands_count, ComputeOperandsCount()); |
- |
- // Visit the stack in LIFO order, saving operands and stack handlers into the |
- // array. The saved stack handlers store a link to the next stack handler, |
- // which will allow RestoreOperandStack to rewind the handlers. |
- StackHandlerIterator it(this, top_handler()); |
- int i = operands_count - 1; |
- *stack_handler_index = -1; |
- for (; !it.done(); it.Advance()) { |
- StackHandler* handler = it.handler(); |
- // Save operands pushed after the handler was pushed. |
- for (; GetOperandSlot(i) < handler->address(); i--) { |
- store->set(i, GetOperand(i)); |
- } |
- DCHECK_GE(i + 1, StackHandlerConstants::kSlotCount); |
- DCHECK_EQ(handler->address(), GetOperandSlot(i)); |
- int next_stack_handler_index = i + 1 - StackHandlerConstants::kSlotCount; |
- handler->Unwind(isolate(), store, next_stack_handler_index, |
- *stack_handler_index); |
- *stack_handler_index = next_stack_handler_index; |
- i -= StackHandlerConstants::kSlotCount; |
- } |
- |
- // Save any remaining operands. |
- for (; i >= 0; i--) { |
+ for (int i = 0; i < operands_count; i++) { |
store->set(i, GetOperand(i)); |
} |
} |
-void JavaScriptFrame::RestoreOperandStack(FixedArray* store, |
- int stack_handler_index) { |
+void JavaScriptFrame::RestoreOperandStack(FixedArray* store) { |
int operands_count = store->length(); |
DCHECK_LE(operands_count, ComputeOperandsCount()); |
- int i = 0; |
- while (i <= stack_handler_index) { |
- if (i < stack_handler_index) { |
- // An operand. |
- DCHECK_EQ(GetOperand(i), isolate()->heap()->the_hole_value()); |
- Memory::Object_at(GetOperandSlot(i)) = store->get(i); |
- i++; |
- } else { |
- // A stack handler. |
- DCHECK_EQ(i, stack_handler_index); |
- // The FixedArray store grows up. The stack grows down. So the operand |
- // slot for i actually points to the bottom of the top word in the |
- // handler. The base of the StackHandler* is the address of the bottom |
- // word, which will be the last slot that is in the handler. |
- int handler_slot_index = i + StackHandlerConstants::kSlotCount - 1; |
- StackHandler *handler = |
- StackHandler::FromAddress(GetOperandSlot(handler_slot_index)); |
- stack_handler_index = handler->Rewind(isolate(), store, i, fp()); |
- i += StackHandlerConstants::kSlotCount; |
- } |
- } |
- |
- for (; i < operands_count; i++) { |
+ for (int i = 0; i < operands_count; i++) { |
DCHECK_EQ(GetOperand(i), isolate()->heap()->the_hole_value()); |
Memory::Object_at(GetOperandSlot(i)) = store->get(i); |
} |
@@ -1035,6 +976,16 @@ void OptimizedFrame::Summarize(List<FrameSummary>* frames) { |
} |
+int OptimizedFrame::LookupExceptionHandlerInTable(int* stack_slots) { |
+ Code* code = LookupCode(); |
+ DCHECK(code->is_optimized_code()); |
+ HandlerTable* table = HandlerTable::cast(code->handler_table()); |
+ int pc_offset = static_cast<int>(pc() - code->entry()); |
+ *stack_slots = code->stack_slots(); |
+ return table->LookupReturn(pc_offset); |
+} |
+ |
+ |
DeoptimizationInputData* OptimizedFrame::GetDeoptimizationData( |
int* deopt_index) { |
DCHECK(is_optimized()); |
@@ -1286,7 +1237,6 @@ void JavaScriptFrame::Print(StringStream* accumulator, |
accumulator->Add(" // expression stack (top to bottom)\n"); |
} |
for (int i = expressions_count - 1; i >= expressions_start; i--) { |
- if (IsExpressionInsideHandler(i)) continue; |
accumulator->Add(" [%02d] : %o\n", i, GetExpression(i)); |
} |
@@ -1335,16 +1285,6 @@ void ArgumentsAdaptorFrame::Print(StringStream* accumulator, |
void EntryFrame::Iterate(ObjectVisitor* v) const { |
- StackHandlerIterator it(this, top_handler()); |
- DCHECK(!it.done()); |
- StackHandler* handler = it.handler(); |
- handler->Iterate(v, LookupCode()); |
-#ifdef DEBUG |
- // Make sure that the entry frame does not contain more than one |
- // stack handler. |
- it.Advance(); |
- DCHECK(it.done()); |
-#endif |
IteratePc(v, pc_address(), LookupCode()); |
} |
@@ -1353,17 +1293,6 @@ void StandardFrame::IterateExpressions(ObjectVisitor* v) const { |
const int offset = StandardFrameConstants::kLastObjectOffset; |
Object** base = &Memory::Object_at(sp()); |
Object** limit = &Memory::Object_at(fp() + offset) + 1; |
- for (StackHandlerIterator it(this, top_handler()); !it.done(); it.Advance()) { |
- StackHandler* handler = it.handler(); |
- // Traverse pointers down to - but not including - the next |
- // handler in the handler chain. Update the base to skip the |
- // handler and allow the handler to traverse its own pointers. |
- const Address address = handler->address(); |
- v->VisitPointers(base, reinterpret_cast<Object**>(address)); |
- base = reinterpret_cast<Object**>(address + StackHandlerConstants::kSize); |
- // Traverse the pointers in the handler itself. |
- handler->Iterate(v, LookupCode()); |
- } |
v->VisitPointers(base, limit); |
} |
@@ -1529,51 +1458,6 @@ InnerPointerToCodeCache::InnerPointerToCodeCacheEntry* |
// ------------------------------------------------------------------------- |
-void StackHandler::Unwind(Isolate* isolate, |
- FixedArray* array, |
- int offset, |
- int previous_handler_offset) const { |
- STATIC_ASSERT(StackHandlerConstants::kSlotCount >= 3); |
- DCHECK_LE(0, offset); |
- DCHECK_GE(array->length(), offset + StackHandlerConstants::kSlotCount); |
- // Unwinding a stack handler into an array chains it in the opposite |
- // direction, re-using the "next" slot as a "previous" link, so that stack |
- // handlers can be later re-wound in the correct order. |
- int s = Memory::int_at(address() + StackHandlerConstants::kStateIntOffset); |
- array->set(offset, Smi::FromInt(previous_handler_offset)); // next |
- array->set(offset + 1, Smi::FromInt(static_cast<int>(s))); // state |
- array->set(offset + 2, *context_address()); // context |
- |
- *isolate->handler_address() = next()->address(); |
-} |
- |
- |
-int StackHandler::Rewind(Isolate* isolate, |
- FixedArray* array, |
- int offset, |
- Address fp) { |
- STATIC_ASSERT(StackHandlerConstants::kSlotCount >= 3); |
- DCHECK_LE(0, offset); |
- DCHECK_GE(array->length(), offset + StackHandlerConstants::kSlotCount); |
- Smi* prev_handler_offset = Smi::cast(array->get(offset)); |
- Smi* smi_state = Smi::cast(array->get(offset + 1)); |
- Object* context = array->get(offset + 2); |
- |
- Memory::Address_at(address() + StackHandlerConstants::kNextOffset) = |
- *isolate->handler_address(); |
- Memory::int_at(address() + StackHandlerConstants::kStateIntOffset) = |
- smi_state->value(); |
- Memory::Object_at(address() + StackHandlerConstants::kContextOffset) = |
- context; |
- |
- *isolate->handler_address() = address(); |
- |
- return prev_handler_offset->value(); |
-} |
- |
- |
-// ------------------------------------------------------------------------- |
- |
int NumRegs(RegList reglist) { return base::bits::CountPopulation32(reglist); } |