tiss_test.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package tiss
  2. import (
  3. "bytes"
  4. "io"
  5. "os"
  6. "testing"
  7. "github.com/kpmy/tiss/gen"
  8. "github.com/kpmy/tiss/ir"
  9. "github.com/kpmy/tiss/ir/ops"
  10. "github.com/kpmy/tiss/ir/types"
  11. "github.com/kpmy/tiss/ps"
  12. "github.com/kpmy/ypk/fn"
  13. )
  14. func TestDump(t *testing.T) {
  15. if f, err := os.Create("dump.wast"); err == nil {
  16. defer f.Close()
  17. m := &ir.Module{}
  18. td := &ir.TypeDef{}
  19. td.Name("$t0")
  20. td.Func = &ir.FuncExpr{}
  21. m.Type = append(m.Type, td)
  22. f0 := &ir.FuncExpr{}
  23. f0.Name("$fib")
  24. par := &ir.Param{}
  25. par.Name("$x")
  26. par.Type(types.I64)
  27. l0 := &ir.Local{}
  28. l0.Name("$i")
  29. l0.Type(types.I64)
  30. f0.Params = append(f0.Params, par)
  31. f0.Locals = append(f0.Locals, l0)
  32. f0.Result = &ir.ResultExpr{Result: types.I64}
  33. ret := &ir.ReturnExpr{}
  34. ret.Expr = &ir.ConstExpr{Type: types.I64, Value: 0}
  35. f0.Code = append(f0.Code, ret)
  36. fn := &ir.FuncExpr{}
  37. fn.Name("$start")
  38. fn.Type = &ir.TypeRef{Type: ir.ThisVar("$t0")}
  39. call := &ir.CallExpr{}
  40. call.Var = ir.ThisVar("$fib")
  41. call.Params = []ir.CodeExpr{&ir.ConstExpr{Type: types.I64, Value: 0}}
  42. fn.Code = append(fn.Code, call)
  43. m.Func = append(m.Func, f0, fn)
  44. m.Start = &ir.StartExpr{Var: ir.ThisVar("$start")}
  45. buf := bytes.NewBuffer(nil)
  46. if err = gen.NewWriter(buf, gen.Opts{PrettyPrint: false}).WriteExpr(m); err == nil {
  47. t.Log(buf.String())
  48. io.Copy(f, buf)
  49. } else {
  50. t.Error(err)
  51. }
  52. } else {
  53. t.Error(err)
  54. }
  55. }
  56. func TestRead(t *testing.T) {
  57. if f, err := os.Open("dump.wast"); err == nil {
  58. if m, err := ps.Parse(f); err == nil {
  59. poo(t, m)
  60. } else {
  61. t.Error(err)
  62. }
  63. } else {
  64. t.Error(err)
  65. }
  66. }
  67. func TestOp(t *testing.T) {
  68. t.Log(ops.Monadic(types.I32, ops.Clz))
  69. t.Log(ops.Monadic(types.F32, ops.Nearest))
  70. t.Log(ops.Dyadic(types.I64, types.I64, ops.Add))
  71. t.Log(ops.Dyadic(types.I32, types.I32, ops.Ge, true))
  72. t.Log(ops.Dyadic(types.F32, types.F32, ops.Min))
  73. t.Log(ops.Conv(types.I64, types.F32, ops.Convert, true))
  74. t.Log(ops.Conv(types.I64, types.F64, ops.Reinterpret))
  75. }
  76. func TestExpr(t *testing.T) {
  77. {
  78. expr := &ir.LoadExpr{}
  79. expr.Size = ir.Load32
  80. expr.Offset = 14
  81. expr.Align = 32
  82. expr.Type = types.I64
  83. expr.Expr = &ir.ConstExpr{Type: types.I64, Value: 34}
  84. poo(t, expr)
  85. }
  86. {
  87. expr := &ir.StoreExpr{}
  88. expr.Size = ir.Load32
  89. expr.Offset = 14
  90. expr.Align = 32
  91. expr.Type = types.I64
  92. expr.Expr = &ir.ConstExpr{Type: types.I64, Value: 34}
  93. expr.Value = &ir.ConstExpr{Type: types.I64, Value: 124}
  94. poo(t, expr)
  95. }
  96. {
  97. imp := &ir.Import{}
  98. imp.Name("$imp")
  99. imp.Mod = "mod"
  100. imp.Func = "func"
  101. poo(t, imp)
  102. }
  103. {
  104. c := &ir.ConstExpr{}
  105. c.Type = types.F64
  106. c.Value = 0.05
  107. poo(t, c)
  108. }
  109. }
  110. func TestValidation(t *testing.T) {
  111. b := &ir.Block{}
  112. poo(t, b)
  113. l0 := &ir.Local{}
  114. l0.Name("$i")
  115. l0.Type(types.I64)
  116. poo(t, l0)
  117. s := &ir.Segment{}
  118. s.Offset = 0
  119. s.Data = append(s.Data, "f23fcaeaef2f42f34")
  120. poo(t, s)
  121. m := &ir.Module{}
  122. m.Binary = []byte{0, 1, 2, 3}
  123. poo(t, m)
  124. /* надо проверить все сущности
  125. Br
  126. BrIf
  127. BrTable
  128. CallExpr
  129. CallImportExpr
  130. CallIndirect
  131. CodeExpr
  132. ConstExpr
  133. ConvertOp
  134. CurrentMemoryExpr
  135. DyadicOp
  136. Export
  137. Expression
  138. FuncExpr
  139. GetLocalExpr
  140. GrowMemoryExpr
  141. If
  142. IfExpr
  143. Import
  144. LoadExpr
  145. Loop
  146. Memory
  147. Module
  148. MonadicOp
  149. NopExpr
  150. Param
  151. ResultExpr
  152. ReturnExpr
  153. SetLocalExpr
  154. StartExpr
  155. StoreExpr
  156. TableDef
  157. TypeDef
  158. TypeRef
  159. UnreachableExpr
  160. Variable
  161. */
  162. }
  163. func poo(t *testing.T, e ir.Expression) {
  164. if fn.IsNil(e) {
  165. t.Fatal("NIL")
  166. }
  167. buf := bytes.NewBufferString("")
  168. if err := gen.NewWriter(buf).WriteExpr(e); err != nil {
  169. t.Error(err)
  170. }
  171. t.Log(buf.String())
  172. }