14d129904SAlex Crichton;;! component_model_threading = true
24d129904SAlex Crichton
34d129904SAlex Crichton(component definition $Tester
44d129904SAlex Crichton  (core module $Memory
54d129904SAlex Crichton    (table (export "t") 1 funcref)
64d129904SAlex Crichton  )
74d129904SAlex Crichton  (core instance $memory (instantiate $Memory))
84d129904SAlex Crichton
94d129904SAlex Crichton  (core type $ft (func (param i32)))
104d129904SAlex Crichton  (core func $thread.new-indirect (canon thread.new-indirect $ft (table $memory "t")))
11*d2fbd2deSAlex Crichton  (core func $thread.suspend-to-suspended (canon thread.suspend-to-suspended))
124d129904SAlex Crichton  (core func $thread.suspend (canon thread.suspend))
13*d2fbd2deSAlex Crichton  (core func $thread.unsuspend (canon thread.unsuspend))
14*d2fbd2deSAlex Crichton  (core func $thread.yield-to-suspended (canon thread.yield-to-suspended))
154d129904SAlex Crichton
164d129904SAlex Crichton  (core module $DM
174d129904SAlex Crichton    (import "" "thread.new-indirect" (func $thread.new-indirect (param i32 i32) (result i32)))
18*d2fbd2deSAlex Crichton    (import "" "thread.suspend-to-suspended" (func $thread.suspend-to-suspended (param i32) (result i32)))
194d129904SAlex Crichton    (import "" "thread.suspend" (func $thread.suspend (result i32)))
20*d2fbd2deSAlex Crichton    (import "" "thread.unsuspend" (func $thread.unsuspend (param i32)))
21*d2fbd2deSAlex Crichton    (import "" "thread.yield-to-suspended" (func $thread.yield-to-suspended (param i32) (result i32)))
224d129904SAlex Crichton
234d129904SAlex Crichton    (func (export "noop"))
244d129904SAlex Crichton    (func (export "trap-calling-thread-new-indirect") (call $thread.new-indirect (i32.const 0) (i32.const 0)) drop)
25*d2fbd2deSAlex Crichton    (func (export "trap-calling-thread-suspend-to-suspended") (call $thread.suspend-to-suspended (i32.const 0)) drop)
264d129904SAlex Crichton    (func (export "trap-calling-thread-suspend") (call $thread.suspend) drop)
27*d2fbd2deSAlex Crichton    (func (export "trap-calling-thread-unsuspend") (call $thread.unsuspend (i32.const 0)))
28*d2fbd2deSAlex Crichton    (func (export "trap-calling-thread-yield-to-suspended") (call $thread.yield-to-suspended (i32.const 0)) drop)
294d129904SAlex Crichton  )
304d129904SAlex Crichton  (core instance $dm (instantiate $DM (with "" (instance
314d129904SAlex Crichton    (export "thread.new-indirect" (func $thread.new-indirect))
32*d2fbd2deSAlex Crichton    (export "thread.suspend-to-suspended" (func $thread.suspend-to-suspended))
334d129904SAlex Crichton    (export "thread.suspend" (func $thread.suspend))
34*d2fbd2deSAlex Crichton    (export "thread.unsuspend" (func $thread.unsuspend))
35*d2fbd2deSAlex Crichton    (export "thread.yield-to-suspended" (func $thread.yield-to-suspended))
364d129904SAlex Crichton  ))))
374d129904SAlex Crichton  (func (export "trap-calling-thread-new-indirect")
384d129904SAlex Crichton    (canon lift (core func $dm "noop")
394d129904SAlex Crichton      (post-return (func $dm "trap-calling-thread-new-indirect"))))
40*d2fbd2deSAlex Crichton  (func (export "trap-calling-thread-suspend-to-suspended")
414d129904SAlex Crichton    (canon lift (core func $dm "noop")
42*d2fbd2deSAlex Crichton      (post-return (func $dm "trap-calling-thread-suspend-to-suspended"))))
434d129904SAlex Crichton  (func (export "trap-calling-thread-suspend")
444d129904SAlex Crichton    (canon lift (core func $dm "noop")
454d129904SAlex Crichton      (post-return (func $dm "trap-calling-thread-suspend"))))
46*d2fbd2deSAlex Crichton  (func (export "trap-calling-thread-unsuspend")
474d129904SAlex Crichton    (canon lift (core func $dm "noop")
48*d2fbd2deSAlex Crichton      (post-return (func $dm "trap-calling-thread-unsuspend"))))
49*d2fbd2deSAlex Crichton  (func (export "trap-calling-thread-yield-to-suspended")
504d129904SAlex Crichton    (canon lift (core func $dm "noop")
51*d2fbd2deSAlex Crichton      (post-return (func $dm "trap-calling-thread-yield-to-suspended"))))
524d129904SAlex Crichton)
534d129904SAlex Crichton
544d129904SAlex Crichton(component instance $i0 $Tester)
554d129904SAlex Crichton(assert_trap (invoke "trap-calling-thread-new-indirect") "cannot leave component instance")
564d129904SAlex Crichton(component instance $i1 $Tester)
57*d2fbd2deSAlex Crichton(assert_trap (invoke "trap-calling-thread-suspend-to-suspended") "cannot leave component instance")
584d129904SAlex Crichton(component instance $i2 $Tester)
594d129904SAlex Crichton(assert_trap (invoke "trap-calling-thread-suspend") "cannot leave component instance")
604d129904SAlex Crichton(component instance $i3 $Tester)
61*d2fbd2deSAlex Crichton(assert_trap (invoke "trap-calling-thread-unsuspend") "cannot leave component instance")
624d129904SAlex Crichton(component instance $i4 $Tester)
63*d2fbd2deSAlex Crichton(assert_trap (invoke "trap-calling-thread-yield-to-suspended") "cannot leave component instance")
64