luehe       2003/01/16 16:51:23

  Modified:    jasper2/src/share/org/apache/jasper/compiler Tag:
                        tomcat_4_branch Generator.java
  Log:
  Fixed 16181: JspWriter not restored properly when exception thrown in a tag's body 
content
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.35.2.16 +49 -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.35.2.15
  retrieving revision 1.35.2.16
  diff -u -r1.35.2.15 -r1.35.2.16
  --- Generator.java    15 Jan 2003 00:20:46 -0000      1.35.2.15
  +++ Generator.java    17 Jan 2003 00:51:23 -0000      1.35.2.16
  @@ -545,6 +545,7 @@
   
        private Hashtable tagVarNumbers;
        private String parent;
  +     private String pushBodyCount;
   
        private ServletWriter out;
        private MethodsBuffer methodsBuffer;
  @@ -1106,6 +1107,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.
  @@ -1170,14 +1172,26 @@
            }
   
            // Generate code for start tag, body, and end tag
  -         generateCustomStart(n, handlerInfo, tagHandlerVar, tagEvalVar);
  +         generateCustomStart(n, handlerInfo, tagHandlerVar, tagEvalVar,
  +                             tagPushBodyCountVar);
   
            String tmpParent = parent;
            parent = tagHandlerVar;
  +         String tmpPushBodyCount = null;
  +         if (n.implementsTryCatchFinally()) {
  +             tmpPushBodyCount = pushBodyCount;
  +             pushBodyCount = tagPushBodyCountVar;
  +         }
  +
            visitBody(n);
   
            parent = tmpParent;
  -         generateCustomEnd(n, tagHandlerVar, tagEvalVar);
  +         if (n.implementsTryCatchFinally()) {
  +             pushBodyCount = tmpPushBodyCount;
  +         }
  +
  +         generateCustomEnd(n, tagHandlerVar, tagEvalVar,
  +                           tagPushBodyCountVar);
   
            if (n.isScriptless() && !n.hasScriptingVars()) {
                // Generate end of method
  @@ -1302,7 +1316,8 @@
        private void generateCustomStart(Node.CustomTag n,
                                         TagHandlerInfo handlerInfo,
                                         String tagHandlerVar,
  -                                      String tagEvalVar)
  +                                      String tagEvalVar,
  +                                      String tagPushBodyCountVar)
                            throws JasperException {
   
            Class tagHandlerClass = handlerInfo.getTagHandlerClass();
  @@ -1337,9 +1352,13 @@
            generateSetters(n, tagHandlerVar, handlerInfo);
            
               if (n.implementsTryCatchFinally()) {
  +             out.printin("int ");
  +             out.print(tagPushBodyCountVar);
  +             out.println(" = 0;");
                   out.printil("try {");
                   out.pushIndent();
               }
  +
            out.printin("int ");
            out.print(tagEvalVar);
            out.print(" = ");
  @@ -1368,6 +1387,13 @@
                    // Assume EVAL_BODY_BUFFERED
                    out.pushIndent();
                    out.printil("javax.servlet.jsp.tagext.BodyContent _bc = 
pageContext.pushBody();");
  +                 if (n.implementsTryCatchFinally()) {
  +                     out.printin(tagPushBodyCountVar);
  +                     out.println("++;");
  +                 } else if (pushBodyCount != null) {
  +                     out.printin(pushBodyCount);
  +                     out.println("++;");
  +                 }
                    out.printil("out = _bc;");
   
                    out.printin(tagHandlerVar);
  @@ -1396,7 +1422,8 @@
        
        private void generateCustomEnd(Node.CustomTag n,
                                       String tagHandlerVar,
  -                                    String tagEvalVar) {
  +                                    String tagEvalVar,
  +                                    String tagPushBodyCountVar) {
   
            VariableInfo[] varInfos = n.getVariableInfos();
            TagVariableInfo[] tagVarInfos = n.getTagVariableInfos();
  @@ -1428,6 +1455,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();
                }
   
  @@ -1450,6 +1484,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]>

Reply via email to