summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/binaryen-c.cpp8
-rw-r--r--src/binaryen-shell.cpp8
-rw-r--r--src/shell-interface.h5
-rw-r--r--src/wasm-as.cpp2
-rw-r--r--src/wasm-binary.h18
-rw-r--r--src/wasm-dis.cpp4
-rw-r--r--src/wasm-s-parser.h36
-rw-r--r--test/example/find_div0s.cpp2
8 files changed, 41 insertions, 42 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index 315c11fdb..1d29830ca 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -416,10 +416,12 @@ BinaryenModuleRef BinaryenModuleRead(char* input, size_t inputSize) {
std::vector<char> buffer(false);
buffer.resize(inputSize);
std::copy_n(input, inputSize, buffer.begin());
- WasmBinaryBuilder parser(*wasm, buffer, []() {
+ try {
+ WasmBinaryBuilder parser(*wasm, buffer, false);
+ parser.read();
+ } catch (ParseException&) {
Fatal() << "error in parsing wasm binary";
- }, false);
- parser.read();
+ }
return wasm;
}
diff --git a/src/binaryen-shell.cpp b/src/binaryen-shell.cpp
index 8c0390d15..1371e5888 100644
--- a/src/binaryen-shell.cpp
+++ b/src/binaryen-shell.cpp
@@ -113,10 +113,7 @@ static void run_asserts(size_t* i, bool* checked, Module* wasm,
std::unique_ptr<SExpressionWasmBuilder> builder;
try {
builder = std::unique_ptr<SExpressionWasmBuilder>(
- new SExpressionWasmBuilder(wasm, *curr[1], [&]() {
- invalid = true;
- throw ParseException();
- })
+ new SExpressionWasmBuilder(wasm, *curr[1])
);
} catch (const ParseException&) {
invalid = true;
@@ -215,7 +212,8 @@ int main(int argc, const char* argv[]) {
if (options.debug) std::cerr << "parsing s-expressions to wasm...\n";
Module wasm;
std::unique_ptr<SExpressionWasmBuilder> builder(
- new SExpressionWasmBuilder(wasm, *root[i], [&]() { abort(); }));
+ new SExpressionWasmBuilder(wasm, *root[i])
+ );
i++;
assert(WasmValidator().validate(wasm));
diff --git a/src/shell-interface.h b/src/shell-interface.h
index 4e56bb8e1..5b6a64e79 100644
--- a/src/shell-interface.h
+++ b/src/shell-interface.h
@@ -18,6 +18,9 @@
// Implementation of the shell interpreter execution environment
//
+#ifndef wasm_shell_interface_h
+#define wasm_shell_interface_h
+
#include "asmjs/shared-constants.h"
#include "wasm.h"
#include "wasm-interpreter.h"
@@ -177,3 +180,5 @@ struct ShellExternalInterface : ModuleInstance::ExternalInterface {
};
}
+
+#endif // wasm_shell_interface_h
diff --git a/src/wasm-as.cpp b/src/wasm-as.cpp
index eb03f853a..6995859a7 100644
--- a/src/wasm-as.cpp
+++ b/src/wasm-as.cpp
@@ -49,7 +49,7 @@ int main(int argc, const char *argv[]) {
if (options.debug) std::cerr << "w-parsing..." << std::endl;
Module wasm;
- SExpressionWasmBuilder builder(wasm, *root[0], [&]() { abort(); });
+ SExpressionWasmBuilder builder(wasm, *root[0]);
if (options.debug) std::cerr << "binarification..." << std::endl;
BufferWithRandomAccess buffer(options.debug);
diff --git a/src/wasm-binary.h b/src/wasm-binary.h
index a5cf0fe5c..e49abe71e 100644
--- a/src/wasm-binary.h
+++ b/src/wasm-binary.h
@@ -32,6 +32,7 @@
#include "asm_v_wasm.h"
#include "wasm-builder.h"
#include "ast_utils.h"
+#include "shell-interface.h"
#include "wasm-validator.h"
namespace wasm {
@@ -1164,14 +1165,13 @@ class WasmBinaryBuilder {
Module& wasm;
MixedArena& allocator;
std::vector<char>& input;
- std::function<void ()> onError;
bool debug;
size_t pos = 0;
int32_t startIndex = -1;
public:
- WasmBinaryBuilder(Module& wasm, std::vector<char>& input, std::function<void ()> onError, bool debug) : wasm(wasm), allocator(wasm.allocator), input(input), onError(onError), debug(debug) {}
+ WasmBinaryBuilder(Module& wasm, std::vector<char>& input, bool debug) : wasm(wasm), allocator(wasm.allocator), input(input), debug(debug) {}
void read() {
@@ -1226,7 +1226,7 @@ public:
}
uint8_t getInt8() {
- if (!more()) onError();
+ if (!more()) throw ParseException();
if (debug) std::cerr << "getInt8: " << (int)(uint8_t)input[pos] << " (at " << pos << ")" << std::endl;
return input[pos++];
}
@@ -1330,27 +1330,27 @@ public:
void verifyInt8(int8_t x) {
int8_t y = getInt8();
- if (x != y) onError();
+ if (x != y) throw ParseException();
}
void verifyInt16(int16_t x) {
int16_t y = getInt16();
- if (x != y) onError();
+ if (x != y) throw ParseException();
}
void verifyInt32(int32_t x) {
int32_t y = getInt32();
- if (x != y) onError();
+ if (x != y) throw ParseException();
}
void verifyInt64(int64_t x) {
int64_t y = getInt64();
- if (x != y) onError();
+ if (x != y) throw ParseException();
}
void verifyFloat32(float x) {
float y = getFloat32();
- if (x != y) onError();
+ if (x != y) throw ParseException();
}
void verifyFloat64(double x) {
double y = getFloat64();
- if (x != y) onError();
+ if (x != y) throw ParseException();
}
void ungetInt8() {
diff --git a/src/wasm-dis.cpp b/src/wasm-dis.cpp
index 94965518c..e2e103b46 100644
--- a/src/wasm-dis.cpp
+++ b/src/wasm-dis.cpp
@@ -45,9 +45,7 @@ int main(int argc, const char *argv[]) {
if (options.debug) std::cerr << "parsing binary..." << std::endl;
Module wasm;
- WasmBinaryBuilder parser(wasm, input, []() {
- Fatal() << "error in parsing wasm binary";
- }, options.debug);
+ WasmBinaryBuilder parser(wasm, input, options.debug);
parser.read();
if (options.debug) std::cerr << "Printing..." << std::endl;
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h
index 4b27918d3..e38c33ce6 100644
--- a/src/wasm-s-parser.h
+++ b/src/wasm-s-parser.h
@@ -239,7 +239,6 @@ private:
class SExpressionWasmBuilder {
Module& wasm;
MixedArena& allocator;
- std::function<void ()> onError;
std::vector<Name> functionNames;
int functionCounter;
int importCounter;
@@ -247,7 +246,7 @@ class SExpressionWasmBuilder {
public:
// Assumes control of and modifies the input.
- SExpressionWasmBuilder(Module& wasm, Element& module, std::function<void ()> onError) : wasm(wasm), allocator(wasm.allocator), onError(onError), importCounter(0) {
+ SExpressionWasmBuilder(Module& wasm, Element& module) : wasm(wasm), allocator(wasm.allocator), importCounter(0) {
assert(module[0]->str() == MODULE);
if (module.size() > 1 && module[1]->isStr()) {
// these s-expressions contain a binary module, actually
@@ -259,7 +258,7 @@ public:
stringToBinary(str, size, data);
}
}
- WasmBinaryBuilder binaryBuilder(wasm, data, onError, false);
+ WasmBinaryBuilder binaryBuilder(wasm, data, false);
binaryBuilder.read();
return;
}
@@ -274,9 +273,6 @@ public:
}
}
- // constructor without onError
- SExpressionWasmBuilder(Module& wasm, Element& module) : SExpressionWasmBuilder(wasm, module, [&]() { abort(); }) {}
-
private:
// pre-parse types and function definitions, so we know function return types before parsing their contents
@@ -303,7 +299,7 @@ private:
return;
} else if (id == TYPE) {
Name typeName = curr[1]->str();
- if (!wasm.checkFunctionType(typeName)) onError();
+ if (!wasm.checkFunctionType(typeName)) throw ParseException();
FunctionType* type = wasm.getFunctionType(typeName);
functionTypes[name] = type->result;
return;
@@ -327,7 +323,7 @@ private:
if (id == TABLE) return parseTable(curr);
if (id == TYPE) return; // already done
std::cerr << "bad module element " << id.str << '\n';
- onError();
+ throw ParseException();
}
// function parsing state
@@ -347,7 +343,7 @@ private:
} else {
// index
size_t offset = atoi(s.str().c_str());
- if (offset >= functionNames.size()) onError();
+ if (offset >= functionNames.size()) throw ParseException();
return functionNames[offset];
}
}
@@ -417,7 +413,7 @@ private:
} else if (id == TYPE) {
Name name = curr[1]->str();
type = name;
- if (!wasm.checkFunctionType(name)) onError();
+ if (!wasm.checkFunctionType(name)) throw ParseException();
FunctionType* type = wasm.getFunctionType(name);
result = type->result;
for (size_t j = 0; j < type->params.size(); j++) {
@@ -472,7 +468,7 @@ private:
if (str[1] == '6' && str[2] == '4' && (prefix || str[3] == 0)) return f64;
}
if (allowError) return none;
- onError();
+ throw ParseException();
abort();
}
@@ -481,7 +477,7 @@ public:
return parseExpression(*s);
}
- #define abort_on(str) { std::cerr << "aborting on " << str << '\n'; onError(); }
+ #define abort_on(str) { std::cerr << "aborting on " << str << '\n'; throw ParseException(); }
Expression* parseExpression(Element& s) {
IString id = s[0]->str();
@@ -820,7 +816,7 @@ private:
Expression* makeConst(Element& s, WasmType type) {
auto ret = parseConst(s[1]->str(), type, allocator);
- if (!ret) onError();
+ if (!ret) throw ParseException();
return ret;
}
@@ -854,9 +850,9 @@ private:
ret->align = atoi(eq);
} else if (str[0] == 'o') {
uint64_t offset = atoll(eq);
- if (offset > std::numeric_limits<uint32_t>::max()) onError();
+ if (offset > std::numeric_limits<uint32_t>::max()) throw ParseException();
ret->offset = (uint32_t)offset;
- } else onError();
+ } else throw ParseException();
i++;
}
ret->ptr = parseExpression(s[i]);
@@ -892,7 +888,7 @@ private:
ret->align = atoi(eq);
} else if (str[0] == 'o') {
ret->offset = atoi(eq);
- } else onError();
+ } else throw ParseException();
i++;
}
ret->ptr = parseExpression(s[i]);
@@ -1140,7 +1136,7 @@ private:
void parseExport(Element& s) {
if (!s[2]->dollared() && !std::isdigit(s[2]->str()[0])) {
assert(s[2]->str() == MEMORY);
- if (!hasMemory) onError();
+ if (!hasMemory) throw ParseException();
wasm.memory.exportName = s[1]->str();
return;
}
@@ -1160,7 +1156,7 @@ private:
}
importCounter++;
im->module = s[i++]->str();
- if (!s[i]->isStr()) onError();
+ if (!s[i]->isStr()) throw ParseException();
im->base = s[i++]->str();
std::unique_ptr<FunctionType> type = make_unique<FunctionType>();
if (s.size() > i) {
@@ -1174,10 +1170,10 @@ private:
type->result = stringToWasmType(params[1]->str());
} else if (id == TYPE) {
IString name = params[1]->str();
- if (!wasm.checkFunctionType(name)) onError();
+ if (!wasm.checkFunctionType(name)) throw ParseException();
*type = *wasm.getFunctionType(name);
} else {
- onError();
+ throw ParseException();
}
if (s.size() > i+1) {
Element& result = *s[i+1];
diff --git a/test/example/find_div0s.cpp b/test/example/find_div0s.cpp
index 4528c7cb4..c3a2c0750 100644
--- a/test/example/find_div0s.cpp
+++ b/test/example/find_div0s.cpp
@@ -32,7 +32,7 @@ int main() {
// The parsed code has just one element, the module. Build the module
// from that (and abort on any errors, but there won't be one here).
- SExpressionWasmBuilder builder(module, *root[0], [&]() { abort(); });
+ SExpressionWasmBuilder builder(module, *root[0]);
// Print it out
WasmPrinter::printModule(&module, std::cout);