Breakpad processor: Make PostfixEvaluator treat the MemoryRegion as const.
In order to be able to treat any MemoryRegion as const, the accessor functions need to be declared this-const, which means annotations on all the subclasses, etc. etc. Since MinidumpMemoryRegion fills its memory_ member on demand, that member needs to be marked 'mutable', but this is exactly the sort of situation the 'mutable' keyword was intended for, so that seems all right. a=jimblandy, r=nealsid git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@509 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
parent
e87521a989
commit
2214cb9bc1
5 changed files with 35 additions and 35 deletions
|
@ -1,4 +1,4 @@
|
||||||
// Copyright (c) 2006, Google Inc.
|
// Copyright (c) 2010, Google Inc.
|
||||||
// All rights reserved.
|
// All rights reserved.
|
||||||
//
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -50,10 +50,10 @@ class MemoryRegion {
|
||||||
virtual ~MemoryRegion() {}
|
virtual ~MemoryRegion() {}
|
||||||
|
|
||||||
// The base address of this memory region.
|
// The base address of this memory region.
|
||||||
virtual u_int64_t GetBase() = 0;
|
virtual u_int64_t GetBase() const = 0;
|
||||||
|
|
||||||
// The size of this memory region.
|
// The size of this memory region.
|
||||||
virtual u_int32_t GetSize() = 0;
|
virtual u_int32_t GetSize() const = 0;
|
||||||
|
|
||||||
// Access to data of various sizes within the memory region. address
|
// Access to data of various sizes within the memory region. address
|
||||||
// is a pointer to read, and it must lie within the memory region as
|
// is a pointer to read, and it must lie within the memory region as
|
||||||
|
@ -63,10 +63,10 @@ class MemoryRegion {
|
||||||
// program. Returns true on success. Fails and returns false if address
|
// program. Returns true on success. Fails and returns false if address
|
||||||
// is out of the region's bounds (after considering the width of value),
|
// is out of the region's bounds (after considering the width of value),
|
||||||
// or for other types of errors.
|
// or for other types of errors.
|
||||||
virtual bool GetMemoryAtAddress(u_int64_t address, u_int8_t* value) = 0;
|
virtual bool GetMemoryAtAddress(u_int64_t address, u_int8_t* value) const =0;
|
||||||
virtual bool GetMemoryAtAddress(u_int64_t address, u_int16_t* value) = 0;
|
virtual bool GetMemoryAtAddress(u_int64_t address, u_int16_t* value) const =0;
|
||||||
virtual bool GetMemoryAtAddress(u_int64_t address, u_int32_t* value) = 0;
|
virtual bool GetMemoryAtAddress(u_int64_t address, u_int32_t* value) const =0;
|
||||||
virtual bool GetMemoryAtAddress(u_int64_t address, u_int64_t* value) = 0;
|
virtual bool GetMemoryAtAddress(u_int64_t address, u_int64_t* value) const =0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright (c) 2006, Google Inc.
|
// Copyright (c) 2010, Google Inc.
|
||||||
// All rights reserved.
|
// All rights reserved.
|
||||||
//
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -242,22 +242,22 @@ class MinidumpMemoryRegion : public MinidumpObject,
|
||||||
// Returns a pointer to the base of the memory region. Returns the
|
// Returns a pointer to the base of the memory region. Returns the
|
||||||
// cached value if available, otherwise, reads the minidump file and
|
// cached value if available, otherwise, reads the minidump file and
|
||||||
// caches the memory region.
|
// caches the memory region.
|
||||||
const u_int8_t* GetMemory();
|
const u_int8_t* GetMemory() const;
|
||||||
|
|
||||||
// The address of the base of the memory region.
|
// The address of the base of the memory region.
|
||||||
u_int64_t GetBase();
|
u_int64_t GetBase() const;
|
||||||
|
|
||||||
// The size, in bytes, of the memory region.
|
// The size, in bytes, of the memory region.
|
||||||
u_int32_t GetSize();
|
u_int32_t GetSize() const;
|
||||||
|
|
||||||
// Frees the cached memory region, if cached.
|
// Frees the cached memory region, if cached.
|
||||||
void FreeMemory();
|
void FreeMemory();
|
||||||
|
|
||||||
// Obtains the value of memory at the pointer specified by address.
|
// Obtains the value of memory at the pointer specified by address.
|
||||||
bool GetMemoryAtAddress(u_int64_t address, u_int8_t* value);
|
bool GetMemoryAtAddress(u_int64_t address, u_int8_t* value) const;
|
||||||
bool GetMemoryAtAddress(u_int64_t address, u_int16_t* value);
|
bool GetMemoryAtAddress(u_int64_t address, u_int16_t* value) const;
|
||||||
bool GetMemoryAtAddress(u_int64_t address, u_int32_t* value);
|
bool GetMemoryAtAddress(u_int64_t address, u_int32_t* value) const;
|
||||||
bool GetMemoryAtAddress(u_int64_t address, u_int64_t* value);
|
bool GetMemoryAtAddress(u_int64_t address, u_int64_t* value) const;
|
||||||
|
|
||||||
// Print a human-readable representation of the object to stdout.
|
// Print a human-readable representation of the object to stdout.
|
||||||
void Print();
|
void Print();
|
||||||
|
@ -274,7 +274,7 @@ class MinidumpMemoryRegion : public MinidumpObject,
|
||||||
|
|
||||||
// Implementation for GetMemoryAtAddress
|
// Implementation for GetMemoryAtAddress
|
||||||
template<typename T> bool GetMemoryAtAddressInternal(u_int64_t address,
|
template<typename T> bool GetMemoryAtAddressInternal(u_int64_t address,
|
||||||
T* value);
|
T* value) const;
|
||||||
|
|
||||||
// The largest memory region that will be read from a minidump. The
|
// The largest memory region that will be read from a minidump. The
|
||||||
// default is 1MB.
|
// default is 1MB.
|
||||||
|
@ -285,7 +285,7 @@ class MinidumpMemoryRegion : public MinidumpObject,
|
||||||
MDMemoryDescriptor* descriptor_;
|
MDMemoryDescriptor* descriptor_;
|
||||||
|
|
||||||
// Cached memory.
|
// Cached memory.
|
||||||
vector<u_int8_t>* memory_;
|
mutable vector<u_int8_t>* memory_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1106,7 +1106,7 @@ void MinidumpMemoryRegion::SetDescriptor(MDMemoryDescriptor* descriptor) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const u_int8_t* MinidumpMemoryRegion::GetMemory() {
|
const u_int8_t* MinidumpMemoryRegion::GetMemory() const {
|
||||||
if (!valid_) {
|
if (!valid_) {
|
||||||
BPLOG(ERROR) << "Invalid MinidumpMemoryRegion for GetMemory";
|
BPLOG(ERROR) << "Invalid MinidumpMemoryRegion for GetMemory";
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1145,7 +1145,7 @@ const u_int8_t* MinidumpMemoryRegion::GetMemory() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
u_int64_t MinidumpMemoryRegion::GetBase() {
|
u_int64_t MinidumpMemoryRegion::GetBase() const {
|
||||||
if (!valid_) {
|
if (!valid_) {
|
||||||
BPLOG(ERROR) << "Invalid MinidumpMemoryRegion for GetBase";
|
BPLOG(ERROR) << "Invalid MinidumpMemoryRegion for GetBase";
|
||||||
return static_cast<u_int64_t>(-1);
|
return static_cast<u_int64_t>(-1);
|
||||||
|
@ -1155,7 +1155,7 @@ u_int64_t MinidumpMemoryRegion::GetBase() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
u_int32_t MinidumpMemoryRegion::GetSize() {
|
u_int32_t MinidumpMemoryRegion::GetSize() const {
|
||||||
if (!valid_) {
|
if (!valid_) {
|
||||||
BPLOG(ERROR) << "Invalid MinidumpMemoryRegion for GetSize";
|
BPLOG(ERROR) << "Invalid MinidumpMemoryRegion for GetSize";
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1173,7 +1173,7 @@ void MinidumpMemoryRegion::FreeMemory() {
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
bool MinidumpMemoryRegion::GetMemoryAtAddressInternal(u_int64_t address,
|
bool MinidumpMemoryRegion::GetMemoryAtAddressInternal(u_int64_t address,
|
||||||
T* value) {
|
T* value) const {
|
||||||
BPLOG_IF(ERROR, !value) << "MinidumpMemoryRegion::GetMemoryAtAddressInternal "
|
BPLOG_IF(ERROR, !value) << "MinidumpMemoryRegion::GetMemoryAtAddressInternal "
|
||||||
"requires |value|";
|
"requires |value|";
|
||||||
assert(value);
|
assert(value);
|
||||||
|
@ -1215,25 +1215,25 @@ bool MinidumpMemoryRegion::GetMemoryAtAddressInternal(u_int64_t address,
|
||||||
|
|
||||||
|
|
||||||
bool MinidumpMemoryRegion::GetMemoryAtAddress(u_int64_t address,
|
bool MinidumpMemoryRegion::GetMemoryAtAddress(u_int64_t address,
|
||||||
u_int8_t* value) {
|
u_int8_t* value) const {
|
||||||
return GetMemoryAtAddressInternal(address, value);
|
return GetMemoryAtAddressInternal(address, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool MinidumpMemoryRegion::GetMemoryAtAddress(u_int64_t address,
|
bool MinidumpMemoryRegion::GetMemoryAtAddress(u_int64_t address,
|
||||||
u_int16_t* value) {
|
u_int16_t* value) const {
|
||||||
return GetMemoryAtAddressInternal(address, value);
|
return GetMemoryAtAddressInternal(address, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool MinidumpMemoryRegion::GetMemoryAtAddress(u_int64_t address,
|
bool MinidumpMemoryRegion::GetMemoryAtAddress(u_int64_t address,
|
||||||
u_int32_t* value) {
|
u_int32_t* value) const {
|
||||||
return GetMemoryAtAddressInternal(address, value);
|
return GetMemoryAtAddressInternal(address, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool MinidumpMemoryRegion::GetMemoryAtAddress(u_int64_t address,
|
bool MinidumpMemoryRegion::GetMemoryAtAddress(u_int64_t address,
|
||||||
u_int64_t* value) {
|
u_int64_t* value) const {
|
||||||
return GetMemoryAtAddressInternal(address, value);
|
return GetMemoryAtAddressInternal(address, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright (c) 2006, Google Inc.
|
// Copyright (c) 2010, Google Inc.
|
||||||
// All rights reserved.
|
// All rights reserved.
|
||||||
//
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -90,7 +90,7 @@ class PostfixEvaluator {
|
||||||
// (^) will not be supported. |dictionary| may be NULL, but evaluation
|
// (^) will not be supported. |dictionary| may be NULL, but evaluation
|
||||||
// will fail in that case unless set_dictionary is used before calling
|
// will fail in that case unless set_dictionary is used before calling
|
||||||
// Evaluate.
|
// Evaluate.
|
||||||
PostfixEvaluator(DictionaryType *dictionary, MemoryRegion *memory)
|
PostfixEvaluator(DictionaryType *dictionary, const MemoryRegion *memory)
|
||||||
: dictionary_(dictionary), memory_(memory), stack_() {}
|
: dictionary_(dictionary), memory_(memory), stack_() {}
|
||||||
|
|
||||||
// Evaluate the expression. The results of execution will be stored
|
// Evaluate the expression. The results of execution will be stored
|
||||||
|
@ -144,7 +144,7 @@ class PostfixEvaluator {
|
||||||
|
|
||||||
// If non-NULL, the MemoryRegion used for dereference (^) operations.
|
// If non-NULL, the MemoryRegion used for dereference (^) operations.
|
||||||
// If NULL, dereferencing is unsupported and will fail. Weak pointer.
|
// If NULL, dereferencing is unsupported and will fail. Weak pointer.
|
||||||
MemoryRegion *memory_;
|
const MemoryRegion *memory_;
|
||||||
|
|
||||||
// The stack contains state information as execution progresses. Values
|
// The stack contains state information as execution progresses. Values
|
||||||
// are pushed on to it as the expression string is read and as operations
|
// are pushed on to it as the expression string is read and as operations
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright (c) 2006, Google Inc.
|
// Copyright (c) 2010, Google Inc.
|
||||||
// All rights reserved.
|
// All rights reserved.
|
||||||
//
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -56,21 +56,21 @@ using google_breakpad::PostfixEvaluator;
|
||||||
// the value.
|
// the value.
|
||||||
class FakeMemoryRegion : public MemoryRegion {
|
class FakeMemoryRegion : public MemoryRegion {
|
||||||
public:
|
public:
|
||||||
virtual u_int64_t GetBase() { return 0; }
|
virtual u_int64_t GetBase() const { return 0; }
|
||||||
virtual u_int32_t GetSize() { return 0; }
|
virtual u_int32_t GetSize() const { return 0; }
|
||||||
virtual bool GetMemoryAtAddress(u_int64_t address, u_int8_t *value) {
|
virtual bool GetMemoryAtAddress(u_int64_t address, u_int8_t *value) const {
|
||||||
*value = address + 1;
|
*value = address + 1;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
virtual bool GetMemoryAtAddress(u_int64_t address, u_int16_t *value) {
|
virtual bool GetMemoryAtAddress(u_int64_t address, u_int16_t *value) const {
|
||||||
*value = address + 1;
|
*value = address + 1;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
virtual bool GetMemoryAtAddress(u_int64_t address, u_int32_t *value) {
|
virtual bool GetMemoryAtAddress(u_int64_t address, u_int32_t *value) const {
|
||||||
*value = address + 1;
|
*value = address + 1;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
virtual bool GetMemoryAtAddress(u_int64_t address, u_int64_t *value) {
|
virtual bool GetMemoryAtAddress(u_int64_t address, u_int64_t *value) const {
|
||||||
*value = address + 1;
|
*value = address + 1;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue