summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xcheck.py2
-rw-r--r--src/wasm-interpreter.h16
-rw-r--r--src/wasm-s-parser.h11
3 files changed, 23 insertions, 6 deletions
diff --git a/check.py b/check.py
index 2f3cb7962..ebf69087a 100755
--- a/check.py
+++ b/check.py
@@ -84,7 +84,7 @@ if len(requested) == 0:
# 'address' : filed issue, test looks invalid
# 'labels', 'switch': todo once switch is stable
# 'memory' XXX TODO
- spec_tests = [os.path.join('spec', t + '.wast') for t in ['conversions', 'endianness', 'exports', 'f32_cmp', 'f32', 'f64_cmp', 'f64', 'fac', 'float_exprs', 'forward', 'func_ptrs', 'functions', 'has_feature', 'i32', 'i64', 'imports', 'int_exprs', 'int_literals', 'left-to-right', 'memory_redundancy', 'memory_trap', 'names', 'resizing', 'runaway-recursion', 'select', 'store_retval', 'traps']]
+ spec_tests = [os.path.join('spec', t + '.wast') for t in ['conversions', 'endianness', 'exports', 'f32_cmp', 'f32', 'f64_cmp', 'f64', 'fac', 'float_exprs', 'forward', 'func_ptrs', 'functions', 'has_feature', 'i32', 'i64', 'imports', 'int_exprs', 'int_literals', 'left-to-right', 'memory', 'memory_redundancy', 'memory_trap', 'names', 'resizing', 'runaway-recursion', 'select', 'store_retval', 'traps']]
else:
spec_tests = requested[:]
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h
index 918b65f02..527fd1abf 100644
--- a/src/wasm-interpreter.h
+++ b/src/wasm-interpreter.h
@@ -1,3 +1,4 @@
+
//
// Simple WebAssembly interpreter, designed to be embeddable in JavaScript, so it
// can function as a polyfill.
@@ -129,12 +130,12 @@ private:
doIndent(std::cout, indent);
std::cout << "visit " << name << " :\n";
indent++;
- doIndent(std::cout, indent);
- expression->print(std::cout, indent) << '\n';
- indent++;
+ //doIndent(std::cout, indent);
+ //expression->print(std::cout, indent) << '\n';
+ //indent++;
}
~IndentHandler() {
- indent--;
+ //indent--;
indent--;
doIndent(std::cout, indent);
std::cout << "exit " << name << '\n';
@@ -675,10 +676,17 @@ private:
assert(function);
FunctionScope scope(function, arguments);
+#ifdef WASM_INTERPRETER_DEBUG
+ std::cout << "entering " << function->name << '\n';
+#endif
+
Literal ret = ExpressionRunner(*this, scope).visit(function->body).value;
if (function->result == none) ret = Literal();
assert(function->result == ret.type);
callDepth--;
+#ifdef WASM_INTERPRETER_DEBUG
+ std::cout << "exiting " << function->name << '\n';
+#endif
return ret;
}
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h
index e92f56eea..677052984 100644
--- a/src/wasm-s-parser.h
+++ b/src/wasm-s-parser.h
@@ -849,6 +849,15 @@ private:
return ret;
}
+ Expression* makeMaybeBlock(Element &s, size_t i) {
+ if (s.size() == i+1) return parseExpression(s[i]);
+ auto ret = allocator.alloc<Block>();
+ for (; i < s.size(); i++) {
+ ret->list.push_back(parseExpression(s[i]));
+ }
+ return ret;
+ }
+
Expression* makeLoop(Element& s) {
auto ret = allocator.alloc<Loop>();
size_t i = 1;
@@ -860,7 +869,7 @@ private:
ret->in = s[i]->str();
i++;
}
- ret->body = parseExpression(s[i]);
+ ret->body = makeMaybeBlock(s, i);
return ret;
}