diff -r c22e983b3b6e -r ccb089827f87 src/compiler/HIR.cpp --- a/src/compiler/HIR.cpp Sun Nov 18 15:50:41 2012 -0800 +++ b/src/compiler/HIR.cpp Sun Nov 18 16:10:43 2012 -0800 @@ -45,6 +45,7 @@ void visitGlobal(HGlobal *global); void visitConvert(HConvert *convert); void visitIndex(HIndex *index); + void visitPostIncDec(HPostIncDec *hir); private: Zone *zone_; @@ -94,6 +95,12 @@ } void +HGlobal::swapAndPick(BytecodeEmitter &emitter_) +{ + __ dup(); +} + +void HGlobal::store(BytecodeEmitter &emitter_) { __ setglobal(sym_); @@ -120,6 +127,17 @@ } void +HLocal::swapAndPick(BytecodeEmitter &emitter_) +{ + if (sym_->type()->isReference()) { + __ swap(); + __ pick2(); + } else { + __ dup(); + } +} + +void HLocal::store(BytecodeEmitter &emitter_) { if (sym_->type()->isReference()) @@ -151,6 +169,15 @@ } void +HIndex::swapAndPick(BytecodeEmitter &emitter_) +{ + // BASE INDEX VALUE + __ roll3(); // INDEX VALUE BASE + __ roll3(); // VALUE BASE INDEX + __ pick3(); // VALUE BASE INDEX VALUE +} + +void HIndex::store(BytecodeEmitter &emitter_) { __ setelem(type()); @@ -253,6 +280,19 @@ } void +HIRTranslator::visitPostIncDec(HPostIncDec *hir) +{ + hir->lval()->bind(this, emitter_); + hir->lval()->hold(emitter_); + hir->lval()->load(emitter_); + hir->lval()->swapAndPick(emitter_); + hir->rval()->accept(this); + __ binary(TokenToOpcode(hir->kind())); + hir->lval()->store(emitter_); + __ pop(); +} + +void HIRTranslator::visitBinary(HBinary *binary) { binary->left()->accept(this);