Commit 5b1ba9a4 authored by yurys@chromium.org's avatar yurys@chromium.org

Don't access PagedSpace::executability after the object has been destroyed

Review URL: http://codereview.chromium.org/3344001

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@5395 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 990992a8
...@@ -303,6 +303,14 @@ void Page::SetIsPageExecutable(bool is_page_executable) { ...@@ -303,6 +303,14 @@ void Page::SetIsPageExecutable(bool is_page_executable) {
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// MemoryAllocator // MemoryAllocator
void MemoryAllocator::ChunkInfo::init(Address a, size_t s, PagedSpace* o) {
address_ = a;
size_ = s;
owner_ = o;
executable_ = (o == NULL) ? NOT_EXECUTABLE : o->executable();
}
bool MemoryAllocator::IsValidChunk(int chunk_id) { bool MemoryAllocator::IsValidChunk(int chunk_id) {
if (!IsValidChunkId(chunk_id)) return false; if (!IsValidChunkId(chunk_id)) return false;
......
...@@ -616,7 +616,7 @@ void MemoryAllocator::DeleteChunk(int chunk_id) { ...@@ -616,7 +616,7 @@ void MemoryAllocator::DeleteChunk(int chunk_id) {
Counters::memory_allocated.Decrement(static_cast<int>(c.size())); Counters::memory_allocated.Decrement(static_cast<int>(c.size()));
} else { } else {
LOG(DeleteEvent("PagedChunk", c.address())); LOG(DeleteEvent("PagedChunk", c.address()));
FreeRawMemory(c.address(), c.size(), c.owner()->executable()); FreeRawMemory(c.address(), c.size(), c.executable());
} }
c.init(NULL, 0, NULL); c.init(NULL, 0, NULL);
Push(chunk_id); Push(chunk_id);
......
...@@ -649,20 +649,23 @@ class MemoryAllocator : public AllStatic { ...@@ -649,20 +649,23 @@ class MemoryAllocator : public AllStatic {
// Allocated chunk info: chunk start address, chunk size, and owning space. // Allocated chunk info: chunk start address, chunk size, and owning space.
class ChunkInfo BASE_EMBEDDED { class ChunkInfo BASE_EMBEDDED {
public: public:
ChunkInfo() : address_(NULL), size_(0), owner_(NULL) {} ChunkInfo() : address_(NULL),
void init(Address a, size_t s, PagedSpace* o) { size_(0),
address_ = a; owner_(NULL),
size_ = s; executable_(NOT_EXECUTABLE) {}
owner_ = o; inline void init(Address a, size_t s, PagedSpace* o);
}
Address address() { return address_; } Address address() { return address_; }
size_t size() { return size_; } size_t size() { return size_; }
PagedSpace* owner() { return owner_; } PagedSpace* owner() { return owner_; }
// We save executability of the owner to allow using it
// when collecting stats after the owner has been destroyed.
Executability executable() const { return executable_; }
private: private:
Address address_; Address address_;
size_t size_; size_t size_;
PagedSpace* owner_; PagedSpace* owner_;
Executability executable_;
}; };
// Chunks_, free_chunk_ids_ and top_ act as a stack of free chunk ids. // Chunks_, free_chunk_ids_ and top_ act as a stack of free chunk ids.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment