diff --git a/dwarf/line/line.test b/dwarf/line/line.test new file mode 100755 index 00000000..fddbe0d5 Binary files /dev/null and b/dwarf/line/line.test differ diff --git a/dwarf/line/line_parser.go b/dwarf/line/line_parser.go index 8d5172f7..c4ab30a0 100644 --- a/dwarf/line/line_parser.go +++ b/dwarf/line/line_parser.go @@ -50,20 +50,17 @@ func Parse(data []byte) *DebugLineInfo { func parseDebugLinePrologue(dbl *DebugLineInfo, buf *bytes.Buffer) { p := &DebugLinePrologue{} - binary.Read(buf, binary.LittleEndian, &p.Length) - binary.Read(buf, binary.LittleEndian, &p.Version) - binary.Read(buf, binary.LittleEndian, &p.PrologueLength) - binary.Read(buf, binary.LittleEndian, &p.MinInstrLength) - binary.Read(buf, binary.LittleEndian, &p.InitialIsStmt) - binary.Read(buf, binary.LittleEndian, &p.LineBase) - binary.Read(buf, binary.LittleEndian, &p.LineRange) - binary.Read(buf, binary.LittleEndian, &p.OpcodeBase) - binary.Read(buf, binary.LittleEndian, &p.StdOpLengths) + p.Length = binary.LittleEndian.Uint32(buf.Next(4)) + p.Version = binary.LittleEndian.Uint16(buf.Next(2)) + p.PrologueLength = binary.LittleEndian.Uint32(buf.Next(4)) + p.MinInstrLength = uint8(buf.Next(1)[0]) + p.InitialIsStmt = uint8(buf.Next(1)[0]) + p.LineBase = int8(buf.Next(1)[0]) + p.LineRange = uint8(buf.Next(1)[0]) + p.OpcodeBase = uint8(buf.Next(1)[0]) p.StdOpLengths = make([]uint8, p.OpcodeBase-1) - for i := uint8(0); i < p.OpcodeBase-1; i++ { - binary.Read(buf, binary.LittleEndian, &p.StdOpLengths[i]) - } + binary.Read(buf, binary.LittleEndian, &p.StdOpLengths) dbl.Prologue = p } diff --git a/dwarf/line/line_parser_test.go b/dwarf/line/line_parser_test.go index 611fcc05..a8917499 100644 --- a/dwarf/line/line_parser_test.go +++ b/dwarf/line/line_parser_test.go @@ -6,6 +6,8 @@ import ( "path/filepath" "strings" "testing" + + "github.com/davecheney/profile" ) func grabDebugLineSection(fp string, t *testing.T) []byte { @@ -91,3 +93,13 @@ func TestDebugLinePrologueParser(t *testing.T) { t.Fatal("First entry not parsed correctly") } } + +func BenchmarkLineParser(b *testing.B) { + defer profile.Start(profile.MemProfile).Stop() + data := grabDebugLineSection("../../_fixtures/testnextprog", nil) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + _ = Parse(data) + } +} diff --git a/dwarf/util/util.go b/dwarf/util/util.go index a5867c21..e1f554dc 100644 --- a/dwarf/util/util.go +++ b/dwarf/util/util.go @@ -1,9 +1,6 @@ package util -import ( - "bytes" - "unicode/utf8" -) +import "bytes" // DecodeULEB128 decodes an unsigned Little Endian Base 128 // represented number. @@ -67,36 +64,10 @@ func DecodeSLEB128(buf *bytes.Buffer) (int64, uint32) { } func ParseString(data *bytes.Buffer) (string, uint32) { - var ( - size uint32 - str []rune - strb []byte - ) - - for { - b, err := data.ReadByte() - if err != nil { - panic("parseString(): Could not read byte") - } - size++ - - if b == 0x0 { - if size == 1 { - return "", size - } - - break - } - - strb = append(strb, b) - - if utf8.FullRune(strb) { - r, _ := utf8.DecodeRune(strb) - str = append(str, r) - size++ - strb = strb[0:0] - } + str, err := data.ReadString(0x0) + if err != nil { + panic("Could not parse string") } - return string(str), size + return str[:len(str)-1], uint32(len(str)) } diff --git a/dwarf/util/util_test.go b/dwarf/util/util_test.go index 9f0fe1fe..d385b5cb 100644 --- a/dwarf/util/util_test.go +++ b/dwarf/util/util_test.go @@ -32,6 +32,6 @@ func TestParseString(t *testing.T) { str, _ := ParseString(bstr) if str != "hi" { - t.Fatal("String was not parsed correctly") + t.Fatalf("String was not parsed correctly %#v", str) } }