summaryrefslogtreecommitdiff
path: root/src/emscripten-optimizer
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-01-04 14:27:46 -0800
committerAlon Zakai <alonzakai@gmail.com>2016-01-04 14:27:56 -0800
commitc6d08d97c196e2ceae5e3b960befcd6c66916cad (patch)
tree89c27cee4f213fd66f6e60ce9b267d53a2c00b00 /src/emscripten-optimizer
parent5e82fc26d6bb0cec8863156e052250a4e441595c (diff)
downloadbinaryen-c6d08d97c196e2ceae5e3b960befcd6c66916cad.tar.gz
binaryen-c6d08d97c196e2ceae5e3b960befcd6c66916cad.tar.bz2
binaryen-c6d08d97c196e2ceae5e3b960befcd6c66916cad.zip
parse for loops in asm2wasm #60
Diffstat (limited to 'src/emscripten-optimizer')
-rw-r--r--src/emscripten-optimizer/parser.h21
-rw-r--r--src/emscripten-optimizer/simple_ast.h14
2 files changed, 34 insertions, 1 deletions
diff --git a/src/emscripten-optimizer/parser.h b/src/emscripten-optimizer/parser.h
index 6b2fa2faa..c805ca9f6 100644
--- a/src/emscripten-optimizer/parser.h
+++ b/src/emscripten-optimizer/parser.h
@@ -386,6 +386,7 @@ class Parser {
else if (frag.str == CONTINUE) return parseContinue(src, seps);
else if (frag.str == SWITCH) return parseSwitch(src, seps);
else if (frag.str == NEW) return parseNew(src, seps);
+ else if (frag.str == FOR) return parseFor(src, seps);
dump(frag.str.str, src);
abort();
return nullptr;
@@ -492,6 +493,26 @@ class Parser {
return Builder::makeWhile(condition, body);
}
+ NodeRef parseFor(char*& src, const char* seps) {
+ skipSpace(src);
+ assert(*src == '(');
+ src++;
+ NodeRef init = parseElement(src, ";");
+ skipSpace(src);
+ assert(*src == ';');
+ src++;
+ NodeRef condition = parseElement(src, ";");
+ skipSpace(src);
+ assert(*src == ';');
+ src++;
+ NodeRef inc = parseElement(src, ")");
+ skipSpace(src);
+ assert(*src == ')');
+ src++;
+ NodeRef body = parseMaybeBracketed(src, seps);
+ return Builder::makeFor(init, condition, inc, body);
+ }
+
NodeRef parseBreak(char*& src, const char* seps) {
skipSpace(src);
Frag next(src);
diff --git a/src/emscripten-optimizer/simple_ast.h b/src/emscripten-optimizer/simple_ast.h
index 862e1f0bc..712845dea 100644
--- a/src/emscripten-optimizer/simple_ast.h
+++ b/src/emscripten-optimizer/simple_ast.h
@@ -380,7 +380,11 @@ struct Value {
#define indentify() { for (int i = 0; i < indent; i++) os << " "; }
switch (type) {
case String:
- os << '"' << str.str << '"';
+ if (str.str) {
+ os << '"' << str.str << '"';
+ } else {
+ os << "\"(null)\"";
+ }
break;
case Number:
os << std::setprecision(17) << num; // doubles can have 17 digits of precision
@@ -1561,6 +1565,14 @@ public:
.push_back(body);
}
+ static Ref makeFor(Ref init, Ref condition, Ref inc, Ref body) {
+ return &makeRawArray(5)->push_back(makeRawString(FOR))
+ .push_back(init)
+ .push_back(condition)
+ .push_back(inc)
+ .push_back(body);
+ }
+
static Ref makeBreak(IString label) {
return &makeRawArray(2)->push_back(makeRawString(BREAK))
.push_back(!!label ? makeRawString(label) : makeNull());