summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-01-13 20:05:02 -0800
committerAlon Zakai <alonzakai@gmail.com>2016-01-13 20:05:02 -0800
commitab3b76b29488ca8f85c39491c5ac96d6274fac7c (patch)
tree5390196da68c02d2860032a1bc72ae310c6d75da
parent77c55b36cf5cc4b72d62e24b69ca7de61b671328 (diff)
parent01455820d430120c694dbc9978ed4dc8192185e0 (diff)
downloadbinaryen-ab3b76b29488ca8f85c39491c5ac96d6274fac7c.tar.gz
binaryen-ab3b76b29488ca8f85c39491c5ac96d6274fac7c.tar.bz2
binaryen-ab3b76b29488ca8f85c39491c5ac96d6274fac7c.zip
Merge pull request #102 from WebAssembly/clobber
Avoid potential setjmp clobber
-rw-r--r--CMakeLists.txt3
-rw-r--r--src/binaryen-shell.cpp142
2 files changed, 79 insertions, 66 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3e57b3667..eae189803 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -13,7 +13,8 @@ IF(MSVC)
ELSE()
SET(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
SET(CMAKE_CXX_FLAGS "-msse2 -mfpmath=sse ${CMAKE_CXX_FLAGS}")
- SET(CMAKE_CXX_FLAGS "-O2 -Wall -Werror ${CMAKE_CXX_FLAGS}")
+ SET(CMAKE_CXX_FLAGS "-O2 ${CMAKE_CXX_FLAGS}")
+ SET(CMAKE_CXX_FLAGS "-Wall -Werror -Wextra -Wno-unused-parameter ${CMAKE_CXX_FLAGS}")
ENDIF()
# clang doesn't print colored diagnostics when invoked from Ninja
diff --git a/src/binaryen-shell.cpp b/src/binaryen-shell.cpp
index 55beb6aa8..6000430a5 100644
--- a/src/binaryen-shell.cpp
+++ b/src/binaryen-shell.cpp
@@ -169,6 +169,79 @@ struct Invocation {
}
};
+static void run_asserts(size_t* i, bool* checked, AllocatingModule* wasm,
+ Element* root,
+ std::unique_ptr<SExpressionWasmBuilder>* builder,
+ bool print_before, bool print_after) {
+ auto interface = new ShellExternalInterface();
+ auto instance = new ModuleInstance(*wasm, interface);
+ while (*i < root->size()) {
+ Element& curr = *(*root)[*i];
+ IString id = curr[0]->str();
+ if (id == MODULE) break;
+ *checked = true;
+ Colors::red(std::cerr);
+ std::cerr << *i << '/' << (root->size()-1);
+ Colors::green(std::cerr);
+ std::cerr << " CHECKING: ";
+ Colors::normal(std::cerr);
+ std::cerr << curr << '\n';
+ if (id == ASSERT_INVALID) {
+ // a module invalidity test
+ AllocatingModule wasm;
+ bool invalid = false;
+ jmp_buf trapState;
+ if (setjmp(trapState) == 0) {
+ *builder = std::unique_ptr<SExpressionWasmBuilder>(new SExpressionWasmBuilder(wasm, *curr[1], [&]() {
+ invalid = true;
+ longjmp(trapState, 1);
+ }));
+ }
+ if (print_before || print_after) {
+ Colors::bold(std::cout);
+ std::cerr << "printing in module invalidity test:\n";
+ Colors::normal(std::cout);
+ std::cout << wasm;
+ }
+ if (!invalid) {
+ // maybe parsed ok, but otherwise incorrect
+ invalid = !WasmValidator().validate(wasm);
+ }
+ assert(invalid);
+ } else if (id == INVOKE) {
+ Invocation invocation(curr, instance, *builder->get());
+ invocation.invoke();
+ } else {
+ // an invoke test
+ Invocation invocation(*curr[1], instance, *builder->get());
+ bool trapped = false;
+ Literal result;
+ if (setjmp(interface->trapState) == 0) {
+ result = invocation.invoke();
+ } else {
+ trapped = true;
+ }
+ if (id == ASSERT_RETURN) {
+ assert(!trapped);
+ if (curr.size() >= 3) {
+ Literal expected = builder->get()
+ ->parseExpression(*curr[2])
+ ->dyn_cast<Const>()
+ ->value;
+ std::cerr << "seen " << result << ", expected " << expected << '\n';
+ assert(expected == result);
+ } else {
+ Literal expected;
+ std::cerr << "seen " << result << ", expected " << expected << '\n';
+ assert(expected == result);
+ }
+ }
+ if (id == ASSERT_TRAP) assert(trapped);
+ }
+ *i += 1;
+ }
+}
+
//
// main
//
@@ -265,12 +338,10 @@ int main(int argc, char **argv) {
while (i < root.size()) {
if (debug) std::cerr << "parsing s-expressions to wasm...\n";
AllocatingModule wasm;
- SExpressionWasmBuilder builder(wasm, *root[i], [&]() { abort(); }, debug);
+ std::unique_ptr<SExpressionWasmBuilder> builder(
+ new SExpressionWasmBuilder(wasm, *root[i], [&]() { abort(); }, debug));
i++;
- auto interface = new ShellExternalInterface();
- auto instance = new ModuleInstance(wasm, interface);
-
if (print_before) {
Colors::bold(std::cout);
std::cerr << "printing before:\n";
@@ -296,67 +367,8 @@ int main(int argc, char **argv) {
std::cout << wasm;
}
- // run asserts
- while (i < root.size()) {
- Element& curr = *root[i];
- IString id = curr[0]->str();
- if (id == MODULE) break;
- checked = true;
- Colors::red(std::cerr);
- std::cerr << i << '/' << (root.size()-1);
- Colors::green(std::cerr);
- std::cerr << " CHECKING: ";
- Colors::normal(std::cerr);
- std::cerr << curr << '\n';
- if (id == ASSERT_INVALID) {
- // a module invalidity test
- AllocatingModule wasm;
- bool invalid = false;
- jmp_buf trapState;
- std::unique_ptr<SExpressionWasmBuilder> builder;
- if (setjmp(trapState) == 0) {
- builder = std::unique_ptr<SExpressionWasmBuilder>(new SExpressionWasmBuilder(wasm, *curr[1], [&]() {
- invalid = true;
- longjmp(trapState, 1);
- }));
- }
- if (print_before || print_after) {
- Colors::bold(std::cout);
- std::cerr << "printing in module invalidity test:\n";
- Colors::normal(std::cout);
- std::cout << wasm;
- }
- if (!invalid) {
- // maybe parsed ok, but otherwise incorrect
- invalid = !WasmValidator().validate(wasm);
- }
- assert(invalid);
- } else if (id == INVOKE) {
- Invocation invocation(curr, instance, builder);
- invocation.invoke();
- } else {
- // an invoke test
- Invocation invocation(*curr[1], instance, builder);
- bool trapped = false;
- Literal result;
- if (setjmp(interface->trapState) == 0) {
- result = invocation.invoke();
- } else {
- trapped = true;
- }
- if (id == ASSERT_RETURN) {
- assert(!trapped);
- Literal expected;
- if (curr.size() >= 3) {
- expected = builder.parseExpression(*curr[2])->dyn_cast<Const>()->value;
- }
- std::cerr << "seen " << result << ", expected " << expected << '\n';
- assert(expected == result);
- }
- if (id == ASSERT_TRAP) assert(trapped);
- }
- i++;
- }
+ run_asserts(&i, &checked, &wasm, &root, &builder, print_before,
+ print_after);
}
if (checked) {