Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions src/wast-parser.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2282,26 +2282,33 @@ Result WastParser::ParseResultList(TypeVector* result_types,

Result WastParser::ParseInstrList(ExprList* exprs) {
WABT_TRACE(ParseInstrList);
// Keep going after a bad instruction so the rest of the errors get reported,
// but remember that one was dropped. Returning Ok here would tell the caller
// the field parsed cleanly when part of it was thrown away, and anything the
// discarded expressions registered for later would outlive them.
Result result = Result::Ok;
ExprList new_exprs;
while (true) {
auto pair = PeekPair();
if (IsInstr(pair)) {
if (Succeeded(ParseInstr(&new_exprs))) {
exprs->splice(exprs->end(), new_exprs);
} else {
result = Result::Error;
CHECK_RESULT(Synchronize(IsInstr));
}
} else if (IsLparAnn(pair)) {
if (Succeeded(ParseCodeMetadataAnnotation(&new_exprs))) {
exprs->splice(exprs->end(), new_exprs);
} else {
result = Result::Error;
CHECK_RESULT(Synchronize(IsLparAnn));
}
} else {
break;
}
}
return Result::Ok;
return result;
}

Result WastParser::ParseTerminatingInstrList(ExprList* exprs) {
Expand Down Expand Up @@ -3433,15 +3440,17 @@ Result WastParser::ParseBlock(Block* block) {

Result WastParser::ParseExprList(ExprList* exprs) {
WABT_TRACE(ParseExprList);
Result result = Result::Ok;
ExprList new_exprs;
while (PeekMatchExpr()) {
if (Succeeded(ParseExpr(&new_exprs))) {
exprs->splice(exprs->end(), new_exprs);
} else {
result = Result::Error;
CHECK_RESULT(Synchronize(IsExpr));
}
}
return Result::Ok;
return result;
}

Result WastParser::ParseExpr(ExprList* exprs) {
Expand Down
32 changes: 32 additions & 0 deletions test/parse/bad-block-ref-result-discarded.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
;;; TOOL: wat2wasm
;;; ARGS: --enable-function-references
;;; ERROR: 1
;; The block registers its result type for later resolution, then fails to
;; parse and is discarded. Resolution used to run over the freed block.
(func $n(param $r(ref $t))(result i32)(call_ref $t(block $l(result(ref $t))(n(l g(t f)n l(local.get $r))
(;; STDERR ;;;
out/test/parse/bad-block-ref-result-discarded.txt:6:76: error: unexpected token (, expected ).
...result i32)(call_ref $t(block $l(result(ref $t))(n(l g(t f)n l(local.get $r))
^
out/test/parse/bad-block-ref-result-discarded.txt:6:77: error: unexpected token n.
...result i32)(call_ref $t(block $l(result(ref $t))(n(l g(t f)n l(local.get $r))
^
out/test/parse/bad-block-ref-result-discarded.txt:6:79: error: unexpected token l.
...result i32)(call_ref $t(block $l(result(ref $t))(n(l g(t f)n l(local.get $r))
^
out/test/parse/bad-block-ref-result-discarded.txt:6:81: error: unexpected token g.
...result i32)(call_ref $t(block $l(result(ref $t))(n(l g(t f)n l(local.get $r))
^
out/test/parse/bad-block-ref-result-discarded.txt:6:83: error: unexpected token t.
...result i32)(call_ref $t(block $l(result(ref $t))(n(l g(t f)n l(local.get $r))
^
out/test/parse/bad-block-ref-result-discarded.txt:6:85: error: unexpected token f.
...result i32)(call_ref $t(block $l(result(ref $t))(n(l g(t f)n l(local.get $r))
^
out/test/parse/bad-block-ref-result-discarded.txt:6:87: error: unexpected token n.
...result i32)(call_ref $t(block $l(result(ref $t))(n(l g(t f)n l(local.get $r))
^
out/test/parse/bad-block-ref-result-discarded.txt:6:89: error: unexpected token l.
...result i32)(call_ref $t(block $l(result(ref $t))(n(l g(t f)n l(local.get $r))
^
;;; STDERR ;;)
3 changes: 0 additions & 3 deletions test/parse/expr/bad-load-align.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,4 @@
out/test/parse/expr/bad-load-align.txt:3:25: error: unexpected token align=foo, expected ).
(module (func (i32.load align=foo (i32.const 0))))
^^^^^^^^^
out/test/parse/expr/bad-load-align.txt:3:50: error: unexpected token ), expected EOF.
(module (func (i32.load align=foo (i32.const 0))))
^
;;; STDERR ;;)
3 changes: 0 additions & 3 deletions test/parse/expr/bad-try-delegate.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,4 @@
out/test/parse/expr/bad-try-delegate.txt:5:25: error: unexpected token ")", expected a numeric index or a name (e.g. 12 or $foo).
(func try nop delegate)
^
out/test/parse/expr/bad-try-delegate.txt:6:28: error: unexpected token end, expected ).
(func try nop delegate 0 end)
^^^
;;; STDERR ;;)
6 changes: 0 additions & 6 deletions test/parse/expr/bad-try-multiple-catch.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,7 @@
out/test/parse/expr/bad-try-multiple-catch.txt:11:5: error: multiple catch_all clauses not allowed
catch_all
^^^^^^^^^
out/test/parse/expr/bad-try-multiple-catch.txt:13:5: error: unexpected token end, expected ).
end)
^^^
out/test/parse/expr/bad-try-multiple-catch.txt:22:8: error: multiple catch_all clauses not allowed
(catch_all
^^^^^^^^^
out/test/parse/expr/bad-try-multiple-catch.txt:23:16: error: unexpected token ), expected EOF.
(nop))))
^
;;; STDERR ;;)
3 changes: 0 additions & 3 deletions test/spec/block.txt
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,6 @@ out/test/spec/block.wast:464: assert_malformed passed:
out/test/spec/block/block.7.wat:1:35: error: unexpected token $x, expected ).
(func (i32.const 0) (block (param $x i32) (drop)))
^^
out/test/spec/block/block.7.wat:1:50: error: unexpected token ), expected EOF.
(func (i32.const 0) (block (param $x i32) (drop)))
^
out/test/spec/block.wast:468: assert_malformed passed:
out/test/spec/block/block.8.wat:1:25: error: expected 0 results, got 1
(type $sig (func))(func (block (type $sig) (result i32) (i32.const 0)) (unrea...
Expand Down
21 changes: 0 additions & 21 deletions test/spec/call_indirect.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,51 +23,30 @@ out/test/spec/call_indirect.wast:669: assert_malformed passed:
out/test/spec/call_indirect/call_indirect.2.wat:1:122: error: unexpected token "param", expected an expr.
...indirect (type $sig) (result i32) (param i32) (i32.const 0) (i32.const ...
^^^^^
out/test/spec/call_indirect/call_indirect.2.wat:1:166: error: unexpected token ), expected EOF.
...irect (type $sig) (result i32) (param i32) (i32.const 0) (i32.const 0) ))
^
out/test/spec/call_indirect.wast:681: assert_malformed passed:
out/test/spec/call_indirect/call_indirect.3.wat:1:109: error: unexpected token "type", expected an expr.
... i32) (call_indirect (param i32) (type $sig) (result i32) (i32.const 0...
^^^^
out/test/spec/call_indirect/call_indirect.3.wat:1:166: error: unexpected token ), expected EOF.
...irect (param i32) (type $sig) (result i32) (i32.const 0) (i32.const 0) ))
^
out/test/spec/call_indirect.wast:693: assert_malformed passed:
out/test/spec/call_indirect/call_indirect.4.wat:1:122: error: unexpected token "type", expected an expr.
...indirect (param i32) (result i32) (type $sig) (i32.const 0) (i32.const ...
^^^^
out/test/spec/call_indirect/call_indirect.4.wat:1:166: error: unexpected token ), expected EOF.
...irect (param i32) (result i32) (type $sig) (i32.const 0) (i32.const 0) ))
^
out/test/spec/call_indirect.wast:705: assert_malformed passed:
out/test/spec/call_indirect/call_indirect.5.wat:1:110: error: unexpected token "type", expected an expr.
...i32) (call_indirect (result i32) (type $sig) (param i32) (i32.const 0)...
^^^^
out/test/spec/call_indirect/call_indirect.5.wat:1:166: error: unexpected token ), expected EOF.
...irect (result i32) (type $sig) (param i32) (i32.const 0) (i32.const 0) ))
^
out/test/spec/call_indirect.wast:717: assert_malformed passed:
out/test/spec/call_indirect/call_indirect.6.wat:1:110: error: unexpected token "param", expected an expr.
...i32) (call_indirect (result i32) (param i32) (type $sig) (i32.const 0)...
^^^^^
out/test/spec/call_indirect/call_indirect.6.wat:1:166: error: unexpected token ), expected EOF.
...irect (result i32) (param i32) (type $sig) (i32.const 0) (i32.const 0) ))
^
out/test/spec/call_indirect.wast:729: assert_malformed passed:
out/test/spec/call_indirect/call_indirect.7.wat:1:67: error: unexpected token "param", expected an expr.
...t i32) (call_indirect (result i32) (param i32) (i32.const 0) (i32.const 0)))
^^^^^
out/test/spec/call_indirect/call_indirect.7.wat:1:106: error: unexpected token ), expected EOF.
...t i32) (call_indirect (result i32) (param i32) (i32.const 0) (i32.const 0)))
^
out/test/spec/call_indirect.wast:739: assert_malformed passed:
out/test/spec/call_indirect/call_indirect.8.wat:1:46: error: unexpected token $x, expected ).
...e 0 funcref)(func (call_indirect (param $x i32) (i32.const 0) (i32.const 0)))
^^
out/test/spec/call_indirect/call_indirect.8.wat:1:82: error: unexpected token ), expected EOF.
...e 0 funcref)(func (call_indirect (param $x i32) (i32.const 0) (i32.const 0)))
^
out/test/spec/call_indirect.wast:746: assert_malformed passed:
out/test/spec/call_indirect/call_indirect.9.wat:1:57: error: expected 0 results, got 1
...0 funcref)(func (result i32) (call_indirect (type $sig) (result i32) (i32...
Expand Down
3 changes: 0 additions & 3 deletions test/spec/function-references/if.txt
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,6 @@ out/test/spec/function-references/if.wast:788: assert_malformed passed:
out/test/spec/function-references/if/if.7.wat:1:47: error: unexpected token $x, expected ).
...(i32.const 0) (i32.const 1) (if (param $x i32) (then (drop)) (else (drop))))
^^
out/test/spec/function-references/if/if.7.wat:1:69: error: unexpected token (, expected EOF.
...(i32.const 0) (i32.const 1) (if (param $x i32) (then (drop)) (else (drop))))
^
out/test/spec/function-references/if.wast:796: assert_malformed passed:
out/test/spec/function-references/if/if.8.wat:1:40: error: expected 0 results, got 1
(type $sig (func))(func (i32.const 1) (if (type $sig) (result i32) (then (i3...
Expand Down
21 changes: 0 additions & 21 deletions test/spec/function-references/return_call_indirect.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,51 +13,30 @@ out/test/spec/function-references/return_call_indirect.wast:273: assert_malforme
out/test/spec/function-references/return_call_indirect/return_call_indirect.1.wat:1:129: error: unexpected token "param", expected an expr.
...indirect (type $sig) (result i32) (param i32) (i32.const 0) (i32.const ...
^^^^^
out/test/spec/function-references/return_call_indirect/return_call_indirect.1.wat:1:173: error: unexpected token ), expected EOF.
...irect (type $sig) (result i32) (param i32) (i32.const 0) (i32.const 0) ))
^
out/test/spec/function-references/return_call_indirect.wast:285: assert_malformed passed:
out/test/spec/function-references/return_call_indirect/return_call_indirect.2.wat:1:116: error: unexpected token "type", expected an expr.
...(return_call_indirect (param i32) (type $sig) (result i32) (i32.const 0...
^^^^
out/test/spec/function-references/return_call_indirect/return_call_indirect.2.wat:1:173: error: unexpected token ), expected EOF.
...irect (param i32) (type $sig) (result i32) (i32.const 0) (i32.const 0) ))
^
out/test/spec/function-references/return_call_indirect.wast:297: assert_malformed passed:
out/test/spec/function-references/return_call_indirect/return_call_indirect.3.wat:1:129: error: unexpected token "type", expected an expr.
...indirect (param i32) (result i32) (type $sig) (i32.const 0) (i32.const ...
^^^^
out/test/spec/function-references/return_call_indirect/return_call_indirect.3.wat:1:173: error: unexpected token ), expected EOF.
...irect (param i32) (result i32) (type $sig) (i32.const 0) (i32.const 0) ))
^
out/test/spec/function-references/return_call_indirect.wast:309: assert_malformed passed:
out/test/spec/function-references/return_call_indirect/return_call_indirect.4.wat:1:117: error: unexpected token "type", expected an expr.
...return_call_indirect (result i32) (type $sig) (param i32) (i32.const 0)...
^^^^
out/test/spec/function-references/return_call_indirect/return_call_indirect.4.wat:1:173: error: unexpected token ), expected EOF.
...irect (result i32) (type $sig) (param i32) (i32.const 0) (i32.const 0) ))
^
out/test/spec/function-references/return_call_indirect.wast:321: assert_malformed passed:
out/test/spec/function-references/return_call_indirect/return_call_indirect.5.wat:1:117: error: unexpected token "param", expected an expr.
...return_call_indirect (result i32) (param i32) (type $sig) (i32.const 0)...
^^^^^
out/test/spec/function-references/return_call_indirect/return_call_indirect.5.wat:1:173: error: unexpected token ), expected EOF.
...irect (result i32) (param i32) (type $sig) (i32.const 0) (i32.const 0) ))
^
out/test/spec/function-references/return_call_indirect.wast:333: assert_malformed passed:
out/test/spec/function-references/return_call_indirect/return_call_indirect.6.wat:1:74: error: unexpected token "param", expected an expr.
...return_call_indirect (result i32) (param i32) (i32.const 0) (i32.const ...
^^^^^
out/test/spec/function-references/return_call_indirect/return_call_indirect.6.wat:1:118: error: unexpected token ), expected EOF.
...urn_call_indirect (result i32) (param i32) (i32.const 0) (i32.const 0) ))
^
out/test/spec/function-references/return_call_indirect.wast:345: assert_malformed passed:
out/test/spec/function-references/return_call_indirect/return_call_indirect.7.wat:1:53: error: unexpected token $x, expected ).
...cref)(func (return_call_indirect (param $x i32) (i32.const 0) (i32.const 0)))
^^
out/test/spec/function-references/return_call_indirect/return_call_indirect.7.wat:1:89: error: unexpected token ), expected EOF.
...cref)(func (return_call_indirect (param $x i32) (i32.const 0) (i32.const 0)))
^
out/test/spec/function-references/return_call_indirect.wast:352: assert_malformed passed:
out/test/spec/function-references/return_call_indirect/return_call_indirect.8.wat:1:57: error: expected 0 results, got 1
...ncref)(func (result i32) (return_call_indirect (type $sig) (result i32) (...
Expand Down
3 changes: 0 additions & 3 deletions test/spec/if.txt
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,6 @@ out/test/spec/if.wast:788: assert_malformed passed:
out/test/spec/if/if.7.wat:1:47: error: unexpected token $x, expected ).
...(i32.const 0) (i32.const 1) (if (param $x i32) (then (drop)) (else (drop))))
^^
out/test/spec/if/if.7.wat:1:69: error: unexpected token (, expected EOF.
...(i32.const 0) (i32.const 1) (if (param $x i32) (then (drop)) (else (drop))))
^
out/test/spec/if.wast:796: assert_malformed passed:
out/test/spec/if/if.8.wat:1:40: error: expected 0 results, got 1
(type $sig (func))(func (i32.const 1) (if (type $sig) (result i32) (then (i3...
Expand Down
3 changes: 0 additions & 3 deletions test/spec/loop.txt
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,6 @@ out/test/spec/loop.wast:568: assert_malformed passed:
out/test/spec/loop/loop.7.wat:1:34: error: unexpected token $x, expected ).
(func (i32.const 0) (loop (param $x i32) (drop)))
^^
out/test/spec/loop/loop.7.wat:1:49: error: unexpected token ), expected EOF.
(func (i32.const 0) (loop (param $x i32) (drop)))
^
out/test/spec/loop.wast:572: assert_malformed passed:
out/test/spec/loop/loop.8.wat:1:25: error: expected 0 results, got 1
(type $sig (func))(func (loop (type $sig) (result i32) (i32.const 0)) (unreac...
Expand Down
Loading
Loading