int catchJMPDistance = -1;
if (peekToken() == CATCH) {
+ Vec catchEnds = new Vec();
+ boolean catchAll = false;
+
catchJMPDistance = b.size - tryInsn;
- while(peekToken() == CATCH) {
+
+ while(peekToken() == CATCH && !catchAll) {
String exceptionVar;
getToken();
consume(LP);
b.add(parserLine, LT);
b.add(parserLine, JT);
writebacks[1] = b.size - 1;
+ b.add(parserLine, DUP);
b.add(parserLine, LITERAL, string + "/"); // (slash is ASCII after dot)
b.add(parserLine, GE);
b.add(parserLine, JT);
writebacks[2] = b.size - 1;
} else {
consume(NUMBER);
+ b.add(parserLine, DUP);
b.add(parserLine, LITERAL, number);
b.add(parserLine, EQ);
b.add(parserLine, JF);
writebacks[1] = b.size - 1;
}
+ b.add(parserLine, POP); // pop the element thats on the stack from the compare
+ } else {
+ catchAll = true;
}
consume(RP);
// the exception is on top of the stack; put it to the chosen name
+ b.add(parserLine, NEWSCOPE);
b.add(parserLine, TOPSCOPE);
b.add(parserLine, SWAP);
b.add(parserLine, LITERAL,exceptionVar);
+ b.add(parserLine, DECLARE);
b.add(parserLine, SWAP);
b.add(parserLine, PUT);
b.add(parserLine, POP);
b.add(parserLine, POP);
- parseStatement(b, null);
- b.add(parserLine, LITERAL, null); // so we have something to pop
- for(int i=0; i<3; i++) if (writebacks[i] != -1) b.set(i, JS.N(b.size - i));
+ parseBlock(b, null);
+ b.add(parserLine, OLDSCOPE);
+
+ b.add(parserLine, JMP);
+ catchEnds.addElement(new Integer(b.size-1));
+
+ for(int i=0; i<3; i++) if (writebacks[i] != -1) b.set(writebacks[i], JS.N(b.size-writebacks[i]));
+ b.add(parserLine, POP); // pop the element thats on the stack from the compare
}
+
+ if(!catchAll)
+ b.add(parserLine, THROW);
+
+ for(int i=0;i<catchEnds.size();i++) {
+ int n = ((Integer)catchEnds.elementAt(i)).intValue();
+ b.set(n, JS.N(b.size-n));
+ }
+
// pop the try and catch markers
b.add(parserLine,POP);
b.add(parserLine,POP);
}
-
+
// jump here if no exception was thrown
b.set(successJMPInsn, JS.N(b.size - successJMPInsn));