| Index: src/frames.h
|
| diff --git a/src/frames.h b/src/frames.h
|
| index 3294eeee26eb08d371d54de249d352f81b90f018..092fd422a4b49c85d9a4e7dda05a4425f7f55bfc 100644
|
| --- a/src/frames.h
|
| +++ b/src/frames.h
|
| @@ -158,10 +158,14 @@ class StackFrame BASE_EMBEDDED {
|
| Address* pc_address;
|
| };
|
|
|
| - // Copy constructor; it breaks the connection to host iterator.
|
| + // Copy constructor; it breaks the connection to host iterator
|
| + // (as an iterator usually lives on stack). But as we need
|
| + // a pointer to isolate, we store it in place of the iterator ptr,
|
| + // and tag accordingly.
|
| StackFrame(const StackFrame& original) {
|
| this->state_ = original.state_;
|
| - this->iterator_ = NULL;
|
| + this->tagged_isolate_ptr_ =
|
| + reinterpret_cast<intptr_t>(original.isolate()) | kIsolateTag;
|
| }
|
|
|
| // Type testers.
|
| @@ -205,8 +209,8 @@ class StackFrame BASE_EMBEDDED {
|
| virtual Code* unchecked_code() const = 0;
|
|
|
| // Get the code associated with this frame.
|
| - Code* LookupCode(Isolate* isolate) const {
|
| - return GetContainingCode(isolate, pc());
|
| + Code* LookupCode() const {
|
| + return GetContainingCode(isolate(), pc());
|
| }
|
|
|
| // Get the code object that contains the given pc.
|
| @@ -215,7 +219,8 @@ class StackFrame BASE_EMBEDDED {
|
| // Get the code object containing the given pc and fill in the
|
| // safepoint entry and the number of stack slots. The pc must be at
|
| // a safepoint.
|
| - static Code* GetSafepointData(Address pc,
|
| + static Code* GetSafepointData(Isolate* isolate,
|
| + Address pc,
|
| SafepointEntry* safepoint_entry,
|
| unsigned* stack_slots);
|
|
|
| @@ -233,6 +238,8 @@ class StackFrame BASE_EMBEDDED {
|
| explicit StackFrame(StackFrameIterator* iterator) : iterator_(iterator) { }
|
| virtual ~StackFrame() { }
|
|
|
| + inline Isolate* isolate() const;
|
| +
|
| // Compute the stack pointer for the calling frame.
|
| virtual Address GetCallerStackPointer() const = 0;
|
|
|
| @@ -245,10 +252,13 @@ class StackFrame BASE_EMBEDDED {
|
| inline StackHandler* top_handler() const;
|
|
|
| // Compute the stack frame type for the given state.
|
| - static Type ComputeType(State* state);
|
| + static Type ComputeType(Isolate* isolate, State* state);
|
|
|
| private:
|
| - const StackFrameIterator* iterator_;
|
| + union {
|
| + const StackFrameIterator* iterator_;
|
| + intptr_t tagged_isolate_ptr_;
|
| + };
|
| State state_;
|
|
|
| // Fill in the state of the calling frame.
|
| @@ -257,6 +267,8 @@ class StackFrame BASE_EMBEDDED {
|
| // Get the type and the state of the calling frame.
|
| virtual Type GetCallerState(State* state) const;
|
|
|
| + static const intptr_t kIsolateTag = 1;
|
| +
|
| friend class StackFrameIterator;
|
| friend class StackHandlerIterator;
|
| friend class SafeStackFrameIterator;
|
| @@ -609,11 +621,15 @@ class ConstructFrame: public InternalFrame {
|
|
|
| class StackFrameIterator BASE_EMBEDDED {
|
| public:
|
| - // An iterator that iterates over the current thread's stack.
|
| + // An iterator that iterates over the current thread's stack,
|
| + // and uses current isolate.
|
| StackFrameIterator();
|
|
|
| + // An iterator that iterates over the isolate's current thread's stack,
|
| + explicit StackFrameIterator(Isolate* isolate);
|
| +
|
| // An iterator that iterates over a given thread's stack.
|
| - explicit StackFrameIterator(ThreadLocalTop* thread);
|
| + StackFrameIterator(Isolate* isolate, ThreadLocalTop* t);
|
|
|
| // An iterator that can start from a given FP address.
|
| // If use_top, then work as usual, if fp isn't NULL, use it,
|
| @@ -625,6 +641,8 @@ class StackFrameIterator BASE_EMBEDDED {
|
| return frame_;
|
| }
|
|
|
| + Isolate* isolate() const { return isolate_; }
|
| +
|
| bool done() const { return frame_ == NULL; }
|
| void Advance() { (this->*advance_)(); }
|
|
|
| @@ -637,6 +655,7 @@ class StackFrameIterator BASE_EMBEDDED {
|
| #undef DECLARE_SINGLETON
|
| StackFrame* frame_;
|
| StackHandler* handler_;
|
| + Isolate* isolate_;
|
| ThreadLocalTop* thread_;
|
| Address fp_;
|
| Address sp_;
|
| @@ -667,13 +686,12 @@ class JavaScriptFrameIteratorTemp BASE_EMBEDDED {
|
| public:
|
| JavaScriptFrameIteratorTemp() { if (!done()) Advance(); }
|
|
|
| - explicit JavaScriptFrameIteratorTemp(ThreadLocalTop* thread) :
|
| - iterator_(thread) {
|
| - if (!done()) Advance();
|
| - }
|
| + inline explicit JavaScriptFrameIteratorTemp(Isolate* isolate);
|
|
|
| // Skip frames until the frame with the given id is reached.
|
| - explicit JavaScriptFrameIteratorTemp(StackFrame::Id id);
|
| + explicit JavaScriptFrameIteratorTemp(StackFrame::Id id) { AdvanceToId(id); }
|
| +
|
| + inline JavaScriptFrameIteratorTemp(Isolate* isolate, StackFrame::Id id);
|
|
|
| JavaScriptFrameIteratorTemp(Address fp, Address sp,
|
| Address low_bound, Address high_bound) :
|
| @@ -702,6 +720,8 @@ class JavaScriptFrameIteratorTemp BASE_EMBEDDED {
|
| void Reset();
|
|
|
| private:
|
| + inline void AdvanceToId(StackFrame::Id id);
|
| +
|
| Iterator iterator_;
|
| };
|
|
|
| @@ -716,6 +736,7 @@ typedef JavaScriptFrameIteratorTemp<StackFrameIterator> JavaScriptFrameIterator;
|
| class StackTraceFrameIterator: public JavaScriptFrameIterator {
|
| public:
|
| StackTraceFrameIterator();
|
| + explicit StackTraceFrameIterator(Isolate* isolate);
|
| void Advance();
|
|
|
| private:
|
| @@ -739,7 +760,7 @@ class SafeStackFrameIterator BASE_EMBEDDED {
|
| void Advance();
|
| void Reset();
|
|
|
| - static bool is_active() { return active_count_ > 0; }
|
| + static bool is_active(Isolate* isolate);
|
|
|
| static bool IsWithinBounds(
|
| Address low_bound, Address high_bound, Address addr) {
|
| @@ -786,13 +807,13 @@ class SafeStackFrameIterator BASE_EMBEDDED {
|
| // heap objects.
|
| class ActiveCountMaintainer BASE_EMBEDDED {
|
| public:
|
| - ActiveCountMaintainer() { active_count_++; }
|
| - ~ActiveCountMaintainer() { active_count_--; }
|
| + explicit ActiveCountMaintainer(Isolate* isolate);
|
| + ~ActiveCountMaintainer();
|
| + private:
|
| + Isolate* isolate_;
|
| };
|
|
|
| ActiveCountMaintainer maintainer_;
|
| - // TODO(isolates): this is dangerous.
|
| - static int active_count_;
|
| StackAddressValidator stack_validator_;
|
| const bool is_valid_top_;
|
| const bool is_valid_fp_;
|
|
|