summaryrefslogtreecommitdiff
path: root/src/emscripten-optimizer/simple_ast.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/emscripten-optimizer/simple_ast.h')
-rw-r--r--src/emscripten-optimizer/simple_ast.h139
1 files changed, 131 insertions, 8 deletions
diff --git a/src/emscripten-optimizer/simple_ast.h b/src/emscripten-optimizer/simple_ast.h
index 4012ff8f6..5952eee72 100644
--- a/src/emscripten-optimizer/simple_ast.h
+++ b/src/emscripten-optimizer/simple_ast.h
@@ -1268,9 +1268,20 @@ struct JSPrinter {
pretty ? emit(", ") : emit(',');
newline();
}
- emit('"');
- emit(args[i][0]->getCString());
- emit("\":");
+ const char *str = args[i][0]->getCString();
+ const char *check = str;
+ bool needQuote = false;
+ while (*check) {
+ if (!isalnum(*check) && *check != '_' && *check != '$') {
+ needQuote = true;
+ break;
+ }
+ check++;
+ }
+ if (needQuote) emit('"');
+ emit(str);
+ if (needQuote) emit('"');
+ emit(":");
space();
print(args[i][1]);
}
@@ -1289,15 +1300,15 @@ class ValueBuilder {
return &arena.alloc()->setString(s);
}
- static Ref makeRawArray(int size_hint=0) {
- return &arena.alloc()->setArray(size_hint);
- }
-
static Ref makeNull() {
return &arena.alloc()->setNull();
}
public:
+ static Ref makeRawArray(int size_hint=0) {
+ return &arena.alloc()->setArray(size_hint);
+ }
+
static Ref makeToplevel() {
return &makeRawArray(2)->push_back(makeRawString(TOPLEVEL))
.push_back(makeRawArray());
@@ -1336,6 +1347,80 @@ public:
.push_back(target)
.push_back(makeRawArray());
}
+ static Ref makeCall(Ref target, Ref arg) {
+ Ref ret = &makeRawArray(3)->push_back(makeRawString(CALL))
+ .push_back(target)
+ .push_back(makeRawArray());
+ ret[2]->push_back(arg);
+ return ret;
+ }
+ static Ref makeCall(IString target) {
+ Ref ret = &makeRawArray(3)->push_back(makeRawString(CALL))
+ .push_back(makeName(target))
+ .push_back(makeRawArray());
+ return ret;
+ }
+ static Ref makeCall(IString target, Ref arg) {
+ Ref ret = &makeRawArray(3)->push_back(makeRawString(CALL))
+ .push_back(makeName(target))
+ .push_back(makeRawArray(1));
+ ret[2]->push_back(arg);
+ return ret;
+ }
+ static Ref makeCall(IString target, Ref arg1, Ref arg2) {
+ Ref ret = &makeRawArray(3)->push_back(makeRawString(CALL))
+ .push_back(makeName(target))
+ .push_back(makeRawArray(2));
+ ret[2]->push_back(arg1);
+ ret[2]->push_back(arg2);
+ return ret;
+ }
+ static Ref makeCall(IString target, Ref arg1, Ref arg2, Ref arg3, Ref arg4) {
+ Ref ret = &makeRawArray(3)->push_back(makeRawString(CALL))
+ .push_back(makeName(target))
+ .push_back(makeRawArray(4));
+ ret[2]->push_back(arg1);
+ ret[2]->push_back(arg2);
+ ret[2]->push_back(arg3);
+ ret[2]->push_back(arg4);
+ return ret;
+ }
+ static Ref makeCall(IString target, Ref arg1, Ref arg2, Ref arg3, Ref arg4, Ref arg5, Ref arg6, Ref arg7, Ref arg8) {
+ Ref ret = &makeRawArray(3)->push_back(makeRawString(CALL))
+ .push_back(makeName(target))
+ .push_back(makeRawArray(8));
+ ret[2]->push_back(arg1);
+ ret[2]->push_back(arg2);
+ ret[2]->push_back(arg3);
+ ret[2]->push_back(arg4);
+ ret[2]->push_back(arg5);
+ ret[2]->push_back(arg6);
+ ret[2]->push_back(arg7);
+ ret[2]->push_back(arg8);
+ return ret;
+ }
+ static Ref makeCall(IString target, Ref arg1, Ref arg2, Ref arg3, Ref arg4, Ref arg5, Ref arg6, Ref arg7, Ref arg8, Ref arg9, Ref arg10, Ref arg11, Ref arg12, Ref arg13, Ref arg14, Ref arg15, Ref arg16) {
+ Ref ret = &makeRawArray(3)->push_back(makeRawString(CALL))
+ .push_back(makeName(target))
+ .push_back(makeRawArray(16));
+ ret[2]->push_back(arg1);
+ ret[2]->push_back(arg2);
+ ret[2]->push_back(arg3);
+ ret[2]->push_back(arg4);
+ ret[2]->push_back(arg5);
+ ret[2]->push_back(arg6);
+ ret[2]->push_back(arg7);
+ ret[2]->push_back(arg8);
+ ret[2]->push_back(arg9);
+ ret[2]->push_back(arg10);
+ ret[2]->push_back(arg11);
+ ret[2]->push_back(arg12);
+ ret[2]->push_back(arg13);
+ ret[2]->push_back(arg14);
+ ret[2]->push_back(arg15);
+ ret[2]->push_back(arg16);
+ return ret;
+ }
static void appendToCall(Ref call, Ref element) {
assert(call[0] == CALL);
@@ -1358,6 +1443,15 @@ public:
static Ref makeInt(uint32_t num) {
return makeDouble(double(num));
}
+ static Ref makeNum(double num) {
+ return makeDouble(num);
+ }
+
+ static Ref makeUnary(IString op, Ref value) {
+ return &makeRawArray(3)->push_back(makeRawString(UNARY_PREFIX))
+ .push_back(makeRawString(op))
+ .push_back(value);
+ }
static Ref makeBinary(Ref left, IString op, Ref right) {
if (op == SET) {
@@ -1395,7 +1489,7 @@ public:
func[2]->push_back(makeRawString(arg));
}
- static Ref makeVar(bool is_const) {
+ static Ref makeVar(bool is_const=false) {
return &makeRawArray(2)->push_back(makeRawString(VAR))
.push_back(makeRawArray());
}
@@ -1432,6 +1526,12 @@ public:
.push_back(ifFalse);
}
+ static Ref makeSeq(Ref left, Ref right) {
+ return &makeRawArray(3)->push_back(makeRawString(SEQ))
+ .push_back(left)
+ .push_back(right);
+ }
+
static Ref makeDo(Ref body, Ref condition) {
return &makeRawArray(3)->push_back(makeRawString(DO))
.push_back(condition)
@@ -1526,6 +1626,29 @@ public:
array[1]->push_back(&makeRawArray(2)->push_back(makeRawString(key))
.push_back(value));
}
+
+ static Ref makeAssign(Ref target, Ref value) {
+ return &makeRawArray(3)->push_back(makeRawString(ASSIGN))
+ .push_back(&arena.alloc()->setBool(true))
+ .push_back(target)
+ .push_back(value);
+ }
+ static Ref makeAssign(IString target, Ref value) {
+ return &makeRawArray(3)->push_back(makeRawString(ASSIGN))
+ .push_back(&arena.alloc()->setBool(true))
+ .push_back(makeName(target))
+ .push_back(value);
+ }
+
+ static Ref makeSub(Ref obj, Ref index) {
+ return &makeRawArray(2)->push_back(makeRawString(SUB))
+ .push_back(obj)
+ .push_back(index);
+ }
+
+ static Ref makePtrShift(Ref ptr, int shifts) {
+ return makeBinary(ptr, RSHIFT, makeInt(shifts));
+ }
};
// Tolerates 0.0 in the input; does not trust a +() to be there.