throw pe("prefixed increment/decrement can only be performed on a valid assignment target");
b.add(parserLine, GET_PRESERVE, Boolean.TRUE);
b.add(parserLine, LITERAL, new Integer(1));
- b.add(parserLine, tok == INC ? ADD : SUB, null);
+ b.add(parserLine, tok == INC ? ADD : SUB, new Integer(2));
b.add(parserLine, PUT, null);
b.add(parserLine, SWAP, null);
b.add(parserLine, POP, null);
case INC: case DEC: { // postfix
b.add(parserLine, GET_PRESERVE, Boolean.TRUE);
b.add(parserLine, LITERAL, new Integer(1));
- b.add(parserLine, tok == INC ? ADD : SUB, null);
+ b.add(parserLine, tok == INC ? ADD : SUB, new Integer(2));
b.add(parserLine, PUT, null);
b.add(parserLine, SWAP, null);
b.add(parserLine, POP, null);
break;
}
case LP: {
- int n = parseArgs(b);
-
- // if the object supports CALLMETHOD, we use this, and jump over the following two instructions
- b.add(parserLine,CALLMETHOD,new Integer(n));
- b.add(parserLine,GET);
- b.add(parserLine,CALL,new Integer(n));
+ int n = parseArgs(b, 2);
+ b.add(parserLine, GET_PRESERVE);
+ b.add(parserLine, CALLMETHOD, new Integer(n));
break;
}
default: {
switch (tok) {
case LP: { // invocation (not grouping)
- int n = parseArgs(b);
+ int n = parseArgs(b, 1);
b.add(parserLine, CALL, new Integer(n));
break;
}
// parse a set of comma separated function arguments, assume LP has already been consumed
// if swap is true, (because the function is already on the stack) we will SWAP after each argument to keep it on top
- private int parseArgs(JSFunction b) throws IOException {
+ private int parseArgs(JSFunction b, int pushdown) throws IOException {
int i = 0;
while(peekToken() != RP) {
i++;
if (peekToken() != COMMA) {
startExpr(b, NO_COMMA);
- b.add(parserLine, SWAP, new Integer(2));
+ b.add(parserLine, SWAP, new Integer(pushdown));
if (peekToken() == RP) break;
}
consume(COMMA);