diff options
author | Alon Zakai <alonzakai@gmail.com> | 2015-11-19 10:49:47 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2015-11-19 10:49:47 -0800 |
commit | b800f24ee3bc90fcd22b55fb04dd4e30de3510d5 (patch) | |
tree | 9bdfa4ee0a1c03456519a8a358b4613902a4f694 /src | |
parent | a2505ffa27be948780e3c0953ed8883f6dddc1e5 (diff) | |
download | binaryen-b800f24ee3bc90fcd22b55fb04dd4e30de3510d5.tar.gz binaryen-b800f24ee3bc90fcd22b55fb04dd4e30de3510d5.tar.bz2 binaryen-b800f24ee3bc90fcd22b55fb04dd4e30de3510d5.zip |
stricted break checking, per latest spec update
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm-validator.h | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/wasm-validator.h b/src/wasm-validator.h index 49e7a6a33..435fd1118 100644 --- a/src/wasm-validator.h +++ b/src/wasm-validator.h @@ -19,6 +19,26 @@ public: // visitors + void visitLoop(Loop *curr) override { + if (curr->in.is()) { + // the "in" label has a none type, since no one can receive its value. make sure no one breaks to it with a value. + struct ChildChecker : public WasmWalker { + Name in; + bool valid = true; + + ChildChecker(Name in) : in(in) {} + + void visitBreak(Break *curr) override { + if (curr->name == in && curr->value) { + valid = false; + } + } + }; + ChildChecker childChecker(curr->in); + childChecker.walk(curr->body); + shouldBeTrue(childChecker.valid); + } + } void visitSetLocal(SetLocal *curr) override { shouldBeTrue(curr->type == curr->value->type); } |