diff options
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()); |