Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(97)

Side by Side Diff: src/frames.h

Issue 7223: Introduce a special kind of frames for construct frames, e.g.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 12 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/builtins-ia32.cc ('k') | src/frames.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 }; 91 };
92 92
93 93
94 #define STACK_FRAME_TYPE_LIST(V) \ 94 #define STACK_FRAME_TYPE_LIST(V) \
95 V(ENTRY, EntryFrame) \ 95 V(ENTRY, EntryFrame) \
96 V(ENTRY_CONSTRUCT, EntryConstructFrame) \ 96 V(ENTRY_CONSTRUCT, EntryConstructFrame) \
97 V(EXIT, ExitFrame) \ 97 V(EXIT, ExitFrame) \
98 V(EXIT_DEBUG, ExitDebugFrame) \ 98 V(EXIT_DEBUG, ExitDebugFrame) \
99 V(JAVA_SCRIPT, JavaScriptFrame) \ 99 V(JAVA_SCRIPT, JavaScriptFrame) \
100 V(INTERNAL, InternalFrame) \ 100 V(INTERNAL, InternalFrame) \
101 V(CONSTRUCT, ConstructFrame) \
101 V(ARGUMENTS_ADAPTOR, ArgumentsAdaptorFrame) 102 V(ARGUMENTS_ADAPTOR, ArgumentsAdaptorFrame)
102 103
103 104
104 // Abstract base class for all stack frames. 105 // Abstract base class for all stack frames.
105 class StackFrame BASE_EMBEDDED { 106 class StackFrame BASE_EMBEDDED {
106 public: 107 public:
107 #define DECLARE_TYPE(type, ignore) type, 108 #define DECLARE_TYPE(type, ignore) type,
108 enum Type { 109 enum Type {
109 NONE = 0, 110 NONE = 0,
110 STACK_FRAME_TYPE_LIST(DECLARE_TYPE) 111 STACK_FRAME_TYPE_LIST(DECLARE_TYPE)
111 NUMBER_OF_TYPES 112 NUMBER_OF_TYPES
112 }; 113 };
113 #undef DECLARE_TYPE 114 #undef DECLARE_TYPE
114 115
115 // Opaque data type for identifying stack frames. Used extensively 116 // Opaque data type for identifying stack frames. Used extensively
116 // by the debugger. 117 // by the debugger.
117 enum Id { NO_ID = 0 }; 118 enum Id { NO_ID = 0 };
118 119
119 // Type testers. 120 // Type testers.
120 bool is_entry() const { return type() == ENTRY; } 121 bool is_entry() const { return type() == ENTRY; }
121 bool is_entry_construct() const { return type() == ENTRY_CONSTRUCT; } 122 bool is_entry_construct() const { return type() == ENTRY_CONSTRUCT; }
122 bool is_exit() const { return type() == EXIT; } 123 bool is_exit() const { return type() == EXIT; }
123 bool is_exit_debug() const { return type() == EXIT_DEBUG; } 124 bool is_exit_debug() const { return type() == EXIT_DEBUG; }
124 bool is_java_script() const { return type() == JAVA_SCRIPT; } 125 bool is_java_script() const { return type() == JAVA_SCRIPT; }
125 bool is_arguments_adaptor() const { return type() == ARGUMENTS_ADAPTOR; } 126 bool is_arguments_adaptor() const { return type() == ARGUMENTS_ADAPTOR; }
126 bool is_internal() const { return type() == INTERNAL; } 127 bool is_internal() const { return type() == INTERNAL; }
128 bool is_construct() const { return type() == CONSTRUCT; }
127 virtual bool is_standard() const { return false; } 129 virtual bool is_standard() const { return false; }
128 130
129 // Accessors. 131 // Accessors.
130 Address sp() const { return state_.sp; } 132 Address sp() const { return state_.sp; }
131 Address fp() const { return state_.fp; } 133 Address fp() const { return state_.fp; }
132 Address pp() const { return GetCallerStackPointer(); } 134 Address pp() const { return GetCallerStackPointer(); }
133 135
134 Address pc() const { return *pc_address(); } 136 Address pc() const { return *pc_address(); }
135 void set_pc(Address pc) { *pc_address() = pc; } 137 void set_pc(Address pc) { *pc_address() = pc; }
136 138
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 Address GetExpressionAddress(int n) const; 347 Address GetExpressionAddress(int n) const;
346 348
347 // Determines if the n'th expression stack element is in a stack 349 // Determines if the n'th expression stack element is in a stack
348 // handler or not. Requires traversing all handlers in this frame. 350 // handler or not. Requires traversing all handlers in this frame.
349 bool IsExpressionInsideHandler(int n) const; 351 bool IsExpressionInsideHandler(int n) const;
350 352
351 // Determines if the standard frame for the given frame pointer is 353 // Determines if the standard frame for the given frame pointer is
352 // an arguments adaptor frame. 354 // an arguments adaptor frame.
353 static inline bool IsArgumentsAdaptorFrame(Address fp); 355 static inline bool IsArgumentsAdaptorFrame(Address fp);
354 356
355 // Determines if the standard frame for the given program counter is 357 // Determines if the standard frame for the given frame pointer is a
356 // a construct trampoline. 358 // construct frame.
357 static inline bool IsConstructTrampolineFrame(Address pc); 359 static inline bool IsConstructFrame(Address fp);
358 360
359 private: 361 private:
360 friend class StackFrame; 362 friend class StackFrame;
361 }; 363 };
362 364
363 365
364 class JavaScriptFrame: public StandardFrame { 366 class JavaScriptFrame: public StandardFrame {
365 public: 367 public:
366 virtual Type type() const { return JAVA_SCRIPT; } 368 virtual Type type() const { return JAVA_SCRIPT; }
367 369
368 // Accessors. 370 // Accessors.
369 inline Object* function() const; 371 inline Object* function() const;
370 inline Object* receiver() const; 372 inline Object* receiver() const;
371 inline void set_receiver(Object* value); 373 inline void set_receiver(Object* value);
372 374
373 // Access the parameters. 375 // Access the parameters.
374 Object* GetParameter(int index) const; 376 Object* GetParameter(int index) const;
375 int ComputeParametersCount() const; 377 int ComputeParametersCount() const;
376 378
377 // Temporary way of getting access to the number of parameters 379 // Temporary way of getting access to the number of parameters
378 // passed on the stack by the caller. Once argument adaptor frames 380 // passed on the stack by the caller. Once argument adaptor frames
379 // has been introduced on ARM, this number will always match the 381 // has been introduced on ARM, this number will always match the
380 // computed parameters count. 382 // computed parameters count.
381 int GetProvidedParametersCount() const; 383 int GetProvidedParametersCount() const;
382 384
383 // Check if this frame is a constructor frame invoked through 385 // Check if this frame is a constructor frame invoked through 'new'.
384 // 'new'. The operation may involve digging through a few stack
385 // frames to account for arguments adaptors.
386 bool IsConstructor() const; 386 bool IsConstructor() const;
387 387
388 // Check if this frame has "adapted" arguments in the sense that the 388 // Check if this frame has "adapted" arguments in the sense that the
389 // actual passed arguments are available in an arguments adaptor 389 // actual passed arguments are available in an arguments adaptor
390 // frame below it on the stack. 390 // frame below it on the stack.
391 inline bool has_adapted_arguments() const; 391 inline bool has_adapted_arguments() const;
392 392
393 // Garbage colletion support. 393 // Garbage colletion support.
394 virtual void Iterate(ObjectVisitor* v) const; 394 virtual void Iterate(ObjectVisitor* v) const;
395 395
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
452 452
453 private: 453 private:
454 friend class StackFrameIterator; 454 friend class StackFrameIterator;
455 }; 455 };
456 456
457 457
458 class InternalFrame: public StandardFrame { 458 class InternalFrame: public StandardFrame {
459 public: 459 public:
460 virtual Type type() const { return INTERNAL; } 460 virtual Type type() const { return INTERNAL; }
461 461
462 // Returns if this frame is a special trampoline frame introduced by
463 // the construct trampoline. NOTE: We should consider introducing a
464 // special stack frame type for this.
465 inline bool is_construct_trampoline() const;
466
467 // Garbage colletion support. 462 // Garbage colletion support.
468 virtual void Iterate(ObjectVisitor* v) const; 463 virtual void Iterate(ObjectVisitor* v) const;
469 464
470 // Determine the code for the frame. 465 // Determine the code for the frame.
471 virtual Code* FindCode() const; 466 virtual Code* FindCode() const;
472 467
473 static InternalFrame* cast(StackFrame* frame) { 468 static InternalFrame* cast(StackFrame* frame) {
474 ASSERT(frame->is_internal()); 469 ASSERT(frame->is_internal());
475 return static_cast<InternalFrame*>(frame); 470 return static_cast<InternalFrame*>(frame);
476 } 471 }
477 472
478 protected: 473 protected:
479 explicit InternalFrame(StackFrameIterator* iterator) 474 explicit InternalFrame(StackFrameIterator* iterator)
480 : StandardFrame(iterator) { } 475 : StandardFrame(iterator) { }
481 476
482 virtual Address GetCallerStackPointer() const; 477 virtual Address GetCallerStackPointer() const;
483 478
484 private: 479 private:
485 friend class StackFrameIterator; 480 friend class StackFrameIterator;
486 }; 481 };
487 482
488 483
484 // Construct frames are special trampoline frames introduced to handle
485 // function invocations through 'new'.
486 class ConstructFrame: public InternalFrame {
487 public:
488 virtual Type type() const { return CONSTRUCT; }
489
490 static ConstructFrame* cast(StackFrame* frame) {
491 ASSERT(frame->is_construct());
492 return static_cast<ConstructFrame*>(frame);
493 }
494
495 protected:
496 explicit ConstructFrame(StackFrameIterator* iterator)
497 : InternalFrame(iterator) { }
498
499 private:
500 friend class StackFrameIterator;
501 };
502
503
489 class StackFrameIterator BASE_EMBEDDED { 504 class StackFrameIterator BASE_EMBEDDED {
490 public: 505 public:
491 // An iterator that iterates over the current thread's stack. 506 // An iterator that iterates over the current thread's stack.
492 StackFrameIterator(); 507 StackFrameIterator();
493 508
494 // An iterator that iterates over a given thread's stack. 509 // An iterator that iterates over a given thread's stack.
495 explicit StackFrameIterator(ThreadLocalTop* thread); 510 explicit StackFrameIterator(ThreadLocalTop* thread);
496 511
497 StackFrame* frame() const { 512 StackFrame* frame() const {
498 ASSERT(!done()); 513 ASSERT(!done());
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 JavaScriptFrame* FindJavaScriptFrame(int n); 578 JavaScriptFrame* FindJavaScriptFrame(int n);
564 579
565 private: 580 private:
566 StackFrameIterator iterator_; 581 StackFrameIterator iterator_;
567 }; 582 };
568 583
569 584
570 } } // namespace v8::internal 585 } } // namespace v8::internal
571 586
572 #endif // V8_FRAMES_H_ 587 #endif // V8_FRAMES_H_
OLDNEW
« no previous file with comments | « src/builtins-ia32.cc ('k') | src/frames.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698