aboutsummaryrefslogtreecommitdiffstats
path: root/prog/decodeexec.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2024-04-15 12:36:20 +0200
committerDmitry Vyukov <dvyukov@google.com>2024-04-15 13:23:33 +0000
commit80ce88419762e4342971463033802fea7cdb2973 (patch)
treee522a76cfc92dfe1c31470f2993923737d641d3d /prog/decodeexec.go
parent416332e39df7236896d0d13bebcc7bb13105c0a4 (diff)
prog: use leb128 for exec encoding
Switch from uint64 to leb128 encoding for integers. This almost more than halves serialized size: - exec sizes: 10%:2160 50%:4792 90%:14288 + exec sizes: 10%:597 50%:1438 90%:7145 and makes it smaller than the text serialization: text sizes: 10%:837 50%:1591 90%:10156
Diffstat (limited to 'prog/decodeexec.go')
-rw-r--r--prog/decodeexec.go14
1 files changed, 8 insertions, 6 deletions
diff --git a/prog/decodeexec.go b/prog/decodeexec.go
index db89aa82e..4574ef845 100644
--- a/prog/decodeexec.go
+++ b/prog/decodeexec.go
@@ -4,6 +4,7 @@
package prog
import (
+ "encoding/binary"
"fmt"
"reflect"
)
@@ -218,15 +219,16 @@ func (dec *execDecoder) readArg() ExecArg {
}
func (dec *execDecoder) read() uint64 {
- if len(dec.data) < 8 {
- dec.setErr(fmt.Errorf("exec program overflow"))
- }
if dec.err != nil {
return 0
}
- v := HostEndian.Uint64(dec.data)
- dec.data = dec.data[8:]
- return v
+ v, n := binary.Varint(dec.data)
+ if n <= 0 {
+ dec.setErr(fmt.Errorf("exec program overflow"))
+ return 0
+ }
+ dec.data = dec.data[n:]
+ return uint64(v)
}
func (dec *execDecoder) readBlob(size uint64) []byte {