struct.wast 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. ;; Type syntax
  2. (module
  3. (type (struct))
  4. (type (struct (field)))
  5. (type (struct (field i8)))
  6. (type (struct (field i8 i8 i8 i8)))
  7. (type (struct (field $x1 i32) (field $y1 i32)))
  8. (type (struct (field i8 i16 i32 i64 f32 f64 anyref funcref (ref 0) (ref null 1))))
  9. (type (struct (field i32 i64 i8) (field) (field) (field (ref null i31) anyref)))
  10. (type (struct (field $x2 i32) (field f32 f64) (field $y2 i32)))
  11. )
  12. (assert_malformed
  13. (module quote
  14. "(type (struct (field $x i32) (field $x i32)))"
  15. )
  16. "duplicate field"
  17. )
  18. ;; Binding structure
  19. (module
  20. (rec
  21. (type $s0 (struct (field (ref 0) (ref 1) (ref $s0) (ref $s1))))
  22. (type $s1 (struct (field (ref 0) (ref 1) (ref $s0) (ref $s1))))
  23. )
  24. (func (param (ref $forward)))
  25. (type $forward (struct))
  26. )
  27. (assert_invalid
  28. (module (type (struct (field (ref 1)))))
  29. "unknown type"
  30. )
  31. (assert_invalid
  32. (module (type (struct (field (mut (ref 1))))))
  33. "unknown type"
  34. )
  35. ;; Field names
  36. (module
  37. (type (struct (field $x i32)))
  38. (type $t1 (struct (field i32) (field $x f32)))
  39. (type $t2 (struct (field i32 i32) (field $x i64)))
  40. (func (param (ref 0)) (result i32) (struct.get 0 $x (local.get 0)))
  41. (func (param (ref $t1)) (result f32) (struct.get 1 $x (local.get 0)))
  42. (func (param (ref $t2)) (result i64) (struct.get $t2 $x (local.get 0)))
  43. )
  44. (assert_invalid
  45. (module
  46. (type (struct (field $x i64)))
  47. (type $t (struct (field $x i32)))
  48. (func (param (ref 0)) (result i32) (struct.get 0 $x (local.get 0)))
  49. )
  50. "type mismatch"
  51. )
  52. ;; Basic instructions
  53. (module
  54. (type $vec (struct (field f32) (field $y (mut f32)) (field $z f32)))
  55. (global (ref $vec) (struct.new $vec (f32.const 1) (f32.const 2) (f32.const 3)))
  56. (global (ref $vec) (struct.new_default $vec))
  57. (func (export "new") (result anyref)
  58. (struct.new_default $vec)
  59. )
  60. (func $get_0_0 (param $v (ref $vec)) (result f32)
  61. (struct.get 0 0 (local.get $v))
  62. )
  63. (func (export "get_0_0") (result f32)
  64. (call $get_0_0 (struct.new_default $vec))
  65. )
  66. (func $get_vec_0 (param $v (ref $vec)) (result f32)
  67. (struct.get $vec 0 (local.get $v))
  68. )
  69. (func (export "get_vec_0") (result f32)
  70. (call $get_vec_0 (struct.new_default $vec))
  71. )
  72. (func $get_0_y (param $v (ref $vec)) (result f32)
  73. (struct.get 0 $y (local.get $v))
  74. )
  75. (func (export "get_0_y") (result f32)
  76. (call $get_0_y (struct.new_default $vec))
  77. )
  78. (func $get_vec_y (param $v (ref $vec)) (result f32)
  79. (struct.get $vec $y (local.get $v))
  80. )
  81. (func (export "get_vec_y") (result f32)
  82. (call $get_vec_y (struct.new_default $vec))
  83. )
  84. (func $set_get_y (param $v (ref $vec)) (param $y f32) (result f32)
  85. (struct.set $vec $y (local.get $v) (local.get $y))
  86. (struct.get $vec $y (local.get $v))
  87. )
  88. (func (export "set_get_y") (param $y f32) (result f32)
  89. (call $set_get_y (struct.new_default $vec) (local.get $y))
  90. )
  91. (func $set_get_1 (param $v (ref $vec)) (param $y f32) (result f32)
  92. (struct.set $vec 1 (local.get $v) (local.get $y))
  93. (struct.get $vec $y (local.get $v))
  94. )
  95. (func (export "set_get_1") (param $y f32) (result f32)
  96. (call $set_get_1 (struct.new_default $vec) (local.get $y))
  97. )
  98. )
  99. (assert_return (invoke "new") (ref.struct))
  100. (assert_return (invoke "get_0_0") (f32.const 0))
  101. (assert_return (invoke "get_vec_0") (f32.const 0))
  102. (assert_return (invoke "get_0_y") (f32.const 0))
  103. (assert_return (invoke "get_vec_y") (f32.const 0))
  104. (assert_return (invoke "set_get_y" (f32.const 7)) (f32.const 7))
  105. (assert_return (invoke "set_get_1" (f32.const 7)) (f32.const 7))
  106. (assert_invalid
  107. (module
  108. (type $s (struct (field i64)))
  109. (func (export "struct.set-immutable") (param $s (ref $s))
  110. (struct.set $s 0 (local.get $s) (i64.const 1))
  111. )
  112. )
  113. "field is immutable"
  114. )
  115. ;; Null dereference
  116. (module
  117. (type $t (struct (field i32 (mut i32))))
  118. (func (export "struct.get-null")
  119. (local (ref null $t)) (drop (struct.get $t 1 (local.get 0)))
  120. )
  121. (func (export "struct.set-null")
  122. (local (ref null $t)) (struct.set $t 1 (local.get 0) (i32.const 0))
  123. )
  124. )
  125. (assert_trap (invoke "struct.get-null") "null structure")
  126. (assert_trap (invoke "struct.set-null") "null structure")
  127. ;; Packed field instructions
  128. (module
  129. (type $s (struct (field i8) (field (mut i8)) (field i16) (field (mut i16))))
  130. (global (export "g0") (ref $s) (struct.new $s (i32.const 0) (i32.const 1) (i32.const 2) (i32.const 3)))
  131. (global (export "g1") (ref $s) (struct.new $s (i32.const 254) (i32.const 255) (i32.const 65534) (i32.const 65535)))
  132. (func (export "get_packed_g0_0") (result i32 i32)
  133. (struct.get_s 0 0 (global.get 0))
  134. (struct.get_u 0 0 (global.get 0))
  135. )
  136. (func (export "get_packed_g1_0") (result i32 i32)
  137. (struct.get_s 0 0 (global.get 1))
  138. (struct.get_u 0 0 (global.get 1))
  139. )
  140. (func (export "get_packed_g0_1") (result i32 i32)
  141. (struct.get_s 0 1 (global.get 0))
  142. (struct.get_u 0 1 (global.get 0))
  143. )
  144. (func (export "get_packed_g1_1") (result i32 i32)
  145. (struct.get_s 0 1 (global.get 1))
  146. (struct.get_u 0 1 (global.get 1))
  147. )
  148. (func (export "get_packed_g0_2") (result i32 i32)
  149. (struct.get_s 0 2 (global.get 0))
  150. (struct.get_u 0 2 (global.get 0))
  151. )
  152. (func (export "get_packed_g1_2") (result i32 i32)
  153. (struct.get_s 0 2 (global.get 1))
  154. (struct.get_u 0 2 (global.get 1))
  155. )
  156. (func (export "get_packed_g0_3") (result i32 i32)
  157. (struct.get_s 0 3 (global.get 0))
  158. (struct.get_u 0 3 (global.get 0))
  159. )
  160. (func (export "get_packed_g1_3") (result i32 i32)
  161. (struct.get_s 0 3 (global.get 1))
  162. (struct.get_u 0 3 (global.get 1))
  163. )
  164. (func (export "set_get_packed_g0_1") (param i32) (result i32 i32)
  165. (struct.set 0 1 (global.get 0) (local.get 0))
  166. (struct.get_s 0 1 (global.get 0))
  167. (struct.get_u 0 1 (global.get 0))
  168. )
  169. (func (export "set_get_packed_g0_3") (param i32) (result i32 i32)
  170. (struct.set 0 3 (global.get 0) (local.get 0))
  171. (struct.get_s 0 3 (global.get 0))
  172. (struct.get_u 0 3 (global.get 0))
  173. )
  174. )
  175. (assert_return (invoke "get_packed_g0_0") (i32.const 0) (i32.const 0))
  176. (assert_return (invoke "get_packed_g1_0") (i32.const -2) (i32.const 254))
  177. (assert_return (invoke "get_packed_g0_1") (i32.const 1) (i32.const 1))
  178. (assert_return (invoke "get_packed_g1_1") (i32.const -1) (i32.const 255))
  179. (assert_return (invoke "get_packed_g0_2") (i32.const 2) (i32.const 2))
  180. (assert_return (invoke "get_packed_g1_2") (i32.const -2) (i32.const 65534))
  181. (assert_return (invoke "get_packed_g0_3") (i32.const 3) (i32.const 3))
  182. (assert_return (invoke "get_packed_g1_3") (i32.const -1) (i32.const 65535))
  183. (assert_return (invoke "set_get_packed_g0_1" (i32.const 257)) (i32.const 1) (i32.const 1))
  184. (assert_return (invoke "set_get_packed_g0_3" (i32.const 257)) (i32.const 257) (i32.const 257))