123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- package tiss
- import (
- "bytes"
- "io"
- "os"
- "testing"
- "github.com/kpmy/tiss/gen"
- "github.com/kpmy/tiss/ir"
- "github.com/kpmy/tiss/ir/ops"
- "github.com/kpmy/tiss/ir/types"
- "github.com/kpmy/tiss/ps"
- "github.com/kpmy/ypk/fn"
- )
- func TestDump(t *testing.T) {
- if f, err := os.Create("dump.wast"); err == nil {
- defer f.Close()
- m := &ir.Module{}
- td := &ir.TypeDef{}
- td.Name("$t0")
- td.Func = &ir.FuncExpr{}
- m.Type = append(m.Type, td)
- f0 := &ir.FuncExpr{}
- f0.Name("$fib")
- par := &ir.Param{}
- par.Name("$x")
- par.Type(types.I64)
- l0 := &ir.Local{}
- l0.Name("$i")
- l0.Type(types.I64)
- f0.Params = append(f0.Params, par)
- f0.Locals = append(f0.Locals, l0)
- f0.Result = &ir.ResultExpr{Result: types.I64}
- ret := &ir.ReturnExpr{}
- ret.Expr = &ir.ConstExpr{Type: types.I64, Value: 0}
- f0.Code = append(f0.Code, ret)
- fn := &ir.FuncExpr{}
- fn.Name("$start")
- fn.Type = &ir.TypeRef{Type: ir.ThisVar("$t0")}
- call := &ir.CallExpr{}
- call.Var = ir.ThisVar("$fib")
- call.Params = []ir.CodeExpr{&ir.ConstExpr{Type: types.I64, Value: 0}}
- fn.Code = append(fn.Code, call)
- m.Func = append(m.Func, f0, fn)
- m.Start = &ir.StartExpr{Var: ir.ThisVar("$start")}
- buf := bytes.NewBuffer(nil)
- if err = gen.NewWriter(buf, gen.Opts{PrettyPrint: false}).WriteExpr(m); err == nil {
- t.Log(buf.String())
- io.Copy(f, buf)
- } else {
- t.Error(err)
- }
- } else {
- t.Error(err)
- }
- }
- func TestRead(t *testing.T) {
- if f, err := os.Open("dump.wast"); err == nil {
- if m, err := ps.Parse(f); err == nil {
- poo(t, m)
- } else {
- t.Error(err)
- }
- } else {
- t.Error(err)
- }
- }
- func TestOp(t *testing.T) {
- t.Log(ops.Monadic(types.I32, ops.Clz))
- t.Log(ops.Monadic(types.F32, ops.Nearest))
- t.Log(ops.Dyadic(types.I64, types.I64, ops.Add))
- t.Log(ops.Dyadic(types.I32, types.I32, ops.Ge, true))
- t.Log(ops.Dyadic(types.F32, types.F32, ops.Min))
- t.Log(ops.Conv(types.I64, types.F32, ops.Convert, true))
- t.Log(ops.Conv(types.I64, types.F64, ops.Reinterpret))
- }
- func TestExpr(t *testing.T) {
- {
- expr := &ir.LoadExpr{}
- expr.Size = ir.Load32
- expr.Offset = 14
- expr.Align = 32
- expr.Type = types.I64
- expr.Expr = &ir.ConstExpr{Type: types.I64, Value: 34}
- poo(t, expr)
- }
- {
- expr := &ir.StoreExpr{}
- expr.Size = ir.Load32
- expr.Offset = 14
- expr.Align = 32
- expr.Type = types.I64
- expr.Expr = &ir.ConstExpr{Type: types.I64, Value: 34}
- expr.Value = &ir.ConstExpr{Type: types.I64, Value: 124}
- poo(t, expr)
- }
- {
- imp := &ir.Import{}
- imp.Name("$imp")
- imp.Mod = "mod"
- imp.Func = "func"
- poo(t, imp)
- }
- {
- c := &ir.ConstExpr{}
- c.Type = types.F64
- c.Value = 0.05
- poo(t, c)
- }
- }
- func TestValidation(t *testing.T) {
- b := &ir.Block{}
- poo(t, b)
- l0 := &ir.Local{}
- l0.Name("$i")
- l0.Type(types.I64)
- poo(t, l0)
- s := &ir.Segment{}
- s.Offset = 0
- s.Data = append(s.Data, "f23fcaeaef2f42f34")
- poo(t, s)
- m := &ir.Module{}
- m.Binary = []byte{0, 1, 2, 3}
- poo(t, m)
- /* надо проверить все сущности
- Br
- BrIf
- BrTable
- CallExpr
- CallImportExpr
- CallIndirect
- CodeExpr
- ConstExpr
- ConvertOp
- CurrentMemoryExpr
- DyadicOp
- Export
- Expression
- FuncExpr
- GetLocalExpr
- GrowMemoryExpr
- If
- IfExpr
- Import
- LoadExpr
- Loop
- Memory
- Module
- MonadicOp
- NopExpr
- Param
- ResultExpr
- ReturnExpr
- SetLocalExpr
- StartExpr
- StoreExpr
- TableDef
- TypeDef
- TypeRef
- UnreachableExpr
- Variable
- */
- }
- func poo(t *testing.T, e ir.Expression) {
- if fn.IsNil(e) {
- t.Fatal("NIL")
- }
- buf := bytes.NewBufferString("")
- if err := gen.NewWriter(buf).WriteExpr(e); err != nil {
- t.Error(err)
- }
- t.Log(buf.String())
- }
|