@@ -8,19 +8,21 @@ import (
88 "errors"
99 "fmt"
1010 "io"
11+ "math"
1112 "os"
1213 "strconv"
1314 "strings"
1415)
1516
1617//Parser read tbc file and write 'dissemble' to w
1718type Parser struct {
18- r Decoder
19- w bufio.Writer
20- Detail bool //true: disassemble bytecode
21- codeBytes []byte
22- codeDelta []byte
23- codeLength []byte
19+ r Decoder
20+ w bufio.Writer
21+ Detail bool //true: disassemble bytecode
22+
23+ codeBytes bytes.Buffer
24+ codeDelta bytes.Buffer
25+ codeLength bytes.Buffer
2426}
2527
2628//NewParser create Parser
@@ -276,58 +278,74 @@ func (p *Parser) parseAuxDataArray() (err error) {
276278func (p * Parser ) parseCodeDelta () (err error ) {
277279 var buf [20480 ]byte
278280 var nRead int
279- if _ , err = p .parseIntLine (); err != nil {
281+ var nRes int64
282+ if nRes , err = p .parseIntLine (); err != nil {
280283 return
281284 }
282285 if nRead , err = p .r .Read (buf [:]); err != nil {
283286 return
284287 }
285- s := hex .EncodeToString (buf [:nRead ])
286- _ , err = p .w .WriteString (s )
287- err = p .w .WriteByte ('\n' )
288+ p .codeDelta .Reset ()
289+
290+ if nRes > 0 && nRead > 0 {
291+ s := hex .EncodeToString (buf [:nRead ])
292+ _ , err = p .w .WriteString (s )
293+ err = p .w .WriteByte ('\n' )
288294
289- if nRead > 0 {
290- p .codeDelta = make ([]byte , nRead )
291- copy (p .codeDelta , buf [:nRead ])
295+ if nRead > int (nRes ) {
296+ nRead = int (nRes )
297+ }
298+ p .codeDelta .Write (buf [:nRead ])
292299 }
293300 return
294301}
295302func (p * Parser ) parseCodeLength () (err error ) {
296303 var buf [20480 ]byte
297304 var nRead int
298- if _ , err = p .parseIntLine (); err != nil {
305+ var nRes int64
306+ if nRes , err = p .parseIntLine (); err != nil {
299307 return
300308 }
301309 if nRead , err = p .r .Read (buf [:]); err != nil {
302310 return
303311 }
304- s := hex .EncodeToString (buf [:nRead ])
305- _ , err = p .w .WriteString (s )
306- err = p .w .WriteByte ('\n' )
307312
308- if nRead > 0 {
309- p .codeLength = make ([]byte , nRead )
310- copy (p .codeLength , buf [:nRead ])
313+ p .codeLength .Reset ()
314+
315+ if nRes > 0 && nRead > 0 {
316+ s := hex .EncodeToString (buf [:nRead ])
317+ _ , err = p .w .WriteString (s )
318+ err = p .w .WriteByte ('\n' )
319+
320+ if nRead > int (nRes ) {
321+ nRead = int (nRes )
322+ }
323+ p .codeLength .Write (buf [:nRead ])
311324 }
312325 return
313326}
314327
315328func (p * Parser ) parseCode () (err error ) {
316329 var buf [20480 ]byte
317330 var nRead int
318- if _ , err = p .parseIntLine (); err != nil {
331+ var nRes int64
332+ if nRes , err = p .parseIntLine (); err != nil {
319333 return
320334 }
321335 if nRead , err = p .r .Read (buf [:]); err != nil {
322336 return
323337 }
324- s := hex .EncodeToString (buf [:nRead ])
325- _ , err = p .w .WriteString (s )
326- err = p .w .WriteByte ('\n' )
338+ p .codeBytes .Reset ()
327339
328- if nRead > 0 {
329- p .codeBytes = make ([]byte , nRead )
330- copy (p .codeBytes , buf [:nRead ])
340+ if nRes > 0 && nRead > 0 {
341+ s := hex .EncodeToString (buf [:nRead ])
342+ _ , err = p .w .WriteString (s )
343+ err = p .w .WriteByte ('\n' )
344+
345+ if nRead > int (nRes ) {
346+ nRead = int (nRes )
347+ }
348+ p .codeBytes .Write (buf [:nRead ])
331349 }
332350 return
333351}
@@ -424,9 +442,11 @@ func (p *Parser) parseDecompile() (err error) {
424442 var str string
425443 var bytes int
426444 var totalBytes int
427- src := p .codeBytes
445+ src := p .codeBytes .Bytes ()
446+ codeDelta := p .codeDelta .Bytes ()
447+ codeLength := p .codeLength .Bytes ()
428448
429- numCmds := len (p . codeDelta )
449+ numCmds := len (codeDelta )
430450 indexCmds := 0
431451 cmdBegin := true
432452 var cmdBytes , cmdDelta int
@@ -439,7 +459,8 @@ func (p *Parser) parseDecompile() (err error) {
439459 return err
440460 }
441461 //1. print command title: command %d,pc=xx-xx
442- if numCmds > 0 && indexCmds < (numCmds - 1 ) {
462+ if numCmds > 0 && indexCmds < (numCmds ) {
463+
443464 if cmdBegin {
444465 cmdBytes = bytes
445466 cmdBegin = false
@@ -448,14 +469,23 @@ func (p *Parser) parseDecompile() (err error) {
448469
449470 for samePCforCmds {
450471
451- cmdDelta = int (p .codeDelta [indexCmds + 1 ])
472+ //cmdDelta = int(p.codeDelta[indexCmds+1])
473+
452474 p .w .WriteString (fmt .Sprintf ("\t Command %d" , indexCmds ))
453- if indexCmds < len (p . codeLength ) {
475+ if indexCmds < len (codeLength ) {
454476 //BUG,FIXME, we dont consider codeLength = 0xFF 4bytes case
455- p .w .WriteString (fmt .Sprintf (",pc= %d-%d" , totalBytes , totalBytes + int (p . codeLength [indexCmds ])- 1 ))
477+ p .w .WriteString (fmt .Sprintf (",pc= %d-%d" , totalBytes , totalBytes + int (codeLength [indexCmds ])- 1 ))
456478 }
457479 p .w .WriteByte ('\n' )
480+
458481 indexCmds ++
482+ //cmdDelta 是下一条Command 相对于当前Comand的bytes偏移量
483+ //如果是最后一条命令,cmdDelta赋值MAX
484+ if indexCmds < len (codeDelta ) {
485+ cmdDelta = int (codeDelta [indexCmds ])
486+ } else {
487+ cmdDelta = math .MaxInt32
488+ }
459489
460490 if cmdDelta != 0 {
461491 samePCforCmds = false
0 commit comments