luehe 2003/01/16 16:51:35 Modified: jasper2/src/share/org/apache/jasper/compiler Generator.java Log: Fixed 16181: JspWriter not restored properly when exception thrown in a tag's body content Revision Changes Path 1.149 +48 -7 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.148 retrieving revision 1.149 diff -u -r1.148 -r1.149 --- Generator.java 15 Jan 2003 22:46:29 -0000 1.148 +++ Generator.java 17 Jan 2003 00:51:34 -0000 1.149 @@ -706,6 +706,7 @@ private Hashtable tagVarNumbers; private String parent; + private String pushBodyCount; private String simpleTagHandlerVar; private boolean isSimpleTagHandler; private boolean isFragment; @@ -1489,6 +1490,7 @@ n.getShortName()); String tagEvalVar = "_jspx_eval_" + baseVar; String tagHandlerVar = "_jspx_th_" + baseVar; + String tagPushBodyCountVar = "_jspx_push_body_count_" + baseVar; // If the tag contains no scripting element, generate its codes // to a method. @@ -1551,18 +1553,30 @@ * Classic tag handler: Generate code for start element, body, * and end element */ - generateCustomStart(n, handlerInfo, tagHandlerVar, tagEvalVar); + generateCustomStart(n, handlerInfo, tagHandlerVar, tagEvalVar, + tagPushBodyCountVar); // visit body String tmpParent = parent; parent = tagHandlerVar; + String tmpPushBodyCount = null; + if (n.implementsTryCatchFinally()) { + tmpPushBodyCount = pushBodyCount; + pushBodyCount = tagPushBodyCountVar; + } boolean tmpIsSimpleTagHandler = isSimpleTagHandler; isSimpleTagHandler = false; + visitBody(n); + parent = tmpParent; + if (n.implementsTryCatchFinally()) { + pushBodyCount = tmpPushBodyCount; + } isSimpleTagHandler = tmpIsSimpleTagHandler; - generateCustomEnd(n, tagHandlerVar, tagEvalVar); + generateCustomEnd(n, tagHandlerVar, tagEvalVar, + tagPushBodyCountVar); } if (ci.isScriptless() && !ci.hasScriptingVars()) { @@ -1911,7 +1925,8 @@ private void generateCustomStart(Node.CustomTag n, TagHandlerInfo handlerInfo, String tagHandlerVar, - String tagEvalVar) + String tagEvalVar, + String tagPushBodyCountVar) throws JasperException { Class tagHandlerClass = handlerInfo.getTagHandlerClass(); @@ -1946,6 +1961,9 @@ generateSetters(n, tagHandlerVar, handlerInfo, false); if (n.implementsTryCatchFinally()) { + out.printin("int "); + out.print(tagPushBodyCountVar); + out.println(" = 0;"); out.printil("try {"); out.pushIndent(); } @@ -1977,6 +1995,13 @@ // Assume EVAL_BODY_BUFFERED out.pushIndent(); out.printil("out = pageContext.pushBody();"); + if (n.implementsTryCatchFinally()) { + out.printin(tagPushBodyCountVar); + out.println("++;"); + } else if (pushBodyCount != null) { + out.printin(pushBodyCount); + out.println("++;"); + } out.printin(tagHandlerVar); out.println(".setBodyContent((javax.servlet.jsp.tagext.BodyContent) out);"); out.printin(tagHandlerVar); @@ -2003,7 +2028,8 @@ private void generateCustomEnd(Node.CustomTag n, String tagHandlerVar, - String tagEvalVar) { + String tagEvalVar, + String tagPushBodyCountVar) { if (!n.hasEmptyBody()) { if (n.implementsIterationTag()) { @@ -2032,6 +2058,13 @@ out.println(" != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE)"); out.pushIndent(); out.printil("out = pageContext.popBody();"); + if (n.implementsTryCatchFinally()) { + out.printin(tagPushBodyCountVar); + out.println("--;"); + } else if (pushBodyCount != null) { + out.printin(pushBodyCount); + out.println("--;"); + } out.popIndent(); } @@ -2058,6 +2091,14 @@ out.popIndent(); // try out.printil("} catch (Throwable _jspx_exception) {"); out.pushIndent(); + + out.printin("while ("); + out.print(tagPushBodyCountVar); + out.println("-- > 0)"); + out.pushIndent(); + out.printil("out = pageContext.popBody();"); + out.popIndent(); + out.printin(tagHandlerVar); out.println(".doCatch(_jspx_exception);"); out.popIndent();
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>