diff options
Diffstat (limited to 'src/emscripten-optimizer/simple_ast.h')
-rw-r--r-- | src/emscripten-optimizer/simple_ast.h | 39 |
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) |