summaryrefslogtreecommitdiff
path: root/src/emscripten-optimizer
diff options
context:
space:
mode:
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());