summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-11-19 10:49:47 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-11-19 10:49:47 -0800
commitb800f24ee3bc90fcd22b55fb04dd4e30de3510d5 (patch)
tree9bdfa4ee0a1c03456519a8a358b4613902a4f694 /src
parenta2505ffa27be948780e3c0953ed8883f6dddc1e5 (diff)
downloadbinaryen-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.h20
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);
}