1package binary
2
3import (
4 "bytes"
5 "fmt"
6
7 "github.com/tetratelabs/wazero/internal/leb128"
8)
9
10// decodeLimitsType returns the `limitsType` (min, max) decoded with the WebAssembly 1.0 (20191205) Binary Format.
11//
12// See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#limits%E2%91%A6
13//
14// Extended in threads proposal: https://webassembly.github.io/threads/core/binary/types.html#limits
15func decodeLimitsType(r *bytes.Reader) (min uint32, max *uint32, shared bool, err error) {
16 var flag byte
17 if flag, err = r.ReadByte(); err != nil {
18 err = fmt.Errorf("read leading byte: %v", err)
19 return
20 }
21
22 switch flag {
23 case 0x00, 0x02:
24 min, _, err = leb128.DecodeUint32(r)
25 if err != nil {
26 err = fmt.Errorf("read min of limit: %v", err)
27 }
28 case 0x01, 0x03:
29 min, _, err = leb128.DecodeUint32(r)
30 if err != nil {
31 err = fmt.Errorf("read min of limit: %v", err)
32 return
33 }
34 var m uint32
35 if m, _, err = leb128.DecodeUint32(r); err != nil {
36 err = fmt.Errorf("read max of limit: %v", err)
37 } else {
38 max = &m
39 }
40 default:
41 err = fmt.Errorf("%v for limits: %#x not in (0x00, 0x01, 0x02, 0x03)", ErrInvalidByte, flag)
42 }
43
44 shared = flag == 0x02 || flag == 0x03
45
46 return
47}