summaryrefslogtreecommitdiff
path: root/src/s2wasm.h
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-12-11 13:28:46 -0500
committerAlon Zakai <alonzakai@gmail.com>2015-12-11 13:28:46 -0500
commit9b9f6ad461fd2aa98591a9bbe6260a63f4563edb (patch)
treeefbba6f93d94b7cdf1f6ef2427fc9e706b7d8d02 /src/s2wasm.h
parent3c0faf1bce309974c82e96620113bf29dbf4a99a (diff)
downloadbinaryen-9b9f6ad461fd2aa98591a9bbe6260a63f4563edb.tar.gz
binaryen-9b9f6ad461fd2aa98591a9bbe6260a63f4563edb.tar.bz2
binaryen-9b9f6ad461fd2aa98591a9bbe6260a63f4563edb.zip
stack fixes
Diffstat (limited to 'src/s2wasm.h')
-rw-r--r--src/s2wasm.h36
1 files changed, 31 insertions, 5 deletions
diff --git a/src/s2wasm.h b/src/s2wasm.h
index d8a0e1e8e..eb7a2df29 100644
--- a/src/s2wasm.h
+++ b/src/s2wasm.h
@@ -71,7 +71,12 @@ private:
}
void dump(const char *text) {
- std::cerr << text << "\n==========\n" << s << "\n==========\n";
+ std::cerr << "[[" << text << "]]:\n==========\n";
+ for (size_t i = 0; i < 60; i++) {
+ if (!s[i]) break;
+ std::cerr << s[i];
+ }
+ std::cerr << "\n==========\n";
}
void unget(Name str) {
@@ -116,6 +121,18 @@ private:
return cashew::IString(str.c_str(), false);
}
+ Name getAssign() {
+ skipWhitespace();
+ std::string str;
+ while (*s && *s != '=') {
+ str += *s;
+ s++;
+ }
+ s++;
+ skipComma();
+ return cashew::IString(str.c_str(), false);
+ }
+
Name getQuoted() { // TODO: support 0 in the middle, etc., use a raw buffer, etc.
assert(*s == '"');
s++;
@@ -215,14 +232,19 @@ private:
bstack.push_back(func->body->dyn_cast<Block>());
std::vector<Expression*> estack;
auto push = [&](Expression* curr) {
+ //std::cerr << "push " << curr << '\n';
estack.push_back(curr);
};
auto pop = [&]() {
+ assert(!estack.empty());
Expression* ret = estack.back();
+ assert(ret);
estack.pop_back();
+ //std::cerr << "pop " << ret << '\n';
return ret;
};
auto getInput = [&]() {
+ //dump("getinput");
if (match("$pop")) {
while (isdigit(*s)) s++;
return pop();
@@ -247,7 +269,7 @@ private:
}
};
auto makeBinary = [&](BinaryOp op, WasmType type) {
- Name assign = getCommaSeparated();
+ Name assign = getAssign();
skipComma();
auto curr = allocator.alloc<Binary>();
curr->op = op;
@@ -261,6 +283,7 @@ private:
// main loop
while (1) {
skipWhitespace();
+ //dump("main function loop");
if (match("i32.")) {
switch (*s) {
case 'a': {
@@ -317,7 +340,7 @@ private:
default: abort_on("i32.?");
}
} else if (match("call")) {
- Name assign = getCommaSeparated();
+ Name assign = getAssign();
skipComma();
auto curr = allocator.alloc<Call>();
curr->target = getCommaSeparated();
@@ -330,6 +353,7 @@ private:
} else if (match("block")) {
auto curr = allocator.alloc<Block>();
curr->name = getStr();
+ bstack.back()->list.push_back(curr);
bstack.push_back(curr);
} else if (match("BB")) {
s -= 2;
@@ -345,6 +369,7 @@ private:
curr->body = block;
bstack.push_back(block);
} else { // block end
+ assert(!bstack.empty());
bstack.pop_back();
}
} else if (match("br")) {
@@ -368,8 +393,7 @@ private:
auto curr = allocator.alloc<Break>();
curr->name = FAKE_RETURN;
if (*s == '$') {
- getStr();
- curr->value = pop();
+ curr->value = getInput();
}
bstack.back()->list.push_back(curr);
} else if (match("func_end0:")) {
@@ -382,6 +406,8 @@ private:
abort_on("function element");
}
}
+ assert(bstack.empty());
+ assert(estack.empty());
}
void parseType() {