Fixes global numeric types to have max of signed encoding (#442)
This adjusts towards the exiting code which used int32/64 instead of uint32/64. The reason is that the spec indicates intepretation as signed numbers, which affects the maximum value. See https://www.w3.org/TR/wasm-core-1/#value-types%E2%91%A2 Signed-off-by: Adrian Cole <adrian@tetrate.io>
This commit is contained in:
23
builder.go
23
builder.go
@@ -5,6 +5,7 @@ import (
|
||||
|
||||
"github.com/tetratelabs/wazero/api"
|
||||
"github.com/tetratelabs/wazero/internal/leb128"
|
||||
"github.com/tetratelabs/wazero/internal/u64"
|
||||
"github.com/tetratelabs/wazero/internal/wasm"
|
||||
)
|
||||
|
||||
@@ -105,8 +106,10 @@ type ModuleBuilder interface {
|
||||
// builder.ExportGlobalI32("canvas_width", 1024)
|
||||
//
|
||||
// Note: If a global is already exported with the same name, this overwrites it.
|
||||
// Note: The maximum value of v is math.MaxInt32 to match constraints of initialization in binary format.
|
||||
// See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#value-types%E2%91%A2
|
||||
// See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#syntax-globaltype
|
||||
ExportGlobalI32(name string, v uint32) ModuleBuilder
|
||||
ExportGlobalI32(name string, v int32) ModuleBuilder
|
||||
|
||||
// ExportGlobalI64 exports a global constant of type api.ValueTypeI64.
|
||||
//
|
||||
@@ -115,8 +118,10 @@ type ModuleBuilder interface {
|
||||
// builder.ExportGlobalI64("start_epoch", 1620216263544)
|
||||
//
|
||||
// Note: If a global is already exported with the same name, this overwrites it.
|
||||
// Note: The maximum value of v is math.MaxInt64 to match constraints of initialization in binary format.
|
||||
// See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#value-types%E2%91%A2
|
||||
// See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#syntax-globaltype
|
||||
ExportGlobalI64(name string, v uint64) ModuleBuilder
|
||||
ExportGlobalI64(name string, v int64) ModuleBuilder
|
||||
|
||||
// ExportGlobalF32 exports a global constant of type api.ValueTypeF32.
|
||||
//
|
||||
@@ -194,19 +199,21 @@ func (b *moduleBuilder) ExportMemoryWithMax(name string, minPages, maxPages uint
|
||||
}
|
||||
|
||||
// ExportGlobalI32 implements ModuleBuilder.ExportGlobalI32
|
||||
func (b *moduleBuilder) ExportGlobalI32(name string, v uint32) ModuleBuilder {
|
||||
func (b *moduleBuilder) ExportGlobalI32(name string, v int32) ModuleBuilder {
|
||||
b.nameToGlobal[name] = &wasm.Global{
|
||||
Type: &wasm.GlobalType{ValType: wasm.ValueTypeI32},
|
||||
Init: &wasm.ConstantExpression{Opcode: wasm.OpcodeI32Const, Data: leb128.EncodeUint32(v)},
|
||||
// Signed per https://www.w3.org/TR/wasm-core-1/#value-types%E2%91%A2
|
||||
Init: &wasm.ConstantExpression{Opcode: wasm.OpcodeI32Const, Data: leb128.EncodeUint32(uint32(v))},
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
// ExportGlobalI64 implements ModuleBuilder.ExportGlobalI64
|
||||
func (b *moduleBuilder) ExportGlobalI64(name string, v uint64) ModuleBuilder {
|
||||
func (b *moduleBuilder) ExportGlobalI64(name string, v int64) ModuleBuilder {
|
||||
b.nameToGlobal[name] = &wasm.Global{
|
||||
Type: &wasm.GlobalType{ValType: wasm.ValueTypeI64},
|
||||
Init: &wasm.ConstantExpression{Opcode: wasm.OpcodeI64Const, Data: leb128.EncodeUint64(v)},
|
||||
// Signed per https://www.w3.org/TR/wasm-core-1/#value-types%E2%91%A2
|
||||
Init: &wasm.ConstantExpression{Opcode: wasm.OpcodeI64Const, Data: leb128.EncodeUint64(uint64(v))},
|
||||
}
|
||||
return b
|
||||
}
|
||||
@@ -215,7 +222,7 @@ func (b *moduleBuilder) ExportGlobalI64(name string, v uint64) ModuleBuilder {
|
||||
func (b *moduleBuilder) ExportGlobalF32(name string, v float32) ModuleBuilder {
|
||||
b.nameToGlobal[name] = &wasm.Global{
|
||||
Type: &wasm.GlobalType{ValType: wasm.ValueTypeF32},
|
||||
Init: &wasm.ConstantExpression{Opcode: wasm.OpcodeF32Const, Data: leb128.EncodeUint64(api.EncodeF32(v))},
|
||||
Init: &wasm.ConstantExpression{Opcode: wasm.OpcodeF32Const, Data: u64.LeBytes(api.EncodeF32(v))},
|
||||
}
|
||||
return b
|
||||
}
|
||||
@@ -224,7 +231,7 @@ func (b *moduleBuilder) ExportGlobalF32(name string, v float32) ModuleBuilder {
|
||||
func (b *moduleBuilder) ExportGlobalF64(name string, v float64) ModuleBuilder {
|
||||
b.nameToGlobal[name] = &wasm.Global{
|
||||
Type: &wasm.GlobalType{ValType: wasm.ValueTypeF64},
|
||||
Init: &wasm.ConstantExpression{Opcode: wasm.OpcodeF64Const, Data: leb128.EncodeUint64(api.EncodeF64(v))},
|
||||
Init: &wasm.ConstantExpression{Opcode: wasm.OpcodeF64Const, Data: u64.LeBytes(api.EncodeF64(v))},
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user