Skip to content

Commit

Permalink
reorganize to take advantage of escape analysis avoiding allocs
Browse files Browse the repository at this point in the history
  • Loading branch information
mschoch committed Sep 8, 2015
1 parent d582e29 commit 24d8310
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 14 deletions.
20 changes: 7 additions & 13 deletions segment.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,14 @@ func NewWordSegmenterDirect(buf []byte) *Segmenter {
}

func SplitWords(data []byte, atEOF bool) (int, []byte, error) {
vals := make([][]byte, 0, 1)
types := make([]int, 0, 1)
advance, token, _, err := SegmentWords(data, atEOF, vals, types)
advance, token, _, err := SegmentWords(data, atEOF)
return advance, token, err
}

func SegmentWords(data []byte, atEOF bool, val [][]byte, types []int) (int, []byte, int, error) {
tokens, types, advance, err := segmentWords(data, 1, atEOF, val, types)
func SegmentWords(data []byte, atEOF bool) (int, []byte, int, error) {
vals := make([][]byte, 0, 1)
types := make([]int, 0, 1)
tokens, types, advance, err := segmentWords(data, 1, atEOF, vals, types)
if len(tokens) > 0 {
return advance, tokens[0], types[0], err
}
Expand All @@ -70,8 +70,6 @@ func NewSegmenter(r io.Reader) *Segmenter {
segment: SegmentWords,
maxTokenSize: MaxScanTokenSize,
buf: make([]byte, 4096), // Plausible starting size; needn't be large.
val: make([][]byte, 0, 1),
types: make([]int, 0, 1),
}
}

Expand All @@ -85,8 +83,6 @@ func NewSegmenterDirect(buf []byte) *Segmenter {
start: 0,
end: len(buf),
err: io.EOF,
val: make([][]byte, 0, 1),
types: make([]int, 0, 1),
}
}

Expand Down Expand Up @@ -116,8 +112,6 @@ type Segmenter struct {
end int // End of data in buf.
typ int // The token type
err error // Sticky error.
val [][]byte
types []int
}

// SegmentFunc is the signature of the segmenting function used to tokenize the
Expand All @@ -136,7 +130,7 @@ type Segmenter struct {
// The function is never called with an empty data slice unless atEOF
// is true. If atEOF is true, however, data may be non-empty and,
// as always, holds unprocessed text.
type SegmentFunc func(data []byte, atEOF bool, val [][]byte, types []int) (advance int, token []byte, segmentType int, err error)
type SegmentFunc func(data []byte, atEOF bool) (advance int, token []byte, segmentType int, err error)

// Errors returned by Segmenter.
var (
Expand Down Expand Up @@ -187,7 +181,7 @@ func (s *Segmenter) Segment() bool {
for {
// See if we can get a token with what we already have.
if s.end > s.start {
advance, token, typ, err := s.segment(s.buf[s.start:s.end], s.err != nil, s.val, s.types)
advance, token, typ, err := s.segment(s.buf[s.start:s.end], s.err != nil)
if err != nil {
s.setErr(err)
return false
Expand Down
2 changes: 1 addition & 1 deletion segment_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ func genLine(buf *bytes.Buffer, lineNum, n int, addNewline bool) {
}

func wrapSplitFuncAsSegmentFuncForTesting(splitFunc bufio.SplitFunc) SegmentFunc {
return func(data []byte, atEOF bool, val [][]byte, types []int) (advance int, token []byte, typ int, err error) {
return func(data []byte, atEOF bool) (advance int, token []byte, typ int, err error) {
typ = 0
advance, token, err = splitFunc(data, atEOF)
return
Expand Down

0 comments on commit 24d8310

Please sign in to comment.