Deletes encode caches (#934)
Signed-off-by: Takeshi Yoneda <takeshi@tetrate.io>
This commit is contained in:
@@ -28,138 +28,6 @@ var (
|
||||
errOverflow64 = errors.New("overflows a 64-bit integer")
|
||||
)
|
||||
|
||||
// encodeCache reduces allocations by returning a constant slice of size one for values that can encode in a single byte
|
||||
var encodeCache = [0x80][1]byte{
|
||||
{0x00},
|
||||
{0x01},
|
||||
{0x02},
|
||||
{0x03},
|
||||
{0x04},
|
||||
{0x05},
|
||||
{0x06},
|
||||
{0x07},
|
||||
{0x08},
|
||||
{0x09},
|
||||
{0x0a},
|
||||
{0x0b},
|
||||
{0x0c},
|
||||
{0x0d},
|
||||
{0x0e},
|
||||
{0x0f},
|
||||
{0x10},
|
||||
{0x11},
|
||||
{0x12},
|
||||
{0x13},
|
||||
{0x14},
|
||||
{0x15},
|
||||
{0x16},
|
||||
{0x17},
|
||||
{0x18},
|
||||
{0x19},
|
||||
{0x1a},
|
||||
{0x1b},
|
||||
{0x1c},
|
||||
{0x1d},
|
||||
{0x1e},
|
||||
{0x1f},
|
||||
{0x20},
|
||||
{0x21},
|
||||
{0x22},
|
||||
{0x23},
|
||||
{0x24},
|
||||
{0x25},
|
||||
{0x26},
|
||||
{0x27},
|
||||
{0x28},
|
||||
{0x29},
|
||||
{0x2a},
|
||||
{0x2b},
|
||||
{0x2c},
|
||||
{0x2d},
|
||||
{0x2e},
|
||||
{0x2f},
|
||||
{0x30},
|
||||
{0x31},
|
||||
{0x32},
|
||||
{0x33},
|
||||
{0x34},
|
||||
{0x35},
|
||||
{0x36},
|
||||
{0x37},
|
||||
{0x38},
|
||||
{0x39},
|
||||
{0x3a},
|
||||
{0x3b},
|
||||
{0x3c},
|
||||
{0x3d},
|
||||
{0x3e},
|
||||
{0x3f},
|
||||
{0x40},
|
||||
{0x41},
|
||||
{0x42},
|
||||
{0x43},
|
||||
{0x44},
|
||||
{0x45},
|
||||
{0x46},
|
||||
{0x47},
|
||||
{0x48},
|
||||
{0x49},
|
||||
{0x4a},
|
||||
{0x4b},
|
||||
{0x4c},
|
||||
{0x4d},
|
||||
{0x4e},
|
||||
{0x4f},
|
||||
{0x50},
|
||||
{0x51},
|
||||
{0x52},
|
||||
{0x53},
|
||||
{0x54},
|
||||
{0x55},
|
||||
{0x56},
|
||||
{0x57},
|
||||
{0x58},
|
||||
{0x59},
|
||||
{0x5a},
|
||||
{0x5b},
|
||||
{0x5c},
|
||||
{0x5d},
|
||||
{0x5e},
|
||||
{0x5f},
|
||||
{0x60},
|
||||
{0x61},
|
||||
{0x62},
|
||||
{0x63},
|
||||
{0x64},
|
||||
{0x65},
|
||||
{0x66},
|
||||
{0x67},
|
||||
{0x68},
|
||||
{0x69},
|
||||
{0x6a},
|
||||
{0x6b},
|
||||
{0x6c},
|
||||
{0x6d},
|
||||
{0x6e},
|
||||
{0x6f},
|
||||
{0x70},
|
||||
{0x71},
|
||||
{0x72},
|
||||
{0x73},
|
||||
{0x74},
|
||||
{0x75},
|
||||
{0x76},
|
||||
{0x77},
|
||||
{0x78},
|
||||
{0x79},
|
||||
{0x7a},
|
||||
{0x7b},
|
||||
{0x7c},
|
||||
{0x7d},
|
||||
{0x7e},
|
||||
{0x7f},
|
||||
}
|
||||
|
||||
// EncodeInt32 encodes the signed value into a buffer in LEB128 format
|
||||
//
|
||||
// See https://en.wikipedia.org/wiki/LEB128#Encode_signed_integer
|
||||
@@ -205,10 +73,6 @@ func EncodeUint32(value uint32) []byte {
|
||||
//
|
||||
// See https://en.wikipedia.org/wiki/LEB128#Encode_unsigned_integer
|
||||
func EncodeUint64(value uint64) (buf []byte) {
|
||||
if value < 0x80 {
|
||||
return encodeCache[value][:]
|
||||
}
|
||||
|
||||
// This is effectively a do/while loop where we take 7 bits of the value and encode them until it is zero.
|
||||
for {
|
||||
// Take 7 remaining low-order bits from the value into b.
|
||||
|
||||
@@ -9,48 +9,11 @@ import (
|
||||
"github.com/tetratelabs/wazero/internal/wasm"
|
||||
)
|
||||
|
||||
var nullary = []byte{0x60, 0, 0}
|
||||
|
||||
// encodedOneParam is a cache of wasm.FunctionType values for param length 1 and result length 0
|
||||
var encodedOneParam = map[wasm.ValueType][]byte{
|
||||
wasm.ValueTypeI32: {0x60, 1, wasm.ValueTypeI32, 0},
|
||||
wasm.ValueTypeI64: {0x60, 1, wasm.ValueTypeI64, 0},
|
||||
wasm.ValueTypeF32: {0x60, 1, wasm.ValueTypeF32, 0},
|
||||
wasm.ValueTypeF64: {0x60, 1, wasm.ValueTypeF64, 0},
|
||||
}
|
||||
|
||||
// encodedOneResult is a cache of wasm.FunctionType values for param length 0 and result length 1
|
||||
var encodedOneResult = map[wasm.ValueType][]byte{
|
||||
wasm.ValueTypeI32: {0x60, 0, 1, wasm.ValueTypeI32},
|
||||
wasm.ValueTypeI64: {0x60, 0, 1, wasm.ValueTypeI64},
|
||||
wasm.ValueTypeF32: {0x60, 0, 1, wasm.ValueTypeF32},
|
||||
wasm.ValueTypeF64: {0x60, 0, 1, wasm.ValueTypeF64},
|
||||
}
|
||||
|
||||
// encodeFunctionType returns the wasm.FunctionType encoded in WebAssembly 1.0 (20191205) Binary Format.
|
||||
//
|
||||
// Note: Function types are encoded by the byte 0x60 followed by the respective vectors of parameter and result types.
|
||||
// See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#function-types%E2%91%A4
|
||||
func encodeFunctionType(t *wasm.FunctionType) []byte {
|
||||
paramCount, resultCount := len(t.Params), len(t.Results)
|
||||
if paramCount == 0 && resultCount == 0 {
|
||||
return nullary
|
||||
}
|
||||
if resultCount == 0 {
|
||||
if paramCount == 1 {
|
||||
if encoded, ok := encodedOneParam[t.Params[0]]; ok {
|
||||
return encoded
|
||||
}
|
||||
}
|
||||
return append(append([]byte{0x60}, encodeValTypes(t.Params)...), 0)
|
||||
} else if resultCount == 1 {
|
||||
if paramCount == 0 {
|
||||
if encoded, ok := encodedOneResult[t.Results[0]]; ok {
|
||||
return encoded
|
||||
}
|
||||
}
|
||||
return append(append([]byte{0x60}, encodeValTypes(t.Params)...), 1, t.Results[0])
|
||||
}
|
||||
// Only reached when "multi-value" is enabled because WebAssembly 1.0 (20191205) supports at most 1 result.
|
||||
data := append([]byte{0x60}, encodeValTypes(t.Params)...)
|
||||
return append(data, encodeValTypes(t.Results)...)
|
||||
|
||||
Reference in New Issue
Block a user