2004/01/12 16:37:22
authorbrian <brian@xwt.org>
Fri, 30 Jan 2004 07:44:13 +0000 (07:44 +0000)
committerbrian <brian@xwt.org>
Fri, 30 Jan 2004 07:44:13 +0000 (07:44 +0000)
darcs-hash:20040130074413-aa32f-5d1bd5838d9b0d907d1ce4baef27f23869f63272.gz

src/org/xwt/js/Parser.java

index 0583202..41e314e 100644 (file)
@@ -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<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));