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