diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-01-04 14:27:46 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-01-04 14:27:56 -0800 |
commit | c6d08d97c196e2ceae5e3b960befcd6c66916cad (patch) | |
tree | 89c27cee4f213fd66f6e60ce9b267d53a2c00b00 /src/emscripten-optimizer | |
parent | 5e82fc26d6bb0cec8863156e052250a4e441595c (diff) | |
download | binaryen-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.h | 21 | ||||
-rw-r--r-- | src/emscripten-optimizer/simple_ast.h | 14 |
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()); |