1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
;; XXX BINARYEN: rename array.new_default => array.new_default_with_rtt
;; Type syntax
(module
(type (array i8))
(type (array i16))
(type (array i32))
(type (array i64))
(type (array f32))
(type (array f64))
(type (array anyref))
(type (array (ref data)))
(type (array (ref 0)))
(type (array (ref null 1)))
(type (array (rtt 1)))
(type (array (rtt 10 1)))
(type (array (mut i8)))
(type (array (mut i16)))
(type (array (mut i32)))
(type (array (mut i64)))
(type (array (mut i32)))
(type (array (mut i64)))
(type (array (mut anyref)))
(type (array (mut (ref data))))
(type (array (mut (ref 0))))
(type (array (mut (ref null i31))))
(type (array (mut (rtt 0))))
(type (array (mut (rtt 10 0))))
)
(assert_invalid
(module
(type (array (mut (ref null 10))))
)
"unknown type"
)
;; Binding structure
(module
(type $s0 (array (ref $s1)))
(type $s1 (array (ref $s0)))
(func (param (ref $forward)))
(type $forward (array i32))
)
(assert_invalid
(module (type (array (ref 1))))
"unknown type"
)
(assert_invalid
(module (type (array (mut (ref 1)))))
"unknown type"
)
;; Basic instructions
(module
(type $vec (array f32))
(type $mvec (array (mut f32)))
(func $get (param $i i32) (param $v (ref $vec)) (result f32)
(array.get $vec (local.get $v) (local.get $i))
)
(func (export "get") (param $i i32) (result f32)
(call $get (local.get $i)
(array.new_default_with_rtt $vec (i32.const 3) (rtt.canon $vec))
)
)
(func $set_get (param $i i32) (param $v (ref $mvec)) (param $y f32) (result f32)
(array.set $mvec (local.get $v) (local.get $i) (local.get $y))
(array.get $mvec (local.get $v) (local.get $i))
)
(func (export "set_get") (param $i i32) (param $y f32) (result f32)
(call $set_get (local.get $i)
(array.new_default_with_rtt $mvec (i32.const 3) (rtt.canon $mvec))
(local.get $y)
)
)
(func $len (param $v (ref $vec)) (result i32)
(array.len $vec (local.get $v))
)
(func (export "len") (result i32)
(call $len (array.new_default_with_rtt $vec (i32.const 3) (rtt.canon $vec)))
)
)
(assert_return (invoke "get" (i32.const 0)) (f32.const 0))
(assert_return (invoke "set_get" (i32.const 1) (f32.const 7)) (f32.const 7))
(assert_return (invoke "len") (i32.const 3))
(assert_trap (invoke "get" (i32.const 10)) "out of bounds")
(assert_trap (invoke "set_get" (i32.const 10) (f32.const 7)) "out of bounds")
(assert_invalid
(module
(type $a (array i64))
(func (export "array.set-immutable") (param $a (ref $a))
(array.set $a (local.get $a) (i32.const 0) (i64.const 1))
)
)
"array is immutable"
)
;; Null dereference
(module
(type $t (array (mut i32)))
(func (export "array.get-null")
(local (ref null $t)) (drop (array.get $t (local.get 0) (i32.const 0)))
)
(func (export "array.set-null")
(local (ref null $t)) (array.set $t (local.get 0) (i32.const 0) (i32.const 0))
)
)
(assert_trap (invoke "array.get-null") "null array")
(assert_trap (invoke "array.set-null") "null array")
(assert_invalid
(module
(type $t (array i32))
(func (export "array.new-null")
(local (ref null (rtt $t))) (drop (array.new_default_with_rtt $t (i32.const 1) (i32.const 3) (local.get 0)))
)
)
"type mismatch"
)
(assert_invalid
(module
(type $t (array (mut i32)))
(func (export "array.new_default_with_rtt-null")
(local (ref null (rtt $t))) (drop (array.new_default_with_rtt $t (i32.const 3) (local.get 0)))
)
)
"type mismatch"
)
|