...

Source file src/github.com/tetratelabs/wazero/internal/wazeroir/signature_test.go

Documentation: github.com/tetratelabs/wazero/internal/wazeroir

     1  package wazeroir
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/tetratelabs/wazero/internal/testing/require"
     7  	"github.com/tetratelabs/wazero/internal/wasm"
     8  )
     9  
    10  func TestCompiler_wasmOpcodeSignature(t *testing.T) {
    11  	tests := []struct {
    12  		name string
    13  		body []byte
    14  		exp  *signature
    15  	}{
    16  		{
    17  			name: "i32.trunc_sat_f32_s",
    18  			body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscI32TruncSatF32S},
    19  			exp:  signature_F32_I32,
    20  		},
    21  		{
    22  			name: "i32.trunc_sat_f32_u",
    23  			body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscI32TruncSatF32U},
    24  			exp:  signature_F32_I32,
    25  		},
    26  		{
    27  			name: "i32.trunc_sat_f64_s",
    28  			body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscI32TruncSatF64S},
    29  			exp:  signature_F64_I32,
    30  		},
    31  		{
    32  			name: "i32.trunc_sat_f64_u",
    33  			body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscI32TruncSatF64U},
    34  			exp:  signature_F64_I32,
    35  		},
    36  		{
    37  			name: "i64.trunc_sat_f32_s",
    38  			body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscI64TruncSatF32S},
    39  			exp:  signature_F32_I64,
    40  		},
    41  		{
    42  			name: "i64.trunc_sat_f32_u",
    43  			body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscI64TruncSatF32U},
    44  			exp:  signature_F32_I64,
    45  		},
    46  		{
    47  			name: "i64.trunc_sat_f64_s",
    48  			body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscI64TruncSatF64S},
    49  			exp:  signature_F64_I64,
    50  		},
    51  		{
    52  			name: "i64.trunc_sat_f64_u",
    53  			body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscI64TruncSatF64U},
    54  			exp:  signature_F64_I64,
    55  		},
    56  		{
    57  			name: "memory.init",
    58  			body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscMemoryInit},
    59  			exp:  signature_I32I32I32_None,
    60  		},
    61  		{
    62  			name: "data.drop",
    63  			body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscDataDrop},
    64  			exp:  signature_None_None,
    65  		},
    66  		{
    67  			name: "memory.copy",
    68  			body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscMemoryCopy},
    69  			exp:  signature_I32I32I32_None,
    70  		},
    71  		{
    72  			name: "memory.fill",
    73  			body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscMemoryFill},
    74  			exp:  signature_I32I32I32_None,
    75  		},
    76  		{
    77  			name: "table.init",
    78  			body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscTableInit},
    79  			exp:  signature_I32I32I32_None,
    80  		},
    81  		{
    82  			name: "elem.drop",
    83  			body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscElemDrop},
    84  			exp:  signature_None_None,
    85  		},
    86  		{
    87  			name: "table.copy",
    88  			body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscTableCopy},
    89  			exp:  signature_I32I32I32_None,
    90  		},
    91  	}
    92  
    93  	for _, tt := range tests {
    94  		tc := tt
    95  		t.Run(tc.name, func(t *testing.T) {
    96  			c := &Compiler{body: tc.body}
    97  			actual, err := c.wasmOpcodeSignature(tc.body[0], 0)
    98  			require.NoError(t, err)
    99  			require.Equal(t, tc.exp, actual)
   100  		})
   101  	}
   102  }
   103  
   104  func Test_funcTypeToIRSignatures(t *testing.T) {
   105  	f := &funcTypeToIRSignatures{
   106  		wasmTypes:     []wasm.FunctionType{v_v, i32_i32, v_f64f64},
   107  		directCalls:   make([]*signature, 3),
   108  		indirectCalls: make([]*signature, 3),
   109  	}
   110  
   111  	require.Equal(t, &signature{in: make([]UnsignedType, 0), out: make([]UnsignedType, 0)}, f.get(0, false))
   112  	require.Equal(t, &signature{in: []UnsignedType{UnsignedTypeI32}, out: make([]UnsignedType, 0)}, f.get(0, true))
   113  	require.NotNil(t, f.directCalls[0])
   114  	require.NotNil(t, f.indirectCalls[0])
   115  	require.Equal(t, &signature{in: []UnsignedType{UnsignedTypeI32}, out: []UnsignedType{UnsignedTypeI32}}, f.get(1, false))
   116  	require.Equal(t, &signature{in: []UnsignedType{UnsignedTypeI32, UnsignedTypeI32}, out: []UnsignedType{UnsignedTypeI32}}, f.get(1, true))
   117  	require.NotNil(t, f.directCalls[1])
   118  	require.NotNil(t, f.indirectCalls[1])
   119  	require.Equal(t, &signature{in: make([]UnsignedType, 0), out: []UnsignedType{UnsignedTypeF64, UnsignedTypeF64}}, f.get(2, false))
   120  	require.Equal(t, &signature{in: []UnsignedType{UnsignedTypeI32}, out: []UnsignedType{UnsignedTypeF64, UnsignedTypeF64}}, f.get(2, true))
   121  	require.NotNil(t, f.directCalls[2])
   122  	require.NotNil(t, f.indirectCalls[2])
   123  }
   124  

View as plain text