summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/wasm-s-parser.h2
-rw-r--r--src/wasm-shell.cpp42
2 files changed, 38 insertions, 6 deletions
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h
index 2456c5cca..3277d8d3d 100644
--- a/src/wasm-s-parser.h
+++ b/src/wasm-s-parser.h
@@ -191,6 +191,8 @@ public:
}
}
+ Expression* parseExpression(Element& s); // useful in shell assert tests
+
private:
void parseModuleElement(Element& curr) {
diff --git a/src/wasm-shell.cpp b/src/wasm-shell.cpp
index b3b249771..7eb4b847a 100644
--- a/src/wasm-shell.cpp
+++ b/src/wasm-shell.cpp
@@ -8,10 +8,15 @@
using namespace cashew;
using namespace wasm;
+IString ASSERT_RETURN("assert_return"),
+ ASSERT_TRAP("assert_trap"),
+ INVOKE("invoke");
+
int main(int argc, char **argv) {
debug = getenv("WASM_SHELL_DEBUG") ? getenv("WASM_SHELL_DEBUG")[0] - '0' : 0;
char *infile = argv[1];
+ bool print_wasm = argc >= 3; // second arg means print it out
if (debug) std::cerr << "loading '" << infile << "'...\n";
FILE *f = fopen(argv[1], "r");
@@ -30,14 +35,39 @@ int main(int argc, char **argv) {
if (debug) std::cerr << "parsing text to s-expressions...\n";
SExpressionParser parser(input);
- if (debug) std::cout << *parser.root << '\n';
+ Element& root = *parser.root;
+ if (debug) std::cout << root << '\n';
+
+ // A .wast may have multiple modules, with some asserts after them
+ size_t i = 0;
+ while (i < root.size()) {
+ if (debug) std::cerr << "parsing s-expressions to wasm...\n";
+ Module wasm;
+ SExpressionWasmBuilder builder(wasm, *root[i]);
+ i++;
- if (debug) std::cerr << "parsing s-expressions to wasm...\n";
- Module wasm;
- SExpressionWasmBuilder builder(wasm, *(*parser.root)[0]);
+ if (print_wasm) {
+ if (debug) std::cerr << "printing...\n";
+ std::cout << wasm;
+ }
- if (debug) std::cerr << "printing...\n";
- std::cout << wasm;
+ // run asserts
+ while (i < root.size()) {
+ Element& curr = *root[i];
+ IString id = curr[0]->str();
+ if (id == MODULE) break;
+ Element& invoke = *curr[1];
+ assert(invoke[0]->str() == INVOKE);
+ IString name = invoke[1]->str();
+ LiteralList arguments;
+ for (size_t j = 2; j < invoke.size(); j++) {
+ Expression* argument = builder.parseExpression(*invoke[2]);
+ arguments.push_back(argument->dyn_cast<Const>()->value);
+ }
+ interpreter.callFunction(name, arguments);
+ i++;
+ }
+ }
if (debug) std::cerr << "done.\n";
}