code.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. package ir
  2. import (
  3. "github.com/kpmy/tiss/ir/ops"
  4. "github.com/kpmy/tiss/ir/types"
  5. "github.com/kpmy/ypk/fn"
  6. . "github.com/kpmy/ypk/tc"
  7. )
  8. type ReturnExpr struct {
  9. ns `sexpr:"return"`
  10. Expr CodeExpr
  11. }
  12. func (r *ReturnExpr) Validate() error { return nil }
  13. func (r *ReturnExpr) Eval() {}
  14. func (r *ReturnExpr) Children() (ret []interface{}) {
  15. if !fn.IsNil(r.Expr) {
  16. return append(ret, r.Expr)
  17. }
  18. return
  19. }
  20. type ConstExpr struct {
  21. Type types.Type
  22. Value interface{}
  23. }
  24. func (c *ConstExpr) Name() string {
  25. return string(c.Type) + ".const"
  26. }
  27. func (c *ConstExpr) Validate() error {
  28. if c.Type == "" {
  29. return Error("empty type of const")
  30. }
  31. if fn.IsNil(c.Value) {
  32. return Error("nil const value")
  33. }
  34. return nil
  35. }
  36. func (c *ConstExpr) Eval() {}
  37. func (c *ConstExpr) Children() (ret []interface{}) {
  38. return append(ret, c.Value)
  39. }
  40. type call struct {
  41. Var Variable
  42. Params []CodeExpr
  43. }
  44. func (c *call) Validate() error {
  45. if c.Var.IsEmpty() {
  46. return Error("empty call var")
  47. }
  48. return nil
  49. }
  50. func (c *call) Eval() {}
  51. func (c *call) Children() (ret []interface{}) {
  52. ret = append(ret, c.Var)
  53. for _, p := range c.Params {
  54. ret = append(ret, p)
  55. }
  56. return
  57. }
  58. type CallExpr struct {
  59. ns `sexpr:"call"`
  60. call
  61. }
  62. type CallImportExpr struct {
  63. ns `sexpr:"call_import"`
  64. call
  65. }
  66. type CallIndirect struct {
  67. ns `sexpr:"call_indirect"`
  68. call
  69. //Var is TypeDef variable
  70. //Params are params
  71. Link CodeExpr //Link expr containing adr in table
  72. }
  73. func (c *CallIndirect) Validate() (err error) {
  74. if err = c.call.Validate(); err == nil {
  75. if fn.IsNil(c.Link) {
  76. err = Error("empty link expr of indirect")
  77. }
  78. }
  79. return
  80. }
  81. func (c *CallIndirect) Children() (ret []interface{}) {
  82. tmp := c.call.Children()
  83. ret = append(ret, tmp[0])
  84. ret = append(ret, c.Link)
  85. for i := 1; i < len(tmp); i++ {
  86. ret = append(ret, tmp[i])
  87. }
  88. return
  89. }
  90. type NopExpr struct {
  91. ns `sexpr:"nop"`
  92. }
  93. func (n *NopExpr) Validate() error { return nil }
  94. func (n *NopExpr) Eval() {}
  95. type GetLocalExpr struct {
  96. ns `sexpr:"get_local"`
  97. Var Variable
  98. }
  99. func (g *GetLocalExpr) Validate() error {
  100. if g.Var.IsEmpty() {
  101. return Error("empty local variable")
  102. }
  103. return nil
  104. }
  105. func (g *GetLocalExpr) Children() (ret []interface{}) {
  106. return append(ret, g.Var)
  107. }
  108. func (*GetLocalExpr) Eval() {}
  109. type SetLocalExpr struct {
  110. ns `sexpr:"set_local"`
  111. Var Variable
  112. Expr CodeExpr
  113. }
  114. func (s *SetLocalExpr) Validate() error {
  115. if s.Var.IsEmpty() {
  116. return Error("empty local variable")
  117. }
  118. if fn.IsNil(s.Expr) {
  119. return Error("no expr for local varible")
  120. }
  121. return nil
  122. }
  123. func (s *SetLocalExpr) Children() (ret []interface{}) {
  124. return append(ret, s.Var, s.Expr)
  125. }
  126. func (*SetLocalExpr) Eval() {}
  127. type MonadicOp struct {
  128. Op *ops.MonadicOpCode
  129. Expr CodeExpr
  130. }
  131. func (m *MonadicOp) Name() string {
  132. return m.Op.String()
  133. }
  134. func (m *MonadicOp) Validate() (err error) {
  135. if fn.IsNil(m.Expr) {
  136. err = Error("no expression for monadic op")
  137. }
  138. if fn.IsNil(m.Op) {
  139. err = Error("no operation for monadic op")
  140. }
  141. return
  142. }
  143. func (m *MonadicOp) Children() (ret []interface{}) {
  144. return append(ret, m.Expr)
  145. }
  146. func (*MonadicOp) Eval() {}
  147. type DyadicOp struct {
  148. Op *ops.DyadicOpCode
  149. Left, Right CodeExpr
  150. }
  151. func (d *DyadicOp) Name() string {
  152. return d.Op.String()
  153. }
  154. func (d *DyadicOp) Validate() (err error) {
  155. if fn.IsNil(d.Left) {
  156. err = Error("no left expression for dyadic op")
  157. }
  158. if fn.IsNil(d.Op) {
  159. err = Error("no operation for dyadic op")
  160. }
  161. if fn.IsNil(d.Right) {
  162. err = Error("no right expression for dyadic op")
  163. }
  164. return
  165. }
  166. func (d *DyadicOp) Children() (ret []interface{}) {
  167. return append(ret, d.Left, d.Right)
  168. }
  169. func (*DyadicOp) Eval() {}
  170. type ConvertOp struct {
  171. Op *ops.ConvertOpCode
  172. Expr CodeExpr
  173. }
  174. func (c *ConvertOp) Name() string {
  175. return c.Op.String()
  176. }
  177. func (c *ConvertOp) Validate() (err error) {
  178. if fn.IsNil(c.Expr) {
  179. err = Error("no expression for convert op")
  180. }
  181. if fn.IsNil(c.Op) {
  182. err = Error("no operation for convert op")
  183. }
  184. return
  185. }
  186. func (c *ConvertOp) Children() (ret []interface{}) {
  187. return append(ret, c.Expr)
  188. }
  189. func (*ConvertOp) Eval() {}
  190. type UnreachableExpr struct {
  191. ns `sexpr:"unreachable"`
  192. }
  193. func (*UnreachableExpr) Validate() error { return nil }
  194. func (*UnreachableExpr) Eval() {}