@@ -168,7 +168,19 @@ extension WastRunContext {
168168 }
169169 return instance
170170 }
171- func deriveModuleInstance( from execute: WastExecute ) throws -> Instance ? {
171+ func deriveInstance( by name: String ? ) throws -> Instance {
172+ let instance : Instance ?
173+ if let name {
174+ instance = lookupInstance ( name)
175+ } else {
176+ instance = currentInstance
177+ }
178+ guard let instance else {
179+ throw SpectestError ( " no module to execute " )
180+ }
181+ return instance
182+ }
183+ func deriveInstance( from execute: WastExecute ) throws -> Instance ? {
172184 switch execute {
173185 case . invoke( let invoke) :
174186 if let module = invoke. module {
@@ -263,54 +275,17 @@ extension WastRunContext {
263275 return . passed
264276
265277 case . assertReturn( let execute, let results) :
266- let instance : Instance ?
267- do {
268- instance = try deriveModuleInstance ( from: execute)
269- } catch {
270- return . failed( " failed to derive module instance: \( error) " )
271- }
272- guard let instance else {
273- return . failed( " no module to execute " )
274- }
275-
276278 let expected = parseValues ( args: results)
277-
278- switch execute {
279- case . invoke( let invoke) :
280- let result : [ WasmKit . Value ]
281- do {
282- result = try wastInvoke ( call: invoke)
283- } catch {
284- return . failed( " \( error) " )
285- }
286- guard result. isTestEquivalent ( to: expected) else {
287- return . failed( " invoke result mismatch: expected: \( expected) , actual: \( result) " )
288- }
289- return . passed
290-
291- case . get( _, let globalName) :
292- let result : WasmKit . Value
293- do {
294- guard case let . global( global) = instance. export ( globalName) else {
295- throw Trap . _raw ( " no global export with name \( globalName) in a module instance \( instance) " )
296- }
297- result = global. value
298- } catch {
299- return . failed( " \( error) " )
300- }
301- guard result. isTestEquivalent ( to: expected [ 0 ] ) else {
302- return . failed( " get result mismatch: expected: \( expected) , actual: \( result) " )
303- }
304- return . passed
305- case . wat: return . skipped( " TBD " )
279+ let actual = try wastExecute ( execute: execute)
280+ guard actual. isTestEquivalent ( to: expected) else {
281+ return . failed( " invoke result mismatch: expected: \( expected) , actual: \( actual) " )
306282 }
307-
283+ return . passed
308284 case . assertTrap( let execute, let message) :
309285 switch execute {
310286 case . invoke( let invoke) :
311287 do {
312288 _ = try wastInvoke ( call: invoke)
313- // XXX: This is wrong but just keep it as is
314289 return . failed( " trap expected: \( message) " )
315290 } catch let trap as Trap {
316291 guard trap. assertionText. contains ( message) else {
@@ -367,16 +342,26 @@ extension WastRunContext {
367342 }
368343 }
369344
370- private func wastInvoke( call: WastInvoke ) throws -> [ Value ] {
371- let instance : Instance ?
372- do {
373- instance = try deriveModuleInstance ( from: . invoke( call) )
374- } catch {
375- throw SpectestError ( " failed to derive module instance: \( error) " )
376- }
377- guard let instance else {
378- throw SpectestError ( " no module to execute " )
345+ private func wastExecute( execute: WastExecute ) throws -> [ Value ] {
346+ switch execute {
347+ case . invoke( let invoke) :
348+ return try wastInvoke ( call: invoke)
349+ case . get( let module, let globalName) :
350+ let instance = try deriveInstance ( by: module)
351+ let result : WasmKit . Value
352+ guard case let . global( global) = instance. export ( globalName) else {
353+ throw SpectestError ( " no global export with name \( globalName) in a module instance \( instance) " )
354+ }
355+ return [ global. value]
356+ case . wat( var wat) :
357+ let module = try parseModule ( rootPath: rootPath, moduleSource: . binary( wat. encode ( ) ) )
358+ _ = try instantiate ( module: module)
359+ return [ ]
379360 }
361+ }
362+
363+ private func wastInvoke( call: WastInvoke ) throws -> [ Value ] {
364+ let instance = try deriveInstance ( by: call. module)
380365 guard let function = instance. exportedFunction ( name: call. name) else {
381366 throw SpectestError ( " function \( call. name) not exported " )
382367 }
0 commit comments