Chromium Code Reviews| 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--) { |
|
wingo
2015/03/17 09:41:26
o/~ did you ever know, that you're my hero o/~
|
| + 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); } |