| OLD | NEW | 
|    1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |    1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 
|    2 // Redistribution and use in source and binary forms, with or without |    2 // Redistribution and use in source and binary forms, with or without | 
|    3 // modification, are permitted provided that the following conditions are |    3 // modification, are permitted provided that the following conditions are | 
|    4 // met: |    4 // met: | 
|    5 // |    5 // | 
|    6 //     * Redistributions of source code must retain the above copyright |    6 //     * Redistributions of source code must retain the above copyright | 
|    7 //       notice, this list of conditions and the following disclaimer. |    7 //       notice, this list of conditions and the following disclaimer. | 
|    8 //     * Redistributions in binary form must reproduce the above |    8 //     * Redistributions in binary form must reproduce the above | 
|    9 //       copyright notice, this list of conditions and the following |    9 //       copyright notice, this list of conditions and the following | 
|   10 //       disclaimer in the documentation and/or other materials provided |   10 //       disclaimer in the documentation and/or other materials provided | 
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  375 Code* EntryFrame::code() const { |  375 Code* EntryFrame::code() const { | 
|  376   return Heap::js_entry_code(); |  376   return Heap::js_entry_code(); | 
|  377 } |  377 } | 
|  378  |  378  | 
|  379  |  379  | 
|  380 void EntryFrame::ComputeCallerState(State* state) const { |  380 void EntryFrame::ComputeCallerState(State* state) const { | 
|  381   GetCallerState(state); |  381   GetCallerState(state); | 
|  382 } |  382 } | 
|  383  |  383  | 
|  384  |  384  | 
 |  385 void EntryFrame::SetCallerFp(Address caller_fp) { | 
 |  386   const int offset = EntryFrameConstants::kCallerFPOffset; | 
 |  387   Memory::Address_at(this->fp() + offset) = caller_fp; | 
 |  388 } | 
 |  389  | 
 |  390  | 
|  385 StackFrame::Type EntryFrame::GetCallerState(State* state) const { |  391 StackFrame::Type EntryFrame::GetCallerState(State* state) const { | 
|  386   const int offset = EntryFrameConstants::kCallerFPOffset; |  392   const int offset = EntryFrameConstants::kCallerFPOffset; | 
|  387   Address fp = Memory::Address_at(this->fp() + offset); |  393   Address fp = Memory::Address_at(this->fp() + offset); | 
|  388   return ExitFrame::GetStateForFramePointer(fp, state); |  394   return ExitFrame::GetStateForFramePointer(fp, state); | 
|  389 } |  395 } | 
|  390  |  396  | 
|  391  |  397  | 
|  392 Code* EntryConstructFrame::code() const { |  398 Code* EntryConstructFrame::code() const { | 
|  393   return Heap::js_construct_entry_code(); |  399   return Heap::js_construct_entry_code(); | 
|  394 } |  400 } | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
|  407  |  413  | 
|  408 void ExitFrame::ComputeCallerState(State* state) const { |  414 void ExitFrame::ComputeCallerState(State* state) const { | 
|  409   // Setup the caller state. |  415   // Setup the caller state. | 
|  410   state->sp = caller_sp(); |  416   state->sp = caller_sp(); | 
|  411   state->fp = Memory::Address_at(fp() + ExitFrameConstants::kCallerFPOffset); |  417   state->fp = Memory::Address_at(fp() + ExitFrameConstants::kCallerFPOffset); | 
|  412   state->pc_address |  418   state->pc_address | 
|  413       = reinterpret_cast<Address*>(fp() + ExitFrameConstants::kCallerPCOffset); |  419       = reinterpret_cast<Address*>(fp() + ExitFrameConstants::kCallerPCOffset); | 
|  414 } |  420 } | 
|  415  |  421  | 
|  416  |  422  | 
 |  423 void ExitFrame::SetCallerFp(Address caller_fp) { | 
 |  424   Memory::Address_at(fp() + ExitFrameConstants::kCallerFPOffset) = caller_fp; | 
 |  425 } | 
 |  426  | 
 |  427  | 
