Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 99 // Tells whether the given address is inside this handler. | 99 // Tells whether the given address is inside this handler. |
| 100 inline bool includes(Address address) const; | 100 inline bool includes(Address address) const; |
| 101 | 101 |
| 102 // Garbage collection support. | 102 // Garbage collection support. |
| 103 inline void Iterate(ObjectVisitor* v, Code* holder) const; | 103 inline void Iterate(ObjectVisitor* v, Code* holder) const; |
| 104 | 104 |
| 105 // Conversion support. | 105 // Conversion support. |
| 106 static inline StackHandler* FromAddress(Address address); | 106 static inline StackHandler* FromAddress(Address address); |
| 107 | 107 |
| 108 // Testers | 108 // Testers |
| 109 bool is_entry() { return state() == ENTRY; } | 109 inline bool is_entry() const; |
|
Kevin Millikin (Chromium)
2011/10/03 10:45:40
Removing isolate-inl.h from v8.h revealed a circul
| |
| 110 bool is_try_catch() { return state() == TRY_CATCH; } | 110 inline bool is_try_catch() const; |
| 111 bool is_try_finally() { return state() == TRY_FINALLY; } | 111 inline bool is_try_finally() const; |
| 112 | 112 |
| 113 private: | 113 private: |
| 114 // Accessors. | 114 // Accessors. |
| 115 inline State state() const; | 115 inline State state() const; |
| 116 | 116 |
| 117 inline Object** context_address() const; | 117 inline Object** context_address() const; |
| 118 inline Address* pc_address() const; | 118 inline Address* pc_address() const; |
| 119 | 119 |
| 120 DISALLOW_IMPLICIT_CONSTRUCTORS(StackHandler); | 120 DISALLOW_IMPLICIT_CONSTRUCTORS(StackHandler); |
| 121 }; | 121 }; |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 211 bool HasHandler() const; | 211 bool HasHandler() const; |
| 212 | 212 |
| 213 // Get the type of this frame. | 213 // Get the type of this frame. |
| 214 virtual Type type() const = 0; | 214 virtual Type type() const = 0; |
| 215 | 215 |
| 216 // Get the code associated with this frame. | 216 // Get the code associated with this frame. |
| 217 // This method could be called during marking phase of GC. | 217 // This method could be called during marking phase of GC. |
| 218 virtual Code* unchecked_code() const = 0; | 218 virtual Code* unchecked_code() const = 0; |
| 219 | 219 |
| 220 // Get the code associated with this frame. | 220 // Get the code associated with this frame. |
| 221 Code* LookupCode() const { | 221 inline Code* LookupCode() const; |
| 222 return GetContainingCode(isolate(), pc()); | |
| 223 } | |
| 224 | 222 |
| 225 // Get the code object that contains the given pc. | 223 // Get the code object that contains the given pc. |
| 226 static inline Code* GetContainingCode(Isolate* isolate, Address pc); | 224 static inline Code* GetContainingCode(Isolate* isolate, Address pc); |
| 227 | 225 |
| 228 // Get the code object containing the given pc and fill in the | 226 // Get the code object containing the given pc and fill in the |
| 229 // safepoint entry and the number of stack slots. The pc must be at | 227 // safepoint entry and the number of stack slots. The pc must be at |
| 230 // a safepoint. | 228 // a safepoint. |
| 231 static Code* GetSafepointData(Isolate* isolate, | 229 static Code* GetSafepointData(Isolate* isolate, |
| 232 Address pc, | 230 Address pc, |
| 233 SafepointEntry* safepoint_entry, | 231 SafepointEntry* safepoint_entry, |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 295 // Garbage collection support. | 293 // Garbage collection support. |
| 296 virtual void Iterate(ObjectVisitor* v) const; | 294 virtual void Iterate(ObjectVisitor* v) const; |
| 297 | 295 |
| 298 static EntryFrame* cast(StackFrame* frame) { | 296 static EntryFrame* cast(StackFrame* frame) { |
| 299 ASSERT(frame->is_entry()); | 297 ASSERT(frame->is_entry()); |
| 300 return static_cast<EntryFrame*>(frame); | 298 return static_cast<EntryFrame*>(frame); |
| 301 } | 299 } |
| 302 virtual void SetCallerFp(Address caller_fp); | 300 virtual void SetCallerFp(Address caller_fp); |
| 303 | 301 |
| 304 protected: | 302 protected: |
| 305 explicit EntryFrame(StackFrameIterator* iterator) : StackFrame(iterator) { } | 303 inline explicit EntryFrame(StackFrameIterator* iterator); |
| 306 | 304 |
| 307 // The caller stack pointer for entry frames is always zero. The | 305 // The caller stack pointer for entry frames is always zero. The |
| 308 // real information about the caller frame is available through the | 306 // real information about the caller frame is available through the |
| 309 // link to the top exit frame. | 307 // link to the top exit frame. |
| 310 virtual Address GetCallerStackPointer() const { return 0; } | 308 virtual Address GetCallerStackPointer() const { return 0; } |
| 311 | 309 |
| 312 private: | 310 private: |
| 313 virtual void ComputeCallerState(State* state) const; | 311 virtual void ComputeCallerState(State* state) const; |
| 314 virtual Type GetCallerState(State* state) const; | 312 virtual Type GetCallerState(State* state) const; |
| 315 | 313 |
| 316 friend class StackFrameIterator; | 314 friend class StackFrameIterator; |
| 317 }; | 315 }; |
| 318 | 316 |
| 319 | 317 |
| 320 class EntryConstructFrame: public EntryFrame { | 318 class EntryConstructFrame: public EntryFrame { |
| 321 public: | 319 public: |
| 322 virtual Type type() const { return ENTRY_CONSTRUCT; } | 320 virtual Type type() const { return ENTRY_CONSTRUCT; } |
| 323 | 321 |
| 324 virtual Code* unchecked_code() const; | 322 virtual Code* unchecked_code() const; |
| 325 | 323 |
| 326 static EntryConstructFrame* cast(StackFrame* frame) { | 324 static EntryConstructFrame* cast(StackFrame* frame) { |
| 327 ASSERT(frame->is_entry_construct()); | 325 ASSERT(frame->is_entry_construct()); |
| 328 return static_cast<EntryConstructFrame*>(frame); | 326 return static_cast<EntryConstructFrame*>(frame); |
| 329 } | 327 } |
| 330 | 328 |
| 331 protected: | 329 protected: |
| 332 explicit EntryConstructFrame(StackFrameIterator* iterator) | 330 inline explicit EntryConstructFrame(StackFrameIterator* iterator); |
| 333 : EntryFrame(iterator) { } | |
| 334 | 331 |
| 335 private: | 332 private: |
| 336 friend class StackFrameIterator; | 333 friend class StackFrameIterator; |
| 337 }; | 334 }; |
| 338 | 335 |
| 339 | 336 |
| 340 // Exit frames are used to exit JavaScript execution and go to C. | 337 // Exit frames are used to exit JavaScript execution and go to C. |
| 341 class ExitFrame: public StackFrame { | 338 class ExitFrame: public StackFrame { |
| 342 public: | 339 public: |
| 343 virtual Type type() const { return EXIT; } | 340 virtual Type type() const { return EXIT; } |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 357 } | 354 } |
| 358 | 355 |
| 359 // Compute the state and type of an exit frame given a frame | 356 // Compute the state and type of an exit frame given a frame |
| 360 // pointer. Used when constructing the first stack frame seen by an | 357 // pointer. Used when constructing the first stack frame seen by an |
| 361 // iterator and the frames following entry frames. | 358 // iterator and the frames following entry frames. |
| 362 static Type GetStateForFramePointer(Address fp, State* state); | 359 static Type GetStateForFramePointer(Address fp, State* state); |
| 363 static Address ComputeStackPointer(Address fp); | 360 static Address ComputeStackPointer(Address fp); |
| 364 static void FillState(Address fp, Address sp, State* state); | 361 static void FillState(Address fp, Address sp, State* state); |
| 365 | 362 |
| 366 protected: | 363 protected: |
| 367 explicit ExitFrame(StackFrameIterator* iterator) : StackFrame(iterator) { } | 364 inline explicit ExitFrame(StackFrameIterator* iterator); |
| 368 | 365 |
| 369 virtual Address GetCallerStackPointer() const; | 366 virtual Address GetCallerStackPointer() const; |
| 370 | 367 |
| 371 private: | 368 private: |
| 372 virtual void ComputeCallerState(State* state) const; | 369 virtual void ComputeCallerState(State* state) const; |
| 373 | 370 |
| 374 friend class StackFrameIterator; | 371 friend class StackFrameIterator; |
| 375 }; | 372 }; |
| 376 | 373 |
| 377 | 374 |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 390 static Object* GetExpression(Address fp, int index); | 387 static Object* GetExpression(Address fp, int index); |
| 391 | 388 |
| 392 virtual void SetCallerFp(Address caller_fp); | 389 virtual void SetCallerFp(Address caller_fp); |
| 393 | 390 |
| 394 static StandardFrame* cast(StackFrame* frame) { | 391 static StandardFrame* cast(StackFrame* frame) { |
| 395 ASSERT(frame->is_standard()); | 392 ASSERT(frame->is_standard()); |
| 396 return static_cast<StandardFrame*>(frame); | 393 return static_cast<StandardFrame*>(frame); |
| 397 } | 394 } |
| 398 | 395 |
| 399 protected: | 396 protected: |
| 400 explicit StandardFrame(StackFrameIterator* iterator) | 397 inline explicit StandardFrame(StackFrameIterator* iterator); |
| 401 : StackFrame(iterator) { } | |
| 402 | 398 |
| 403 virtual void ComputeCallerState(State* state) const; | 399 virtual void ComputeCallerState(State* state) const; |
| 404 | 400 |
| 405 // Accessors. | 401 // Accessors. |
| 406 inline Address caller_fp() const; | 402 inline Address caller_fp() const; |
| 407 inline Address caller_pc() const; | 403 inline Address caller_pc() const; |
| 408 | 404 |
| 409 // Computes the address of the PC field in the standard frame given | 405 // Computes the address of the PC field in the standard frame given |
| 410 // by the provided frame pointer. | 406 // by the provided frame pointer. |
| 411 static inline Address ComputePCAddress(Address fp); | 407 static inline Address ComputePCAddress(Address fp); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 510 | 506 |
| 511 // Build a list with summaries for this frame including all inlined frames. | 507 // Build a list with summaries for this frame including all inlined frames. |
| 512 virtual void Summarize(List<FrameSummary>* frames); | 508 virtual void Summarize(List<FrameSummary>* frames); |
| 513 | 509 |
| 514 static JavaScriptFrame* cast(StackFrame* frame) { | 510 static JavaScriptFrame* cast(StackFrame* frame) { |
| 515 ASSERT(frame->is_java_script()); | 511 ASSERT(frame->is_java_script()); |
| 516 return static_cast<JavaScriptFrame*>(frame); | 512 return static_cast<JavaScriptFrame*>(frame); |
| 517 } | 513 } |
| 518 | 514 |
| 519 protected: | 515 protected: |
| 520 explicit JavaScriptFrame(StackFrameIterator* iterator) | 516 inline explicit JavaScriptFrame(StackFrameIterator* iterator); |
| 521 : StandardFrame(iterator) { } | |
| 522 | 517 |
| 523 virtual Address GetCallerStackPointer() const; | 518 virtual Address GetCallerStackPointer() const; |
| 524 | 519 |
| 525 virtual int GetNumberOfIncomingArguments() const; | 520 virtual int GetNumberOfIncomingArguments() const; |
| 526 | 521 |
| 527 // Garbage collection support. Iterates over incoming arguments, | 522 // Garbage collection support. Iterates over incoming arguments, |
| 528 // receiver, and any callee-saved registers. | 523 // receiver, and any callee-saved registers. |
| 529 void IterateArguments(ObjectVisitor* v) const; | 524 void IterateArguments(ObjectVisitor* v) const; |
| 530 | 525 |
| 531 private: | 526 private: |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 548 // Return a list with JSFunctions of this frame. | 543 // Return a list with JSFunctions of this frame. |
| 549 // The functions are ordered bottom-to-top (i.e. functions.last() | 544 // The functions are ordered bottom-to-top (i.e. functions.last() |
| 550 // is the top-most activation) | 545 // is the top-most activation) |
| 551 virtual void GetFunctions(List<JSFunction*>* functions); | 546 virtual void GetFunctions(List<JSFunction*>* functions); |
| 552 | 547 |
| 553 virtual void Summarize(List<FrameSummary>* frames); | 548 virtual void Summarize(List<FrameSummary>* frames); |
| 554 | 549 |
| 555 DeoptimizationInputData* GetDeoptimizationData(int* deopt_index); | 550 DeoptimizationInputData* GetDeoptimizationData(int* deopt_index); |
| 556 | 551 |
| 557 protected: | 552 protected: |
| 558 explicit OptimizedFrame(StackFrameIterator* iterator) | 553 inline explicit OptimizedFrame(StackFrameIterator* iterator); |
| 559 : JavaScriptFrame(iterator) { } | |
| 560 | 554 |
| 561 private: | 555 private: |
| 562 friend class StackFrameIterator; | 556 friend class StackFrameIterator; |
| 563 }; | 557 }; |
| 564 | 558 |
| 565 | 559 |
| 566 // Arguments adaptor frames are automatically inserted below | 560 // Arguments adaptor frames are automatically inserted below |
| 567 // JavaScript frames when the actual number of parameters does not | 561 // JavaScript frames when the actual number of parameters does not |
| 568 // match the formal number of parameters. | 562 // match the formal number of parameters. |
| 569 class ArgumentsAdaptorFrame: public JavaScriptFrame { | 563 class ArgumentsAdaptorFrame: public JavaScriptFrame { |
| 570 public: | 564 public: |
| 571 virtual Type type() const { return ARGUMENTS_ADAPTOR; } | 565 virtual Type type() const { return ARGUMENTS_ADAPTOR; } |
| 572 | 566 |
| 573 // Determine the code for the frame. | 567 // Determine the code for the frame. |
| 574 virtual Code* unchecked_code() const; | 568 virtual Code* unchecked_code() const; |
| 575 | 569 |
| 576 static ArgumentsAdaptorFrame* cast(StackFrame* frame) { | 570 static ArgumentsAdaptorFrame* cast(StackFrame* frame) { |
| 577 ASSERT(frame->is_arguments_adaptor()); | 571 ASSERT(frame->is_arguments_adaptor()); |
| 578 return static_cast<ArgumentsAdaptorFrame*>(frame); | 572 return static_cast<ArgumentsAdaptorFrame*>(frame); |
| 579 } | 573 } |
| 580 | 574 |
| 581 // Printing support. | 575 // Printing support. |
| 582 virtual void Print(StringStream* accumulator, | 576 virtual void Print(StringStream* accumulator, |
| 583 PrintMode mode, | 577 PrintMode mode, |
| 584 int index) const; | 578 int index) const; |
| 585 | 579 |
| 586 protected: | 580 protected: |
| 587 explicit ArgumentsAdaptorFrame(StackFrameIterator* iterator) | 581 inline explicit ArgumentsAdaptorFrame(StackFrameIterator* iterator); |
| 588 : JavaScriptFrame(iterator) { } | |
| 589 | 582 |
| 590 virtual int GetNumberOfIncomingArguments() const { | 583 virtual int GetNumberOfIncomingArguments() const; |
| 591 return Smi::cast(GetExpression(0))->value(); | |
| 592 } | |
| 593 | 584 |
| 594 virtual Address GetCallerStackPointer() const; | 585 virtual Address GetCallerStackPointer() const; |
| 595 | 586 |
| 596 private: | 587 private: |
| 597 friend class StackFrameIterator; | 588 friend class StackFrameIterator; |
| 598 }; | 589 }; |
| 599 | 590 |
| 600 | 591 |
| 601 class InternalFrame: public StandardFrame { | 592 class InternalFrame: public StandardFrame { |
| 602 public: | 593 public: |
| 603 virtual Type type() const { return INTERNAL; } | 594 virtual Type type() const { return INTERNAL; } |
| 604 | 595 |
| 605 // Garbage collection support. | 596 // Garbage collection support. |
| 606 virtual void Iterate(ObjectVisitor* v) const; | 597 virtual void Iterate(ObjectVisitor* v) const; |
| 607 | 598 |
| 608 // Determine the code for the frame. | 599 // Determine the code for the frame. |
| 609 virtual Code* unchecked_code() const; | 600 virtual Code* unchecked_code() const; |
| 610 | 601 |
| 611 static InternalFrame* cast(StackFrame* frame) { | 602 static InternalFrame* cast(StackFrame* frame) { |
| 612 ASSERT(frame->is_internal()); | 603 ASSERT(frame->is_internal()); |
| 613 return static_cast<InternalFrame*>(frame); | 604 return static_cast<InternalFrame*>(frame); |
| 614 } | 605 } |
| 615 | 606 |
| 616 protected: | 607 protected: |
| 617 explicit InternalFrame(StackFrameIterator* iterator) | 608 inline explicit InternalFrame(StackFrameIterator* iterator); |
| 618 : StandardFrame(iterator) { } | |
| 619 | 609 |
| 620 virtual Address GetCallerStackPointer() const; | 610 virtual Address GetCallerStackPointer() const; |
| 621 | 611 |
| 622 private: | 612 private: |
| 623 friend class StackFrameIterator; | 613 friend class StackFrameIterator; |
| 624 }; | 614 }; |
| 625 | 615 |
| 626 | 616 |
| 627 // Construct frames are special trampoline frames introduced to handle | 617 // Construct frames are special trampoline frames introduced to handle |
| 628 // function invocations through 'new'. | 618 // function invocations through 'new'. |
| 629 class ConstructFrame: public InternalFrame { | 619 class ConstructFrame: public InternalFrame { |
| 630 public: | 620 public: |
| 631 virtual Type type() const { return CONSTRUCT; } | 621 virtual Type type() const { return CONSTRUCT; } |
| 632 | 622 |
| 633 static ConstructFrame* cast(StackFrame* frame) { | 623 static ConstructFrame* cast(StackFrame* frame) { |
| 634 ASSERT(frame->is_construct()); | 624 ASSERT(frame->is_construct()); |
| 635 return static_cast<ConstructFrame*>(frame); | 625 return static_cast<ConstructFrame*>(frame); |
| 636 } | 626 } |
| 637 | 627 |
| 638 protected: | 628 protected: |
| 639 explicit ConstructFrame(StackFrameIterator* iterator) | 629 inline explicit ConstructFrame(StackFrameIterator* iterator); |
| 640 : InternalFrame(iterator) { } | |
| 641 | 630 |
| 642 private: | 631 private: |
| 643 friend class StackFrameIterator; | 632 friend class StackFrameIterator; |
| 644 }; | 633 }; |
| 645 | 634 |
| 646 | 635 |
| 647 class StackFrameIterator BASE_EMBEDDED { | 636 class StackFrameIterator BASE_EMBEDDED { |
| 648 public: | 637 public: |
| 649 // An iterator that iterates over the current thread's stack, | 638 // An iterator that iterates over the current thread's stack, |
| 650 // and uses current isolate. | 639 // and uses current isolate. |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 711 public: | 700 public: |
| 712 JavaScriptFrameIteratorTemp() { if (!done()) Advance(); } | 701 JavaScriptFrameIteratorTemp() { if (!done()) Advance(); } |
| 713 | 702 |
| 714 inline explicit JavaScriptFrameIteratorTemp(Isolate* isolate); | 703 inline explicit JavaScriptFrameIteratorTemp(Isolate* isolate); |
| 715 | 704 |
| 716 // Skip frames until the frame with the given id is reached. | 705 // Skip frames until the frame with the given id is reached. |
| 717 explicit JavaScriptFrameIteratorTemp(StackFrame::Id id) { AdvanceToId(id); } | 706 explicit JavaScriptFrameIteratorTemp(StackFrame::Id id) { AdvanceToId(id); } |
| 718 | 707 |
| 719 inline JavaScriptFrameIteratorTemp(Isolate* isolate, StackFrame::Id id); | 708 inline JavaScriptFrameIteratorTemp(Isolate* isolate, StackFrame::Id id); |
| 720 | 709 |
| 721 JavaScriptFrameIteratorTemp(Address fp, Address sp, | 710 JavaScriptFrameIteratorTemp(Address fp, |
| 722 Address low_bound, Address high_bound) : | 711 Address sp, |
| 712 Address low_bound, | |
| 713 Address high_bound) : | |
| 723 iterator_(fp, sp, low_bound, high_bound) { | 714 iterator_(fp, sp, low_bound, high_bound) { |
| 724 if (!done()) Advance(); | 715 if (!done()) Advance(); |
| 725 } | 716 } |
| 726 | 717 |
| 727 JavaScriptFrameIteratorTemp(Isolate* isolate, | 718 JavaScriptFrameIteratorTemp(Isolate* isolate, |
| 728 Address fp, Address sp, | 719 Address fp, |
| 729 Address low_bound, Address high_bound) : | 720 Address sp, |
| 721 Address low_bound, | |
| 722 Address high_bound) : | |
| 730 iterator_(isolate, fp, sp, low_bound, high_bound) { | 723 iterator_(isolate, fp, sp, low_bound, high_bound) { |
| 731 if (!done()) Advance(); | 724 if (!done()) Advance(); |
| 732 } | 725 } |
| 733 | 726 |
| 734 inline JavaScriptFrame* frame() const; | 727 inline JavaScriptFrame* frame() const; |
| 735 | 728 |
| 736 bool done() const { return iterator_.done(); } | 729 bool done() const { return iterator_.done(); } |
| 737 void Advance(); | 730 void Advance(); |
| 738 | 731 |
| 739 // Advance to the frame holding the arguments for the current | 732 // Advance to the frame holding the arguments for the current |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 872 }; | 865 }; |
| 873 | 866 |
| 874 | 867 |
| 875 // Reads all frames on the current stack and copies them into the current | 868 // Reads all frames on the current stack and copies them into the current |
| 876 // zone memory. | 869 // zone memory. |
| 877 Vector<StackFrame*> CreateStackMap(); | 870 Vector<StackFrame*> CreateStackMap(); |
| 878 | 871 |
| 879 } } // namespace v8::internal | 872 } } // namespace v8::internal |
| 880 | 873 |
| 881 #endif // V8_FRAMES_H_ | 874 #endif // V8_FRAMES_H_ |
| OLD | NEW |