src/compiler/HIR.h
changeset 215 b8f650a441a5
parent 195 c1ba166f3fc4
child 216 ea63f1680097
     1.1 --- a/src/compiler/HIR.h	Sun Nov 18 15:00:08 2012 -0800
     1.2 +++ b/src/compiler/HIR.h	Sun Nov 18 15:24:30 2012 -0800
     1.3 @@ -150,6 +150,9 @@
     1.4  
     1.5      // Pushes a reference to the LValue on the stack.
     1.6      virtual void bind(HIRVisitor *visitor, BytecodeEmitter &emitter_) = 0;
     1.7 +    
     1.8 +    // Duplicates a stack reference.
     1.9 +    virtual void hold(BytecodeEmitter &emitter_) = 0;
    1.10  
    1.11      // Given a stack layout of the form:
    1.12      //  [-1]    value
    1.13 @@ -177,6 +180,7 @@
    1.14  
    1.15      // Pushes a reference to the LValue on the stack.
    1.16      void bind(HIRVisitor *visitor, BytecodeEmitter &emitter_);
    1.17 +    void hold(BytecodeEmitter &emitter_);
    1.18      void store(BytecodeEmitter &emitter_);
    1.19      void load(BytecodeEmitter &emitter_);
    1.20  
    1.21 @@ -197,6 +201,7 @@
    1.22      DEFINE_HIR(Index);
    1.23  
    1.24      void bind(HIRVisitor *visitor, BytecodeEmitter &emitter_);
    1.25 +    void hold(BytecodeEmitter &emitter_);
    1.26      void store(BytecodeEmitter &emitter_);
    1.27      void load(BytecodeEmitter &emitter_);
    1.28  
    1.29 @@ -217,6 +222,7 @@
    1.30      DEFINE_HIR(Global);
    1.31  
    1.32      void bind(HIRVisitor *visitor, BytecodeEmitter &emitter_);
    1.33 +    void hold(BytecodeEmitter &emitter_);
    1.34      void store(BytecodeEmitter &emitter_);
    1.35      void load(BytecodeEmitter &emitter_);
    1.36  
    1.37 @@ -279,6 +285,15 @@
    1.38    public:
    1.39      HStore(HLValue *lval, HIR *rval)
    1.40        : HIR(lval->type()),
    1.41 +        kind_(TOK_ASSIGN),
    1.42 +        lval_(lval),
    1.43 +        rval_(rval)
    1.44 +    {
    1.45 +    }
    1.46 +
    1.47 +    HStore(TokenKind kind, HLValue *lval, HIR *rval)
    1.48 +      : HIR(lval->type()),
    1.49 +        kind_(kind),
    1.50          lval_(lval),
    1.51          rval_(rval)
    1.52      {
    1.53 @@ -292,10 +307,14 @@
    1.54      HIR *rval() const {
    1.55          return rval_;
    1.56      }
    1.57 +    TokenKind kind() const {
    1.58 +        return kind_;
    1.59 +    }
    1.60  
    1.61    private:
    1.62      HLValue *lval_;
    1.63      HIR *rval_;
    1.64 +    TokenKind kind_;
    1.65  };
    1.66  
    1.67  class HCall : public HIR