kinman 02/05/23 17:35:42 Modified: jasper2/src/share/org/apache/jasper/compiler Generator.java Log: - Applied the patch by Denis Benoit, with the following changes. 1. Setting the state back to RELEASE in the "if" branch. 2. Move the tag stack cleanup from the catch to the finally block. The reason for 2. is to handle the case where the doAfterBody returns a SKIP_BODY, and the when the stack needs to be properly clean up. There may still be problems when exceptions ouccur, and the catch block would be executed before the finally block. The "out" referenced in in the catch block may be the wrong one. But I can image anyone can do anything with out when this happen, so i left the code the way it is now. Revision Changes Path 1.15 +53 -137 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java Index: Generator.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- Generator.java 15 May 2002 20:42:03 -0000 1.14 +++ Generator.java 24 May 2002 00:35:41 -0000 1.15 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v 1.14 2002/05/15 20:42:03 kinman Exp $ - * $Revision: 1.14 $ - * $Date: 2002/05/15 20:42:03 $ + * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v 1.15 2002/05/24 00:35:41 kinman Exp $ + * $Revision: 1.15 $ + * $Date: 2002/05/24 00:35:41 $ * * ==================================================================== * @@ -94,9 +94,7 @@ private JspCompilationContext ctxt; private boolean breakAtLF; private PageInfo pageInfo; - private FinallyApplyer finallies; - private int tryBit; - private Stack tryStack; + private int maxTagNesting; /** * @param s the input string @@ -201,7 +199,7 @@ generateDeclarations(page); out.println(); - // Static initializations (none yet) here + // Static initializations here // Static data for getIncludes() out.printil("private static java.util.Vector _jspx_includes;"); @@ -227,8 +225,20 @@ out.println(); } + // Class fields declarations + + maxTagNesting = pageInfo.getMaxTagNesting(); + if (maxTagNesting >= 0) { + out.printil("private static final int RELEASE_ACTION = 0;"); + out.printil("private static final int POP_AND_RELEASE_ACTION = 1;"); + out.println(); + out.println(); + } + // Constructor (empty so far) here + // Methods here + // Method used to get compile time include file dependencies out.printil("public java.util.List getIncludes() {"); out.pushIndent(); @@ -238,18 +248,6 @@ out.println(); out.println(); - out.printil("private void addTagToVector(java.util.Vector tags, int index, Object tag) {"); - out.pushIndent(); - out.printil("if (index + 1 > tags.size())"); - out.pushIndent(); - out.printil("tags.setSize(index + 1);"); - out.popIndent(); - out.printil("tags.setElementAt(tag, index);"); - out.popIndent(); - out.printil("}"); - out.println(); - out.println(); - // Now the service method out.printin("public void "); out.print (serviceMethodName); @@ -272,8 +270,19 @@ out.printil("ServletConfig config = null;"); out.printil("JspWriter out = null;"); out.printil("Object page = this;"); - out.printil("java.util.BitSet bitmask = new java.util.BitSet();"); - out.printil("java.util.Vector tags = new java.util.Vector();"); + + // pseudo "Finally" state stack objects + if (maxTagNesting >= 0) { + String depth = Integer.toString(maxTagNesting + 1); + out.printil("int tagStackIndex = -1;"); + out.printin("int[] tagStackActions = new int["); + out.print(depth); + out.println("];"); + out.printin("javax.servlet.jsp.tagext.Tag[] tagStack = new javax.servlet.jsp.tagext.Tag["); + out.print(depth); + out.println("];"); + out.println(); + } out.printil("try {"); out.pushIndent(); @@ -981,17 +990,10 @@ out.printil("try {"); out.pushIndent(); } else { - out.printil("// try {"); - out.printin("bitmask.set("); - Integer tryBitVal = new Integer(tryBit++); - tryStack.push(tryBitVal); - out.print(tryBitVal.toString()); - out.println(");"); - out.printin("addTagToVector(tags, "); - out.print(tryBitVal.toString()); - out.print(", "); + out.printil("tagStackActions[++tagStackIndex] = RELEASE_ACTION;"); + out.printin("tagStack[tagStackIndex] = "); out.print(tagHandlerVar); - out.println(");"); + out.println(";"); } out.printin("int "); out.print(tagEvalVar); @@ -1014,17 +1016,6 @@ out.pushIndent(); if (isBodyTag) { - out.printil("// try {"); - out.printin("bitmask.set("); - Integer tryBitVal = new Integer(tryBit++); - tryStack.push(tryBitVal); - out.print(tryBitVal.toString()); - out.println(");"); - out.printin("addTagToVector(tags, "); - out.print(tryBitVal.toString()); - out.print(", new Integer("); - out.print(tagEvalVar); - out.println("));"); out.printin("if ("); out.print(tagEvalVar); out.println(" != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE) {"); @@ -1032,6 +1023,10 @@ out.pushIndent(); out.printil("out = pageContext.pushBody();"); + if (!implementsTryCatchFinally) { + out.printil("tagStackActions[tagStackIndex]" + + " = POP_AND_RELEASE_ACTION;"); + } out.printin(tagHandlerVar); out.println(".setBodyContent((javax.servlet.jsp.tagext.BodyContent) out);"); out.printin(tagHandlerVar); @@ -1086,29 +1081,15 @@ if (n.getBody() != null) { if (implementsBodyTag) { - Integer tryBitVal = (Integer)tryStack.pop(); - out.printil("// } finally {"); - out.printin("bitmask.clear("); - out.print(tryBitVal.toString()); - out.println(");"); - out.printin("if ("); out.print(tagEvalVar); out.println(" != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE)"); out.pushIndent(); + if (!implementsTryCatchFinally) { + out.printil("tagStackActions[tagStackIndex] = RELEASE_ACTION;"); + } out.printil("out = pageContext.popBody();"); out.popIndent(); - - finallies.beginPartMethod(tryBitVal.intValue()); - finallies.print(" if ("); - finallies.print("((Integer)tags.elementAt("); - finallies.print(tryBitVal.toString()); - finallies.print(")).intValue()"); - finallies.println(" != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE)"); - finallies.println(" out = pageContext.popBody();"); - - finallies.endPartMethod(); - out.printil("// }"); } out.popIndent(); // EVAL_BODY @@ -1139,20 +1120,9 @@ out.popIndent(); out.printil("}"); } else { - Integer tryBitVal = (Integer)tryStack.pop(); - out.printil("// } finally {"); - out.printin("bitmask.clear("); - out.print(tryBitVal.toString()); - out.println(");"); + out.printil("tagStackIndex--;"); out.printin(tagHandlerVar); out.println(".release();"); - out.printil("// }"); - finallies.beginPartMethod(tryBitVal.intValue()); - finallies.printin("((javax.servlet.jsp.tagext.Tag)tags.elementAt("); - finallies.print(tryBitVal.toString()); - finallies.print("))"); - finallies.println(".release();"); - finallies.endPartMethod(); } // Declare and update AT_END variables @@ -1428,17 +1398,19 @@ out.printil("} finally {"); out.pushIndent(); - // Do stuff here for finally actions... + // Cleanup the tags on the stack + if (maxTagNesting >= 0) { + out.printil("while (tagStackIndex >= 0) {"); + out.pushIndent(); + out.printil("if (POP_AND_RELEASE_ACTION == tagStackActions[tagStackIndex])"); + out.pushIndent(); + out.printil("out = pageContext.popBody();"); + out.popIndent(); + out.printil("tagStack[tagStackIndex--].release();"); + out.popIndent(); + out.printil("}"); + } - out.printil("try {"); - out.pushIndent(); - out.printil("finallies(bitmask, out, tags, pageContext);"); - out.popIndent(); - out.printil("} catch (javax.servlet.jsp.JspException e) {"); - out.pushIndent(); - out.printil("if (pageContext != null) pageContext.handlePageException(e);"); - out.popIndent(); - out.printil("}"); out.printil("if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext);"); out.popIndent(); @@ -1448,10 +1420,6 @@ out.popIndent(); out.printil("}"); - // Call the final method - finallies.done(); - out.printil(finallies.toString()); - // Close the class definition out.popIndent(); out.printil("}"); @@ -1467,8 +1435,6 @@ pageInfo = compiler.getPageInfo(); beanInfo = pageInfo.getBeanRepository(); breakAtLF = ctxt.getOptions().getMappedFile(); - finallies = new FinallyApplyer(); - tryStack = new Stack(); } /** @@ -1563,55 +1529,5 @@ return tagHandlerClass; } } - - private static class FinallyApplyer { - private PrintStream finalOutput; - private ByteArrayOutputStream rawOutput; - - FinallyApplyer() { - rawOutput = new ByteArrayOutputStream(); - finalOutput = new PrintStream(rawOutput, true); - - finalOutput.println(); - finalOutput.println(" private void finallies(java.util.BitSet bitmask, JspWriter out, java.util.Vector tags, PageContext pageContext)"); - finalOutput.println(" throws javax.servlet.jsp.JspException {"); - } - - public void done() { - finalOutput.println(" }"); - } - - public void beginPartMethod(int bit) { - finalOutput.print(" if (bitmask.get("); - finalOutput.print(bit); - finalOutput.println(")) {"); - } - - public void endPartMethod() { - finalOutput.println(" }"); - finalOutput.println(); - } - - public void println(String aLine) { - if (null != aLine) { - finalOutput.print(aLine); - } - finalOutput.println(); - } - - public void printin(String partLine) { - finalOutput.print(" "); - finalOutput.print(partLine); - } - - public void print(String partLine) { - finalOutput.print(partLine); - } - - public String toString() { - return rawOutput.toString(); - } - } - }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>