From 796639d0a5052d68cdf91f88139f3d6c45996430 Mon Sep 17 00:00:00 2001 From: brian Date: Fri, 30 Jan 2004 07:44:13 +0000 Subject: [PATCH] 2004/01/12 16:37:22 darcs-hash:20040130074413-aa32f-5d1bd5838d9b0d907d1ce4baef27f23869f63272.gz --- src/org/xwt/js/Parser.java | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/src/org/xwt/js/Parser.java b/src/org/xwt/js/Parser.java index 0583202..41e314e 100644 --- a/src/org/xwt/js/Parser.java +++ b/src/org/xwt/js/Parser.java @@ -726,8 +726,12 @@ class Parser extends Lexer implements ByteCodes { 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); @@ -753,36 +757,57 @@ class Parser extends Lexer implements ByteCodes { 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