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 |