public DebugInstructionException(DebugInstruction instruction, String message) : base(message) { Instruction = instruction; }
private void ReadDebugInfo(BinaryReader reader, MethodDefinition mdef, InstructionReader instructionReader, uint debugOffset) { reader.PreserveCurrentPosition(debugOffset, () => { var debugInfo = new DebugInfo(mdef.Body); mdef.Body.DebugInfo = debugInfo; uint lineStart = reader.ReadULEB128(); debugInfo.LineStart = lineStart; uint parametersSize = reader.ReadULEB128(); for (int i = 0; i < parametersSize; i++) { long index = reader.ReadULEB128p1(); string name = null; if (index != DexConsts.NoIndex && index >= 0) name = strings[(int) index]; debugInfo.Parameters.Add(name); } while (true) { var ins = new DebugInstruction((DebugOpCodes) reader.ReadByte()); debugInfo.DebugInstructions.Add(ins); uint registerIndex; uint addrDiff; long nameIndex; long typeIndex; long signatureIndex; int lineDiff; string name; switch (ins.OpCode) { case DebugOpCodes.AdvancePc: // uleb128 addr_diff addrDiff = reader.ReadULEB128(); ins.Operands.Add(addrDiff); break; case DebugOpCodes.AdvanceLine: // sleb128 line_diff lineDiff = reader.ReadSLEB128(); ins.Operands.Add(lineDiff); break; case DebugOpCodes.EndLocal: case DebugOpCodes.RestartLocal: // uleb128 register_num registerIndex = reader.ReadULEB128(); ins.Operands.Add(mdef.Body.Registers[(int) registerIndex]); break; case DebugOpCodes.SetFile: // uleb128p1 name_idx nameIndex = reader.ReadULEB128p1(); name = null; if (nameIndex != DexConsts.NoIndex && nameIndex >= 0) name = strings[(int) nameIndex]; ins.Operands.Add(name); break; case DebugOpCodes.StartLocalExtended: case DebugOpCodes.StartLocal: // StartLocalExtended : uleb128 register_num, uleb128p1 name_idx, uleb128p1 type_idx, uleb128p1 sig_idx // StartLocal : uleb128 register_num, uleb128p1 name_idx, uleb128p1 type_idx Boolean isExtended = ins.OpCode == DebugOpCodes. StartLocalExtended; registerIndex = reader.ReadULEB128(); ins.Operands.Add(mdef.Body.Registers[(int) registerIndex]); nameIndex = reader.ReadULEB128p1(); name = null; if (nameIndex != DexConsts.NoIndex && nameIndex >= 0) name = strings[(int) nameIndex]; ins.Operands.Add(name); typeIndex = reader.ReadULEB128p1(); TypeReference type = null; if (typeIndex != DexConsts.NoIndex && typeIndex >= 0) type = typeReferences[(int) typeIndex]; ins.Operands.Add(type); if (isExtended) { signatureIndex = reader.ReadULEB128p1(); string signature = null; if (signatureIndex != DexConsts.NoIndex && signatureIndex >= 0) signature = strings[(int) signatureIndex]; ins.Operands.Add(signature); } break; case DebugOpCodes.EndSequence: return; case DebugOpCodes.Special: // between 0x0a and 0xff (inclusive) case DebugOpCodes.SetPrologueEnd: case DebugOpCodes.SetEpilogueBegin: default: break; } } }); }