@@ -102,6 +102,11 @@ pub enum WastDirective<'a> {
102102 span : Span ,
103103 exec : WastExecute < ' a > ,
104104 } ,
105+ Thread ( WastThread < ' a > ) ,
106+ Wait {
107+ span : Span ,
108+ thread : Id < ' a > ,
109+ } ,
105110}
106111
107112impl WastDirective < ' _ > {
@@ -119,8 +124,10 @@ impl WastDirective<'_> {
119124 | WastDirective :: AssertExhaustion { span, .. }
120125 | WastDirective :: AssertUnlinkable { span, .. }
121126 | WastDirective :: AssertInvalid { span, .. }
122- | WastDirective :: AssertException { span, .. } => * span,
127+ | WastDirective :: AssertException { span, .. }
128+ | WastDirective :: Wait { span, .. } => * span,
123129 WastDirective :: Invoke ( i) => i. span ,
130+ WastDirective :: Thread ( t) => t. span ,
124131 }
125132 }
126133}
@@ -192,6 +199,14 @@ impl<'a> Parse<'a> for WastDirective<'a> {
192199 span,
193200 exec : parser. parens ( |p| p. parse ( ) ) ?,
194201 } )
202+ } else if l. peek :: < kw:: thread > ( ) ? {
203+ Ok ( WastDirective :: Thread ( parser. parse ( ) ?) )
204+ } else if l. peek :: < kw:: wait > ( ) ? {
205+ let span = parser. parse :: < kw:: wait > ( ) ?. 0 ;
206+ Ok ( WastDirective :: Wait {
207+ span,
208+ thread : parser. parse ( ) ?,
209+ } )
195210 } else {
196211 Err ( l. error ( ) )
197212 }
@@ -363,3 +378,43 @@ impl<'a> Parse<'a> for WastRet<'a> {
363378 }
364379 }
365380}
381+
382+ #[ derive( Debug ) ]
383+ #[ allow( missing_docs) ]
384+ pub struct WastThread < ' a > {
385+ pub span : Span ,
386+ pub name : Id < ' a > ,
387+ pub shared_module : Option < Id < ' a > > ,
388+ pub directives : Vec < WastDirective < ' a > > ,
389+ }
390+
391+ impl < ' a > Parse < ' a > for WastThread < ' a > {
392+ fn parse ( parser : Parser < ' a > ) -> Result < Self > {
393+ parser. depth_check ( ) ?;
394+ let span = parser. parse :: < kw:: thread > ( ) ?. 0 ;
395+ let name = parser. parse ( ) ?;
396+
397+ let shared_module = if parser. peek2 :: < kw:: shared > ( ) ? {
398+ let name = parser. parens ( |p| {
399+ p. parse :: < kw:: shared > ( ) ?;
400+ p. parens ( |p| {
401+ p. parse :: < kw:: module > ( ) ?;
402+ p. parse ( )
403+ } )
404+ } ) ?;
405+ Some ( name)
406+ } else {
407+ None
408+ } ;
409+ let mut directives = Vec :: new ( ) ;
410+ while !parser. is_empty ( ) {
411+ directives. push ( parser. parens ( |p| p. parse ( ) ) ?) ;
412+ }
413+ Ok ( WastThread {
414+ span,
415+ name,
416+ shared_module,
417+ directives,
418+ } )
419+ }
420+ }
0 commit comments