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.h39
1 files changed, 30 insertions, 9 deletions
diff --git a/src/emscripten-optimizer/simple_ast.h b/src/emscripten-optimizer/simple_ast.h
index aa02dd8fc..efbd7b6f6 100644
--- a/src/emscripten-optimizer/simple_ast.h
+++ b/src/emscripten-optimizer/simple_ast.h
@@ -97,6 +97,7 @@ public:
};
struct Assign;
+struct AssignName;
// Main value type
struct Value {
@@ -107,7 +108,8 @@ struct Value {
Null = 3,
Bool = 4,
Object = 5,
- Assign_ = 6 // ref = target
+ Assign_ = 6, // ref = target
+ AssignName_ = 7
};
Type type;
@@ -203,6 +205,7 @@ struct Value {
return *this;
}
Value& setAssign(Ref target, Ref value);
+ Value& setAssignName(IString target, Ref value);
bool isString() { return type == String; }
bool isNumber() { return type == Number; }
@@ -211,6 +214,7 @@ struct Value {
bool isBool() { return type == Bool; }
bool isObject() { return type == Object; }
bool isAssign() { return type == Assign_; }
+ bool isAssignName() { return type == AssignName_; }
bool isBool(bool b) { return type == Bool && b == boo; } // avoid overloading == as it might overload over int
@@ -244,6 +248,7 @@ struct Value {
}
Assign* asAssign();
+ AssignName* asAssignName();
int32_t getInteger() { // convenience function to get a known integer
assert(fmod(getNumber(), 1) == 0);
@@ -496,6 +501,25 @@ struct Assign : public Value {
}
};
+struct AssignName : public Value {
+ IString target_;
+
+ AssignName(IString targetInit, Ref valueInit) {
+ type = AssignName_;
+ target() = targetInit;
+ value() = valueInit;
+ }
+
+ AssignName() : AssignName(IString(), nullptr) {}
+
+ IString& target() {
+ return target_;
+ }
+ Ref& value() {
+ return ref;
+ }
+};
+
// AST traversals
// Traverse, calling visit before the children
@@ -791,7 +815,11 @@ public:
static Ref makeBinary(Ref left, IString op, Ref right) {
if (op == SET) {
- return &arena.alloc<Assign>()->setAssign(left, right);
+ if (left->isString()) {
+ return &arena.alloc<AssignName>()->setAssignName(left->getIString(), right);
+ } else {
+ return &arena.alloc<Assign>()->setAssign(left, right);
+ }
} else if (op == COMMA) {
return &makeRawArray(3)->push_back(makeRawString(SEQ))
.push_back(left)
@@ -968,13 +996,6 @@ public:
.push_back(value));
}
- static Ref makeAssign(Ref target, Ref value) {
- return &arena.alloc<Assign>()->setAssign(target, value);
- }
- static Ref makeAssign(IString target, Ref value) {
- return &arena.alloc<Assign>()->setAssign(makeName(target), value);
- }
-
static Ref makeSub(Ref obj, Ref index) {
return &makeRawArray(2)->push_back(makeRawString(SUB))
.push_back(obj)