diff -r e1a6deaa6ebe -r b8f650a441a5 src/compiler/HIR.h --- a/src/compiler/HIR.h Sun Nov 18 15:00:08 2012 -0800 +++ b/src/compiler/HIR.h Sun Nov 18 15:24:30 2012 -0800 @@ -150,6 +150,9 @@ // Pushes a reference to the LValue on the stack. virtual void bind(HIRVisitor *visitor, BytecodeEmitter &emitter_) = 0; + + // Duplicates a stack reference. + virtual void hold(BytecodeEmitter &emitter_) = 0; // Given a stack layout of the form: // [-1] value @@ -177,6 +180,7 @@ // Pushes a reference to the LValue on the stack. void bind(HIRVisitor *visitor, BytecodeEmitter &emitter_); + void hold(BytecodeEmitter &emitter_); void store(BytecodeEmitter &emitter_); void load(BytecodeEmitter &emitter_); @@ -197,6 +201,7 @@ DEFINE_HIR(Index); void bind(HIRVisitor *visitor, BytecodeEmitter &emitter_); + void hold(BytecodeEmitter &emitter_); void store(BytecodeEmitter &emitter_); void load(BytecodeEmitter &emitter_); @@ -217,6 +222,7 @@ DEFINE_HIR(Global); void bind(HIRVisitor *visitor, BytecodeEmitter &emitter_); + void hold(BytecodeEmitter &emitter_); void store(BytecodeEmitter &emitter_); void load(BytecodeEmitter &emitter_); @@ -279,6 +285,15 @@ public: HStore(HLValue *lval, HIR *rval) : HIR(lval->type()), + kind_(TOK_ASSIGN), + lval_(lval), + rval_(rval) + { + } + + HStore(TokenKind kind, HLValue *lval, HIR *rval) + : HIR(lval->type()), + kind_(kind), lval_(lval), rval_(rval) { @@ -292,10 +307,14 @@ HIR *rval() const { return rval_; } + TokenKind kind() const { + return kind_; + } private: HLValue *lval_; HIR *rval_; + TokenKind kind_; }; class HCall : public HIR