switch(tok) {
case ASSIGN_BITOR: case ASSIGN_BITXOR: case ASSIGN_BITAND: case ASSIGN_LSH: case ASSIGN_RSH: case ASSIGN_URSH:
case ASSIGN_MUL: case ASSIGN_DIV: case ASSIGN_MOD: case ASSIGN_ADD: case ASSIGN_SUB: {
- b.add(parserLine, GET_PRESERVE);
+ if (tok != ASSIGN_ADD && tok != ASSIGN_SUB) b.add(parserLine, GET_PRESERVE);
+
startExpr(b, precedence[tok]);
+
int size = b.size;
if (tok == ASSIGN_ADD || tok == ASSIGN_SUB) {
b.add(parserLine, tok);
+ b.add(parserLine, GET);
+ b.add(parserLine, SWAP);
}
+
// tok-1 is always s/^ASSIGN_// (0 is BITOR, 1 is ASSIGN_BITOR, etc)
b.add(parserLine, tok - 1, tok-1==ADD ? JS.N(2) : null);
b.add(parserLine, PUT);
b.add(parserLine, SWAP);
b.add(parserLine, POP);
+
if (tok == ASSIGN_ADD || tok == ASSIGN_SUB) b.set(size, tok, JS.N(b.size - size));
break;
}