luehe       2002/06/27 10:32:17

  Modified:    jasper2/src/share/org/apache/jasper/compiler Generator.java
  Log:
  Synchronize scripting variables at the appropriate places (where
  mandated by the spec).
  
  Revision  Changes    Path
  1.35      +58 -43    
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.34
  retrieving revision 1.35
  diff -u -r1.34 -r1.35
  --- Generator.java    26 Jun 2002 16:50:38 -0000      1.34
  +++ Generator.java    27 Jun 2002 17:32:17 -0000      1.35
  @@ -1159,16 +1159,27 @@
                }
            }
   
  +         Class tagHandlerClass = handlerInfo.getTagHandlerClass();
  +         boolean implementsIterationTag = 
  +             IterationTag.class.isAssignableFrom(tagHandlerClass);
  +         boolean implementsBodyTag = 
  +             BodyTag.class.isAssignableFrom(tagHandlerClass);
  +         boolean implementsTryCatchFinally = 
  +             TryCatchFinally.class.isAssignableFrom(tagHandlerClass);
  +
            // Generate code for start tag, body, and end tag
  -         generateCustomStart(n, handlerInfo, tagHandlerVar, tagEvalVar);
  +         generateCustomStart(n, handlerInfo, tagHandlerVar, tagEvalVar,
  +                           implementsIterationTag, implementsBodyTag,
  +                           implementsTryCatchFinally);
   
            String tmpParent = parent;
            parent = tagHandlerVar;
            visitBody(n);
   
            parent = tmpParent;
  -         generateCustomEnd(n, handlerInfo.getTagHandlerClass(),
  -                           tagHandlerVar, tagEvalVar);
  +         generateCustomEnd(n, tagHandlerVar, tagEvalVar,
  +                           implementsIterationTag, implementsBodyTag,
  +                           implementsTryCatchFinally);
   
            if (n.isScriptless() && !n.hasScriptingVars()) {
                // Generate end of method
  @@ -1293,7 +1304,10 @@
        private void generateCustomStart(Node.CustomTag n,
                                         TagHandlerInfo handlerInfo,
                                         String tagHandlerVar,
  -                                      String tagEvalVar)
  +                                      String tagEvalVar,
  +                                      boolean implementsIterationTag,
  +                                      boolean implementsBodyTag,
  +                                      boolean implementsTryCatchFinally)
                            throws JasperException {
   
            Class tagHandlerClass = handlerInfo.getTagHandlerClass();
  @@ -1305,9 +1319,6 @@
            out.printil("{");
            out.pushIndent();
   
  -            boolean implementsTryCatchFinally =
  -                TryCatchFinally.class.isAssignableFrom(tagHandlerClass);
  -
            // Declare scripting variables with NESTED scope
            declareNestedScriptingVariables(n);
   
  @@ -1348,11 +1359,11 @@
            out.print(tagHandlerVar);
            out.println(".doStartTag();");
   
  -         boolean isBodyTag
  -             = BodyTag.class.isAssignableFrom(tagHandlerClass);
  -
  -         // Synchronize AT_BEGIN scripting variables
  -         syncScriptingVariables(n, VariableInfo.AT_BEGIN);
  +         // Synchronize AT_BEGIN and NESTED scripting variables
  +         if (!implementsBodyTag) {
  +             syncScriptingVariables(n, VariableInfo.AT_BEGIN);
  +             syncScriptingVariables(n, VariableInfo.NESTED);
  +         }
   
            if (n.getBody() != null) {
                out.printin("if (");
  @@ -1360,7 +1371,7 @@
                out.println(" != javax.servlet.jsp.tagext.Tag.SKIP_BODY) {");
                out.pushIndent();
                
  -             if (isBodyTag) {
  +             if (implementsBodyTag) {
                    out.printin("if (");
                    out.print(tagEvalVar);
                    out.println(" != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE) 
{");
  @@ -1374,48 +1385,51 @@
                    out.println(".setBodyContent(_bc);");
                    out.printin(tagHandlerVar);
                    out.println(".doInitBody();");
  +
  +                 // Synchronize AT_BEGIN and NESTED scripting variables
  +                 syncScriptingVariables(n, VariableInfo.AT_BEGIN);
  +                 syncScriptingVariables(n, VariableInfo.NESTED);
                    
                    out.popIndent();
                    out.printil("}");
                }
                
  -             if (IterationTag.class.isAssignableFrom(tagHandlerClass)) {
  +             if (implementsIterationTag) {
                    out.printil("do {");
                    out.pushIndent();
                }
            }
  -
  -         // Synchronize NESTED scripting variables
  -         syncScriptingVariables(n, VariableInfo.NESTED);
  -
  -         // Synchronize AT_BEGIN scripting variables
  -         syncScriptingVariables(n, VariableInfo.AT_BEGIN);
        };
        
        private void generateCustomEnd(Node.CustomTag n,
  -                                    Class tagHandlerClass,
                                       String tagHandlerVar,
  -                                    String tagEvalVar) {
  +                                    String tagEvalVar,
  +                                    boolean implementsIterationTag,
  +                                    boolean implementsBodyTag,
  +                                    boolean implementsTryCatchFinally) {
   
            VariableInfo[] varInfos = n.getVariableInfos();
            TagVariableInfo[] tagVarInfos = n.getTagVariableInfos();
   
  -         boolean implementsIterationTag = 
  -             IterationTag.class.isAssignableFrom(tagHandlerClass);
  -         boolean implementsBodyTag = 
  -             BodyTag.class.isAssignableFrom(tagHandlerClass);
  -         boolean implementsTryCatchFinally = 
  -             TryCatchFinally.class.isAssignableFrom(tagHandlerClass);
  -
            if ((n.getBody() != null) && implementsIterationTag) {
  -             out.popIndent();
  -             out.printin("} while (");
  +             out.printin("int evalDoAfterBody = ");
                out.print(tagHandlerVar);
  -             out.println(".doAfterBody() == 
javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN);");
  -         }
  +             out.println(".doAfterBody();");
   
  -         // Synchronize AT_BEGIN scripting variables
  -         syncScriptingVariables(n, VariableInfo.AT_BEGIN);
  +             // Synchronize AT_BEGIN and NESTED scripting variables
  +             if (implementsBodyTag) {
  +                 syncScriptingVariables(n, VariableInfo.AT_BEGIN);
  +                 syncScriptingVariables(n, VariableInfo.NESTED);
  +             }
  +
  +             out.printil("if (evalDoAfterBody != 
javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)");
  +             out.pushIndent();
  +             out.printil("break;");
  +             out.popIndent();
  +
  +             out.popIndent();
  +             out.printil("} while (true);");
  +         }
   
            if (n.getBody() != null) {
                if (implementsBodyTag) {
  @@ -1438,6 +1452,10 @@
            out.printil((methodNesting > 0)? "return true;": "return;");
            out.popIndent();
   
  +         // Synchronize AT_BEGIN and AT_END scripting variables
  +         syncScriptingVariables(n, VariableInfo.AT_BEGIN);
  +         syncScriptingVariables(n, VariableInfo.AT_END);
  +
            // TryCatchFinally
            if (implementsTryCatchFinally) {
                   out.popIndent(); // try
  @@ -1464,9 +1482,6 @@
                   out.println("}");
            }
   
  -         // Synchronize AT_END variables
  -         syncScriptingVariables(n, VariableInfo.AT_END);
  -
            restoreScriptingVariables(n);
            out.popIndent();
            out.printil("}");
  @@ -1511,7 +1526,7 @@
                            out.printin(varInfos[i].getClassName());
                            out.print(" ");
                            out.print(name);
  -                         out.println(";");
  +                         out.println(" = null;");
                        }
                    }
                } else {
  @@ -1546,7 +1561,7 @@
                        out.printin(tagVarInfos[i].getClassName());
                        out.print(" ");
                        out.print(name);
  -                     out.println(";");
  +                     out.println(" = null;");
                    }
                }
            }
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to