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);