|  417 Address ExitFrame::GetCallerStackPointer() const { |  428 Address ExitFrame::GetCallerStackPointer() const { | 
|  418   return fp() + ExitFrameConstants::kCallerSPDisplacement; |  429   return fp() + ExitFrameConstants::kCallerSPDisplacement; | 
|  419 } |  430 } | 
|  420  |  431  | 
|  421  |  432  | 
|  422 Address StandardFrame::GetExpressionAddress(int n) const { |  433 Address StandardFrame::GetExpressionAddress(int n) const { | 
|  423   const int offset = StandardFrameConstants::kExpressionsOffset; |  434   const int offset = StandardFrameConstants::kExpressionsOffset; | 
|  424   return fp() + offset - n * kPointerSize; |  435   return fp() + offset - n * kPointerSize; | 
|  425 } |  436 } | 
|  426  |  437  | 
|  427  |  438  | 
|  428 int StandardFrame::ComputeExpressionsCount() const { |  439 int StandardFrame::ComputeExpressionsCount() const { | 
|  429   const int offset = |  440   const int offset = | 
|  430       StandardFrameConstants::kExpressionsOffset + kPointerSize; |  441       StandardFrameConstants::kExpressionsOffset + kPointerSize; | 
|  431   Address base = fp() + offset; |  442   Address base = fp() + offset; | 
|  432   Address limit = sp(); |  443   Address limit = sp(); | 
|  433   ASSERT(base >= limit);  // stack grows downwards |  444   ASSERT(base >= limit);  // stack grows downwards | 
|  434   // Include register-allocated locals in number of expressions. |  445   // Include register-allocated locals in number of expressions. | 
|  435   return static_cast<int>((base - limit) / kPointerSize); |  446   return static_cast<int>((base - limit) / kPointerSize); | 
|  436 } |  447 } | 
|  437  |  448  | 
|  438  |  449  | 
|  439 void StandardFrame::ComputeCallerState(State* state) const { |  450 void StandardFrame::ComputeCallerState(State* state) const { | 
|  440   state->sp = caller_sp(); |  451   state->sp = caller_sp(); | 
|  441   state->fp = caller_fp(); |  452   state->fp = caller_fp(); | 
|  442   state->pc_address = reinterpret_cast<Address*>(ComputePCAddress(fp())); |  453   state->pc_address = reinterpret_cast<Address*>(ComputePCAddress(fp())); | 
|  443 } |  454 } | 
|  444  |  455  | 
|  445  |  456  | 
 |  457 void StandardFrame::SetCallerFp(Address caller_fp) { | 
 |  458   Memory::Address_at(fp() + StandardFrameConstants::kCallerFPOffset) = | 
 |  459       caller_fp; | 
 |  460 } | 
 |  461  | 
 |  462  | 
|  446 bool StandardFrame::IsExpressionInsideHandler(int n) const { |  463 bool StandardFrame::IsExpressionInsideHandler(int n) const { | 
|  447   Address address = GetExpressionAddress(n); |  464   Address address = GetExpressionAddress(n); | 
|  448   for (StackHandlerIterator it(this, top_handler()); !it.done(); it.Advance()) { |  465   for (StackHandlerIterator it(this, top_handler()); !it.done(); it.Advance()) { | 
|  449     if (it.handler()->includes(address)) return true; |  466     if (it.handler()->includes(address)) return true; | 
|  450   } |  467   } | 
|  451   return false; |  468   return false; | 
|  452 } |  469 } | 
|  453  |  470  | 
|  454  |  471  | 
|  455 Object* JavaScriptFrame::GetParameter(int index) const { |  472 Object* JavaScriptFrame::GetParameter(int index) const { | 
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  760       if ((kJSCallerSaved & (1 << r)) != 0) |  777       if ((kJSCallerSaved & (1 << r)) != 0) | 
|  761         reg_code[i++] = r; |  778         reg_code[i++] = r; | 
|  762  |  779  | 
|  763     ASSERT(i == kNumJSCallerSaved); |  780     ASSERT(i == kNumJSCallerSaved); | 
|  764   } |  781   } | 
|  765   ASSERT(0 <= n && n < kNumJSCallerSaved); |  782   ASSERT(0 <= n && n < kNumJSCallerSaved); | 
|  766   return reg_code[n]; |  783   return reg_code[n]; | 
|  767 } |  784 } | 
|  768  |  785  | 
|  769  |  786  | 
 |  787 #define DEFINE_WRAPPER(type, field)                              \ | 
 |  788 class field##_Wrapper : public ZoneObject {                      \ | 
 |  789  public:  /* NOLINT */                                           \ | 
 |  790   field##_Wrapper(const field& original) : frame_(original) {    \ | 
 |  791   }                                                              \ | 
 |  792   field frame_;                                                  \ | 
 |  793 }; | 
 |  794 STACK_FRAME_TYPE_LIST(DEFINE_WRAPPER) | 
 |  795 #undef DEFINE_WRAPPER | 
 |  796  | 
 |  797 static StackFrame* AllocateFrameCopy(StackFrame* frame) { | 
 |  798 #define FRAME_TYPE_CASE(type, field) \ | 
 |  799   case StackFrame::type: { \ | 
 |  800     field##_Wrapper* wrapper = \ | 
 |  801         new field##_Wrapper(*(reinterpret_cast<field*>(frame))); \ | 
 |  802     return &wrapper->frame_; \ | 
 |  803   } | 
 |  804  | 
 |  805   switch (frame->type()) { | 
 |  806     STACK_FRAME_TYPE_LIST(FRAME_TYPE_CASE) | 
 |  807     default: UNREACHABLE(); | 
 |  808   } | 
 |  809 #undef FRAME_TYPE_CASE | 
 |  810   return NULL; | 
 |  811 } | 
 |  812  | 
 |  813 Vector<StackFrame*> CreateStackMap() { | 
 |  814   ZoneList<StackFrame*> list(10); | 
 |  815   for (StackFrameIterator it; !it.done(); it.Advance()) { | 
 |  816     StackFrame* frame = AllocateFrameCopy(it.frame()); | 
 |  817     list.Add(frame); | 
 |  818   } | 
 |  819   return list.ToVector(); | 
 |  820 } | 
 |  821  | 
 |  822  | 
|  770 } }  // namespace v8::internal |  823 } }  // namespace v8::internal | 
| OLD | NEW |