src/compiler/HIR.cpp
changeset 218 ccb089827f87
parent 217 c22e983b3b6e
child 220 5df4a112967d
     1.1 --- a/src/compiler/HIR.cpp	Sun Nov 18 15:50:41 2012 -0800
     1.2 +++ b/src/compiler/HIR.cpp	Sun Nov 18 16:10:43 2012 -0800
     1.3 @@ -45,6 +45,7 @@
     1.4      void visitGlobal(HGlobal *global);
     1.5      void visitConvert(HConvert *convert);
     1.6      void visitIndex(HIndex *index);
     1.7 +    void visitPostIncDec(HPostIncDec *hir);
     1.8  
     1.9    private:
    1.10      Zone *zone_;
    1.11 @@ -94,6 +95,12 @@
    1.12  }
    1.13  
    1.14  void
    1.15 +HGlobal::swapAndPick(BytecodeEmitter &emitter_)
    1.16 +{
    1.17 +    __ dup();
    1.18 +}
    1.19 +
    1.20 +void
    1.21  HGlobal::store(BytecodeEmitter &emitter_)
    1.22  {
    1.23      __ setglobal(sym_);
    1.24 @@ -120,6 +127,17 @@
    1.25  }
    1.26  
    1.27  void
    1.28 +HLocal::swapAndPick(BytecodeEmitter &emitter_)
    1.29 +{
    1.30 +    if (sym_->type()->isReference()) {
    1.31 +        __ swap();
    1.32 +        __ pick2();
    1.33 +    } else {
    1.34 +        __ dup();
    1.35 +    }
    1.36 +}
    1.37 +
    1.38 +void
    1.39  HLocal::store(BytecodeEmitter &emitter_)
    1.40  {
    1.41      if (sym_->type()->isReference())
    1.42 @@ -151,6 +169,15 @@
    1.43  }
    1.44  
    1.45  void
    1.46 +HIndex::swapAndPick(BytecodeEmitter &emitter_)
    1.47 +{
    1.48 +    // BASE INDEX VALUE
    1.49 +    __ roll3();         // INDEX VALUE BASE
    1.50 +    __ roll3();         // VALUE BASE INDEX
    1.51 +    __ pick3();         // VALUE BASE INDEX VALUE
    1.52 +}
    1.53 +
    1.54 +void
    1.55  HIndex::store(BytecodeEmitter &emitter_)
    1.56  {
    1.57      __ setelem(type());
    1.58 @@ -253,6 +280,19 @@
    1.59  }
    1.60  
    1.61  void
    1.62 +HIRTranslator::visitPostIncDec(HPostIncDec *hir)
    1.63 +{
    1.64 +    hir->lval()->bind(this, emitter_);
    1.65 +    hir->lval()->hold(emitter_);
    1.66 +    hir->lval()->load(emitter_);
    1.67 +    hir->lval()->swapAndPick(emitter_);
    1.68 +    hir->rval()->accept(this);
    1.69 +    __ binary(TokenToOpcode(hir->kind()));
    1.70 +    hir->lval()->store(emitter_);
    1.71 +    __ pop();
    1.72 +}
    1.73 +
    1.74 +void
    1.75  HIRTranslator::visitBinary(HBinary *binary)
    1.76  {
    1.77      binary->left()->accept(this);