@@ -9,9 +9,11 @@ protocol WastConstInstructionVisitor: InstructionVisitor {
99/// You can find its grammar definition in the [WebAssembly spec repository](https://github.com/WebAssembly/spec/blob/wg-1.0/interpreter/README.md#scripts)
1010struct WastParser {
1111 var parser : Parser
12+ let features : WasmFeatureSet
1213
13- init ( _ input: String ) {
14+ init ( _ input: String , features : WasmFeatureSet ) {
1415 self . parser = Parser ( input)
16+ self . features = features
1517 }
1618
1719 mutating func nextDirective( ) throws -> WastDirective ? {
@@ -24,7 +26,7 @@ struct WastParser {
2426 let location = originalParser. lexer. location ( )
2527 return . module(
2628 ModuleDirective (
27- source: . text( try parseWAT ( & originalParser) ) , id: nil , location: location
29+ source: . text( try parseWAT ( & originalParser, features : features ) ) , id: nil , location: location
2830 ) )
2931 }
3032 throw WatParserError ( " unexpected wast directive token " , location: parser. lexer. location ( ) )
@@ -78,7 +80,7 @@ struct WastParser {
7880 mutating func constExpression( ) throws -> [ Value ] {
7981 var values : [ Value ] = [ ]
8082 var collector = ConstExpressionCollector ( addValue: { values. append ( $0) } )
81- var exprParser = ExpressionParser < ConstExpressionCollector > ( lexer: parser. lexer)
83+ var exprParser = ExpressionParser < ConstExpressionCollector > ( lexer: parser. lexer, features : features )
8284 while try exprParser. parseWastConstInstruction ( visitor: & collector) { }
8385 parser = exprParser. parser
8486 return values
@@ -87,7 +89,7 @@ struct WastParser {
8789 mutating func expectationValues( ) throws -> [ WastExpectValue ] {
8890 var values : [ WastExpectValue ] = [ ]
8991 var collector = ConstExpressionCollector ( addValue: { values. append ( . value( $0) ) } )
90- var exprParser = ExpressionParser < ConstExpressionCollector > ( lexer: parser. lexer)
92+ var exprParser = ExpressionParser < ConstExpressionCollector > ( lexer: parser. lexer, features : features )
9193 while true {
9294 if let expectValue = try exprParser. parseWastExpectValue ( ) {
9395 values. append ( expectValue)
@@ -115,7 +117,7 @@ public enum WastExecute {
115117 execute = . invoke( try WastInvoke . parse ( wastParser: & wastParser) )
116118 case " module " :
117119 try wastParser. parser. consume ( )
118- execute = . wat( try parseWAT ( & wastParser. parser) )
120+ execute = . wat( try parseWAT ( & wastParser. parser, features : wastParser . features ) )
119121 try wastParser. parser. skipParenBlock ( )
120122 case " get " :
121123 try wastParser. parser. consume ( )
@@ -224,9 +226,10 @@ public enum WastDirective {
224226 return . assertExhaustion( call: call, message: message)
225227 case " assert_unlinkable " :
226228 try wastParser. parser. consume ( )
229+ let features = wastParser. features
227230 let module = try wastParser. parens {
228231 try $0. parser. expectKeyword ( " module " )
229- let wat = try parseWAT ( & $0. parser)
232+ let wat = try parseWAT ( & $0. parser, features : features )
230233 try $0. parser. skipParenBlock ( )
231234 return wat
232235 }
@@ -293,7 +296,7 @@ public enum ModuleSource {
293296 }
294297 }
295298
296- let watModule = try parseWAT ( & wastParser. parser)
299+ let watModule = try parseWAT ( & wastParser. parser, features : wastParser . features )
297300 try wastParser. parser. skipParenBlock ( )
298301 return . text( watModule)
299302 }
0 commit comments