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]>