Fixed parsing of debug info in dex files.

Some decoding wasn't being done when locals weren't needed. The decoding
is now unconditional so the pointer can be advanced properly.

Change-Id: I9452afdca3187c802909cbbbab78c55ade35c836
diff --git a/src/dex_file.cc b/src/dex_file.cc
index c9e2f62..21489dd 100644
--- a/src/dex_file.cc
+++ b/src/dex_file.cc
@@ -642,7 +642,8 @@
   ParameterIterator* it = GetParameterIterator(GetProtoId(method->GetProtoIdx()));
   for (uint32_t i = 0; i < parameters_size && it->HasNext(); ++i, it->Next()) {
     if (arg_reg >= code_item->registers_size_) {
-      LOG(ERROR) << "invalid stream";
+      LOG(ERROR) << "invalid stream - arg reg >= reg size (" << arg_reg
+                 << " >= " << code_item->registers_size_ << ")";
       return;
     }
     int32_t id = DecodeUnsignedLeb128P1(&stream);
@@ -666,13 +667,16 @@
   }
 
   if (it->HasNext()) {
-    LOG(ERROR) << "invalid stream";
+    LOG(ERROR) << "invalid stream - problem with parameter iterator";
     return;
   }
 
   for (;;)  {
     uint8_t opcode = *stream++;
     uint16_t reg;
+    uint16_t name_idx;
+    uint16_t descriptor_idx;
+    uint16_t signature_idx = 0;
 
     switch (opcode) {
       case DBG_END_SEQUENCE:
@@ -690,18 +694,25 @@
       case DBG_START_LOCAL_EXTENDED:
         reg = DecodeUnsignedLeb128(&stream);
         if (reg > code_item->registers_size_) {
-          LOG(ERROR) << "invalid stream";
+          LOG(ERROR) << "invalid stream - reg > reg size (" << reg << " > "
+                     << code_item->registers_size_ << ")";
           return;
         }
 
+        name_idx = DecodeUnsignedLeb128P1(&stream);
+        descriptor_idx = DecodeUnsignedLeb128P1(&stream);
+        if (opcode == DBG_START_LOCAL_EXTENDED) {
+          signature_idx = DecodeUnsignedLeb128P1(&stream);
+        }
+
         // Emit what was previously there, if anything
         if (need_locals) {
           InvokeLocalCbIfLive(cnxt, reg, address, local_in_reg, local_cb);
 
-          local_in_reg[reg].name_ = dexStringById(DecodeUnsignedLeb128P1(&stream));
-          local_in_reg[reg].descriptor_ = dexStringByTypeIdx(DecodeUnsignedLeb128P1(&stream));
+          local_in_reg[reg].name_ = dexStringById(name_idx);
+          local_in_reg[reg].descriptor_ = dexStringByTypeIdx(descriptor_idx);
           if (opcode == DBG_START_LOCAL_EXTENDED) {
-            local_in_reg[reg].signature_ = dexStringById(DecodeUnsignedLeb128P1(&stream));
+            local_in_reg[reg].signature_ = dexStringById(signature_idx);
           }
           local_in_reg[reg].start_address_ = address;
           local_in_reg[reg].is_live_ = true;
@@ -711,7 +722,8 @@
       case DBG_END_LOCAL:
         reg = DecodeUnsignedLeb128(&stream);
         if (reg > code_item->registers_size_) {
-          LOG(ERROR) << "invalid stream";
+          LOG(ERROR) << "invalid stream - reg > reg size (" << reg << " > "
+                     << code_item->registers_size_ << ")";
           return;
         }
 
@@ -724,13 +736,14 @@
       case DBG_RESTART_LOCAL:
         reg = DecodeUnsignedLeb128(&stream);
         if (reg > code_item->registers_size_) {
-          LOG(ERROR) << "invalid stream";
+          LOG(ERROR) << "invalid stream - reg > reg size (" << reg << " > "
+                     << code_item->registers_size_ << ")";
           return;
         }
 
         if (need_locals) {
           if (local_in_reg[reg].name_ == NULL || local_in_reg[reg].descriptor_ == NULL) {
-            LOG(ERROR) << "invalid stream";
+            LOG(ERROR) << "invalid stream - no name or descriptor";
             return;
           }