| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/frames.h" | 5 #include "src/frames.h" |
| 6 | 6 |
| 7 #include <sstream> | 7 #include <sstream> |
| 8 | 8 |
| 9 #include "src/ast/ast.h" | 9 #include "src/ast/ast.h" |
| 10 #include "src/ast/scopeinfo.h" | 10 #include "src/ast/scopeinfo.h" |
| (...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 595 // together with the associated caller pc. | 595 // together with the associated caller pc. |
| 596 state->constant_pool_address = NULL; | 596 state->constant_pool_address = NULL; |
| 597 } | 597 } |
| 598 | 598 |
| 599 | 599 |
| 600 Address StandardFrame::GetExpressionAddress(int n) const { | 600 Address StandardFrame::GetExpressionAddress(int n) const { |
| 601 const int offset = StandardFrameConstants::kExpressionsOffset; | 601 const int offset = StandardFrameConstants::kExpressionsOffset; |
| 602 return fp() + offset - n * kPointerSize; | 602 return fp() + offset - n * kPointerSize; |
| 603 } | 603 } |
| 604 | 604 |
| 605 | 605 Address InterpretedFrame::GetExpressionAddress(int n) const { |
| 606 Object* StandardFrame::GetExpression(Address fp, int index) { | 606 const int offset = InterpreterFrameConstants::kExpressionsOffset; |
| 607 return Memory::Object_at(GetExpressionAddress(fp, index)); | 607 return fp() + offset - n * kPointerSize; |
| 608 } | 608 } |
| 609 | 609 |
| 610 | |
| 611 Address StandardFrame::GetExpressionAddress(Address fp, int n) { | |
| 612 const int offset = StandardFrameConstants::kExpressionsOffset; | |
| 613 return fp + offset - n * kPointerSize; | |
| 614 } | |
| 615 | |
| 616 | |
| 617 int StandardFrame::ComputeExpressionsCount() const { | 610 int StandardFrame::ComputeExpressionsCount() const { |
| 618 const int offset = | 611 Address base = GetExpressionAddress(0); |
| 619 StandardFrameConstants::kExpressionsOffset + kPointerSize; | 612 Address limit = sp() - kPointerSize; |
| 620 Address base = fp() + offset; | |
| 621 Address limit = sp(); | |
| 622 DCHECK(base >= limit); // stack grows downwards | 613 DCHECK(base >= limit); // stack grows downwards |
| 623 // Include register-allocated locals in number of expressions. | 614 // Include register-allocated locals in number of expressions. |
| 624 return static_cast<int>((base - limit) / kPointerSize); | 615 return static_cast<int>((base - limit) / kPointerSize); |
| 625 } | 616 } |
| 626 | 617 |
| 627 | 618 |
| 628 void StandardFrame::ComputeCallerState(State* state) const { | 619 void StandardFrame::ComputeCallerState(State* state) const { |
| 629 state->sp = caller_sp(); | 620 state->sp = caller_sp(); |
| 630 state->fp = caller_fp(); | 621 state->fp = caller_fp(); |
| 631 state->pc_address = ResolveReturnAddressLocation( | 622 state->pc_address = ResolveReturnAddressLocation( |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 758 bool JavaScriptFrame::HasInlinedFrames() const { | 749 bool JavaScriptFrame::HasInlinedFrames() const { |
| 759 List<JSFunction*> functions(1); | 750 List<JSFunction*> functions(1); |
| 760 GetFunctions(&functions); | 751 GetFunctions(&functions); |
| 761 return functions.length() > 1; | 752 return functions.length() > 1; |
| 762 } | 753 } |
| 763 | 754 |
| 764 | 755 |
| 765 int JavaScriptFrame::GetArgumentsLength() const { | 756 int JavaScriptFrame::GetArgumentsLength() const { |
| 766 // If there is an arguments adaptor frame get the arguments length from it. | 757 // If there is an arguments adaptor frame get the arguments length from it. |
| 767 if (has_adapted_arguments()) { | 758 if (has_adapted_arguments()) { |
| 768 STATIC_ASSERT(ArgumentsAdaptorFrameConstants::kLengthOffset == | 759 return ArgumentsAdaptorFrame::GetLength(caller_fp()); |
| 769 StandardFrameConstants::kExpressionsOffset); | |
| 770 return Smi::cast(GetExpression(caller_fp(), 0))->value(); | |
| 771 } else { | 760 } else { |
| 772 return GetNumberOfIncomingArguments(); | 761 return GetNumberOfIncomingArguments(); |
| 773 } | 762 } |
| 774 } | 763 } |
| 775 | 764 |
| 776 | 765 |
| 777 Code* JavaScriptFrame::unchecked_code() const { | 766 Code* JavaScriptFrame::unchecked_code() const { |
| 778 return function()->code(); | 767 return function()->code(); |
| 779 } | 768 } |
| 780 | 769 |
| (...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1131 int InterpretedFrame::LookupExceptionHandlerInTable( | 1120 int InterpretedFrame::LookupExceptionHandlerInTable( |
| 1132 int* context_register, HandlerTable::CatchPrediction* prediction) { | 1121 int* context_register, HandlerTable::CatchPrediction* prediction) { |
| 1133 BytecodeArray* bytecode = function()->shared()->bytecode_array(); | 1122 BytecodeArray* bytecode = function()->shared()->bytecode_array(); |
| 1134 HandlerTable* table = HandlerTable::cast(bytecode->handler_table()); | 1123 HandlerTable* table = HandlerTable::cast(bytecode->handler_table()); |
| 1135 int pc_offset = GetBytecodeOffset() + 1; // Point after current bytecode. | 1124 int pc_offset = GetBytecodeOffset() + 1; // Point after current bytecode. |
| 1136 return table->LookupRange(pc_offset, context_register, prediction); | 1125 return table->LookupRange(pc_offset, context_register, prediction); |
| 1137 } | 1126 } |
| 1138 | 1127 |
| 1139 int InterpretedFrame::GetBytecodeOffset() const { | 1128 int InterpretedFrame::GetBytecodeOffset() const { |
| 1140 const int index = InterpreterFrameConstants::kBytecodeOffsetExpressionIndex; | 1129 const int index = InterpreterFrameConstants::kBytecodeOffsetExpressionIndex; |
| 1141 DCHECK_EQ(InterpreterFrameConstants::kBytecodeOffsetFromFp, | 1130 DCHECK_EQ( |
| 1142 StandardFrameConstants::kExpressionsOffset - index * kPointerSize); | 1131 InterpreterFrameConstants::kBytecodeOffsetFromFp, |
| 1132 InterpreterFrameConstants::kExpressionsOffset - index * kPointerSize); |
| 1143 int raw_offset = Smi::cast(GetExpression(index))->value(); | 1133 int raw_offset = Smi::cast(GetExpression(index))->value(); |
| 1144 return raw_offset - BytecodeArray::kHeaderSize + kHeapObjectTag; | 1134 return raw_offset - BytecodeArray::kHeaderSize + kHeapObjectTag; |
| 1145 } | 1135 } |
| 1146 | 1136 |
| 1147 void InterpretedFrame::PatchBytecodeOffset(int new_offset) { | 1137 void InterpretedFrame::PatchBytecodeOffset(int new_offset) { |
| 1148 const int index = InterpreterFrameConstants::kBytecodeOffsetExpressionIndex; | 1138 const int index = InterpreterFrameConstants::kBytecodeOffsetExpressionIndex; |
| 1149 DCHECK_EQ(InterpreterFrameConstants::kBytecodeOffsetFromFp, | 1139 DCHECK_EQ( |
| 1150 StandardFrameConstants::kExpressionsOffset - index * kPointerSize); | 1140 InterpreterFrameConstants::kBytecodeOffsetFromFp, |
| 1141 InterpreterFrameConstants::kExpressionsOffset - index * kPointerSize); |
| 1151 int raw_offset = new_offset + BytecodeArray::kHeaderSize - kHeapObjectTag; | 1142 int raw_offset = new_offset + BytecodeArray::kHeaderSize - kHeapObjectTag; |
| 1152 SetExpression(index, Smi::FromInt(raw_offset)); | 1143 SetExpression(index, Smi::FromInt(raw_offset)); |
| 1153 } | 1144 } |
| 1154 | 1145 |
| 1155 Object* InterpretedFrame::GetBytecodeArray() const { | 1146 Object* InterpretedFrame::GetBytecodeArray() const { |
| 1156 const int index = InterpreterFrameConstants::kBytecodeArrayExpressionIndex; | 1147 const int index = InterpreterFrameConstants::kBytecodeArrayExpressionIndex; |
| 1157 DCHECK_EQ(InterpreterFrameConstants::kBytecodeArrayFromFp, | 1148 DCHECK_EQ( |
| 1158 StandardFrameConstants::kExpressionsOffset - index * kPointerSize); | 1149 InterpreterFrameConstants::kBytecodeArrayFromFp, |
| 1150 InterpreterFrameConstants::kExpressionsOffset - index * kPointerSize); |
| 1159 return GetExpression(index); | 1151 return GetExpression(index); |
| 1160 } | 1152 } |
| 1161 | 1153 |
| 1162 void InterpretedFrame::PatchBytecodeArray(Object* bytecode_array) { | 1154 void InterpretedFrame::PatchBytecodeArray(Object* bytecode_array) { |
| 1163 const int index = InterpreterFrameConstants::kBytecodeArrayExpressionIndex; | 1155 const int index = InterpreterFrameConstants::kBytecodeArrayExpressionIndex; |
| 1164 DCHECK_EQ(InterpreterFrameConstants::kBytecodeArrayFromFp, | 1156 DCHECK_EQ( |
| 1165 StandardFrameConstants::kExpressionsOffset - index * kPointerSize); | 1157 InterpreterFrameConstants::kBytecodeArrayFromFp, |
| 1158 InterpreterFrameConstants::kExpressionsOffset - index * kPointerSize); |
| 1166 SetExpression(index, bytecode_array); | 1159 SetExpression(index, bytecode_array); |
| 1167 } | 1160 } |
| 1168 | 1161 |
| 1169 Object* InterpretedFrame::GetInterpreterRegister(int register_index) const { | 1162 Object* InterpretedFrame::GetInterpreterRegister(int register_index) const { |
| 1170 const int index = InterpreterFrameConstants::kRegisterFileExpressionIndex; | 1163 const int index = InterpreterFrameConstants::kRegisterFileExpressionIndex; |
| 1171 DCHECK_EQ(InterpreterFrameConstants::kRegisterFilePointerFromFp, | 1164 DCHECK_EQ( |
| 1172 StandardFrameConstants::kExpressionsOffset - index * kPointerSize); | 1165 InterpreterFrameConstants::kRegisterFilePointerFromFp, |
| 1166 InterpreterFrameConstants::kExpressionsOffset - index * kPointerSize); |
| 1173 return GetExpression(index + register_index); | 1167 return GetExpression(index + register_index); |
| 1174 } | 1168 } |
| 1175 | 1169 |
| 1176 void InterpretedFrame::Summarize(List<FrameSummary>* functions) { | 1170 void InterpretedFrame::Summarize(List<FrameSummary>* functions) { |
| 1177 DCHECK(functions->length() == 0); | 1171 DCHECK(functions->length() == 0); |
| 1178 AbstractCode* abstract_code = | 1172 AbstractCode* abstract_code = |
| 1179 AbstractCode::cast(function()->shared()->bytecode_array()); | 1173 AbstractCode::cast(function()->shared()->bytecode_array()); |
| 1180 FrameSummary summary(receiver(), function(), abstract_code, | 1174 FrameSummary summary(receiver(), function(), abstract_code, |
| 1181 GetBytecodeOffset(), IsConstructor()); | 1175 GetBytecodeOffset(), IsConstructor()); |
| 1182 functions->Add(summary); | 1176 functions->Add(summary); |
| 1183 } | 1177 } |
| 1184 | 1178 |
| 1185 int ArgumentsAdaptorFrame::GetNumberOfIncomingArguments() const { | 1179 int ArgumentsAdaptorFrame::GetNumberOfIncomingArguments() const { |
| 1186 return Smi::cast(GetExpression(0))->value(); | 1180 return Smi::cast(GetExpression(0))->value(); |
| 1187 } | 1181 } |
| 1188 | 1182 |
| 1189 | 1183 |
| 1190 Address ArgumentsAdaptorFrame::GetCallerStackPointer() const { | 1184 Address ArgumentsAdaptorFrame::GetCallerStackPointer() const { |
| 1191 return fp() + StandardFrameConstants::kCallerSPOffset; | 1185 return fp() + StandardFrameConstants::kCallerSPOffset; |
| 1192 } | 1186 } |
| 1193 | 1187 |
| 1188 int ArgumentsAdaptorFrame::GetLength(Address fp) { |
| 1189 const int offset = ArgumentsAdaptorFrameConstants::kLengthOffset; |
| 1190 return Smi::cast(Memory::Object_at(fp + offset))->value(); |
| 1191 } |
| 1192 |
| 1193 Code* ArgumentsAdaptorFrame::unchecked_code() const { |
| 1194 return isolate()->builtins()->builtin( |
| 1195 Builtins::kArgumentsAdaptorTrampoline); |
| 1196 } |
| 1194 | 1197 |
| 1195 Address InternalFrame::GetCallerStackPointer() const { | 1198 Address InternalFrame::GetCallerStackPointer() const { |
| 1196 // Internal frames have no arguments. The stack pointer of the | 1199 // Internal frames have no arguments. The stack pointer of the |
| 1197 // caller is at a fixed offset from the frame pointer. | 1200 // caller is at a fixed offset from the frame pointer. |
| 1198 return fp() + StandardFrameConstants::kCallerSPOffset; | 1201 return fp() + StandardFrameConstants::kCallerSPOffset; |
| 1199 } | 1202 } |
| 1200 | 1203 |
| 1201 | |
| 1202 Code* ArgumentsAdaptorFrame::unchecked_code() const { | |
| 1203 return isolate()->builtins()->builtin( | |
| 1204 Builtins::kArgumentsAdaptorTrampoline); | |
| 1205 } | |
| 1206 | |
| 1207 | |
| 1208 Code* InternalFrame::unchecked_code() const { | 1204 Code* InternalFrame::unchecked_code() const { |
| 1209 const int offset = InternalFrameConstants::kCodeOffset; | 1205 const int offset = InternalFrameConstants::kCodeOffset; |
| 1210 Object* code = Memory::Object_at(fp() + offset); | 1206 Object* code = Memory::Object_at(fp() + offset); |
| 1211 DCHECK(code != NULL); | 1207 DCHECK(code != NULL); |
| 1212 return reinterpret_cast<Code*>(code); | 1208 return reinterpret_cast<Code*>(code); |
| 1213 } | 1209 } |
| 1214 | 1210 |
| 1215 | 1211 |
| 1216 void StackFrame::PrintIndex(StringStream* accumulator, | 1212 void StackFrame::PrintIndex(StringStream* accumulator, |
| 1217 PrintMode mode, | 1213 PrintMode mode, |
| (...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1643 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { | 1639 for (StackFrameIterator it(isolate); !it.done(); it.Advance()) { |
| 1644 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); | 1640 StackFrame* frame = AllocateFrameCopy(it.frame(), zone); |
| 1645 list.Add(frame, zone); | 1641 list.Add(frame, zone); |
| 1646 } | 1642 } |
| 1647 return list.ToVector(); | 1643 return list.ToVector(); |
| 1648 } | 1644 } |
| 1649 | 1645 |
| 1650 | 1646 |
| 1651 } // namespace internal | 1647 } // namespace internal |
| 1652 } // namespace v8 | 1648 } // namespace v8 |
| OLD | NEW |