Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion src/internal/profile/proto.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ package profile
import (
"errors"
"fmt"
"slices"
)

type buffer struct {
Expand Down Expand Up @@ -175,6 +176,16 @@ func le32(p []byte) uint32 {
return uint32(p[0]) | uint32(p[1])<<8 | uint32(p[2])<<16 | uint32(p[3])<<24
}

func peekNumVarints(data []byte) (numVarints int) {
for ; len(data) > 0; numVarints++ {
var err error
if _, data, err = decodeVarint(data); err != nil {
break
}
}
return numVarints
}

func decodeVarint(data []byte) (uint64, []byte, error) {
var i int
var u uint64
Expand Down Expand Up @@ -275,6 +286,9 @@ func decodeInt64(b *buffer, x *int64) error {
func decodeInt64s(b *buffer, x *[]int64) error {
if b.typ == 2 {
// Packed encoding
dataLen := peekNumVarints(b.data)
*x = slices.Grow(*x, dataLen)

data := b.data
for len(data) > 0 {
var u uint64
Expand Down Expand Up @@ -305,8 +319,11 @@ func decodeUint64(b *buffer, x *uint64) error {

func decodeUint64s(b *buffer, x *[]uint64) error {
if b.typ == 2 {
data := b.data
// Packed encoding
dataLen := peekNumVarints(b.data)
*x = slices.Grow(*x, dataLen)

data := b.data
for len(data) > 0 {
var u uint64
var err error
Expand Down