summaryrefslogtreecommitdiffstats
path: root/runtime/mapping_table.h
diff options
context:
space:
mode:
authorIan Rogers <irogers@google.com>2013-11-14 14:51:11 -0800
committerIan Rogers <irogers@google.com>2013-11-14 14:51:11 -0800
commit159aa95e1e23cd585ac305b44b4cd65ae72048a4 (patch)
tree1c12d118b5d54578749a7ae02c7babd29585ca08 /runtime/mapping_table.h
parentdfe78a6e6b526d482298100a1f6392a8c7105522 (diff)
downloadart-159aa95e1e23cd585ac305b44b4cd65ae72048a4.zip
art-159aa95e1e23cd585ac305b44b4cd65ae72048a4.tar.gz
art-159aa95e1e23cd585ac305b44b4cd65ae72048a4.tar.bz2
Make exceptions use of LEB decoder valgrind clean.
Bug: 11670287 Change-Id: I0c11c710d03e08559e0032bf602cf7cf13c92da9
Diffstat (limited to 'runtime/mapping_table.h')
-rw-r--r--runtime/mapping_table.h34
1 files changed, 18 insertions, 16 deletions
diff --git a/runtime/mapping_table.h b/runtime/mapping_table.h
index 9955f30..c468c1e 100644
--- a/runtime/mapping_table.h
+++ b/runtime/mapping_table.h
@@ -30,7 +30,7 @@ class MappingTable {
uint32_t TotalSize() const PURE {
const uint8_t* table = encoded_table_;
- if (table == NULL) {
+ if (table == nullptr) {
return 0;
} else {
return DecodeUnsignedLeb128(&table);
@@ -39,7 +39,7 @@ class MappingTable {
uint32_t DexToPcSize() const PURE {
const uint8_t* table = encoded_table_;
- if (table == NULL) {
+ if (table == nullptr) {
return 0;
} else {
uint32_t total_size = DecodeUnsignedLeb128(&table);
@@ -50,9 +50,11 @@ class MappingTable {
const uint8_t* FirstDexToPcPtr() const {
const uint8_t* table = encoded_table_;
- if (table != NULL) {
- DecodeUnsignedLeb128(&table); // Total_size, unused.
+ if (table != nullptr) {
+ uint32_t total_size = DecodeUnsignedLeb128(&table);
uint32_t pc_to_dex_size = DecodeUnsignedLeb128(&table);
+ // We must have dex to pc entries or else the loop will go beyond the end of the table.
+ DCHECK_GT(total_size, pc_to_dex_size);
for (uint32_t i = 0; i < pc_to_dex_size; ++i) {
DecodeUnsignedLeb128(&table); // Move ptr past native PC.
DecodeUnsignedLeb128(&table); // Move ptr past dex PC.
@@ -64,15 +66,15 @@ class MappingTable {
class DexToPcIterator {
public:
DexToPcIterator(const MappingTable* table, uint32_t element) :
- table_(table), element_(element), end_(table_->DexToPcSize()), encoded_table_ptr_(NULL),
+ table_(table), element_(element), end_(table_->DexToPcSize()), encoded_table_ptr_(nullptr),
native_pc_offset_(0), dex_pc_(0) {
- if (element == 0) {
- encoded_table_ptr_ = table_->FirstDexToPcPtr();
+ if (element == 0) { // An iterator wanted from the start.
if (end_ > 0) {
+ encoded_table_ptr_ = table_->FirstDexToPcPtr();
native_pc_offset_ = DecodeUnsignedLeb128(&encoded_table_ptr_);
dex_pc_ = DecodeUnsignedLeb128(&encoded_table_ptr_);
}
- } else {
+ } else { // An iterator wanted from the end.
DCHECK_EQ(table_->DexToPcSize(), element);
}
}
@@ -102,7 +104,7 @@ class MappingTable {
const MappingTable* const table_; // The original table.
uint32_t element_; // A value in the range 0 to end_.
const uint32_t end_; // Equal to table_->DexToPcSize().
- const uint8_t* encoded_table_ptr_; // Either NULL or points to encoded data after this entry.
+ const uint8_t* encoded_table_ptr_; // Either nullptr or points to encoded data after this entry.
uint32_t native_pc_offset_; // The current value of native pc offset.
uint32_t dex_pc_; // The current value of dex pc.
};
@@ -118,7 +120,7 @@ class MappingTable {
uint32_t PcToDexSize() const PURE {
const uint8_t* table = encoded_table_;
- if (table == NULL) {
+ if (table == nullptr) {
return 0;
} else {
DecodeUnsignedLeb128(&table); // Total_size, unused.
@@ -129,7 +131,7 @@ class MappingTable {
const uint8_t* FirstPcToDexPtr() const {
const uint8_t* table = encoded_table_;
- if (table != NULL) {
+ if (table != nullptr) {
DecodeUnsignedLeb128(&table); // Total_size, unused.
DecodeUnsignedLeb128(&table); // PC to Dex size, unused.
}
@@ -139,15 +141,15 @@ class MappingTable {
class PcToDexIterator {
public:
PcToDexIterator(const MappingTable* table, uint32_t element) :
- table_(table), element_(element), end_(table_->PcToDexSize()), encoded_table_ptr_(NULL),
+ table_(table), element_(element), end_(table_->PcToDexSize()), encoded_table_ptr_(nullptr),
native_pc_offset_(0), dex_pc_(0) {
- if (element == 0) {
- encoded_table_ptr_ = table_->FirstPcToDexPtr();
+ if (element == 0) { // An iterator wanted from the start.
if (end_ > 0) {
+ encoded_table_ptr_ = table_->FirstPcToDexPtr();
native_pc_offset_ = DecodeUnsignedLeb128(&encoded_table_ptr_);
dex_pc_ = DecodeUnsignedLeb128(&encoded_table_ptr_);
}
- } else {
+ } else { // An iterator wanted from the end.
DCHECK_EQ(table_->PcToDexSize(), element);
}
}
@@ -177,7 +179,7 @@ class MappingTable {
const MappingTable* const table_; // The original table.
uint32_t element_; // A value in the range 0 to PcToDexSize.
const uint32_t end_; // Equal to table_->PcToDexSize().
- const uint8_t* encoded_table_ptr_; // Either NULL or points to encoded data after this entry.
+ const uint8_t* encoded_table_ptr_; // Either null or points to encoded data after this entry.
uint32_t native_pc_offset_; // The current value of native pc offset.
uint32_t dex_pc_; // The current value of dex pc.
};