According to JSP.7.4 ("The Tag Library Descriptor Format"), it is
illegal for a tag to define scripting variables in both its TLD and
TagExtraInfo class.

Jasper already enforces this, but its code generator makes separate
method calls for declaring/synchronizing scripting variables from a
TLD and those from the TagExtraInfo class, like this:

  // Update AT_BEGIN variables
  updateVariableInfos(varInfos, VariableInfo.AT_BEGIN, false);
  updateTagVariableInfos(tagVarInfos, n.getTagData(),

This can be simplified, since if "varInfos" is non-null, "tagVarInfos"
must be null, and vice-versa.

The proposed patch collapses the above method calls into one.

Also, the code generator makes separate method calls to declare
AT_BEGIN scripting variables outside the try-finally block, and then
synchronizing them inside the try-finally block.

Now that try-finally has been flattened, no separate declaration of
AT_BEGIN variables is required, that is, AT_BEGIN variables can be
declared when they are first synchronized (after a call to
doStartTag()), just as NESTED and AT_END variables. This makes
declareVariableInfos() and declareTagVariableInfos() redundant

As a summary, the attached patch replaces

  declareVariableInfos(),
  declareTagVariableInfos(),
  updateVariableInfos(), and
  updateTagVariableInfos()

with a single

  syncScriptingVariables().


Jan


? build
? build.xml.SAVE
Index: src/share/org/apache/jasper/compiler/Generator.java
===================================================================
RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Generator.java,v
retrieving revision 1.15
diff -u -r1.15 Generator.java
--- src/share/org/apache/jasper/compiler/Generator.java 24 May 2002 00:35:41 -0000     
 1.15
+++ src/share/org/apache/jasper/compiler/Generator.java 24 May 2002 22:12:51 -0000
@@ -981,11 +981,6 @@
            out.println("();");
            generateSetters(n, tagHandlerVar, handlerInfo);
            
-           // Declare AT_BEGIN variables
-           declareVariableInfos(varInfos, VariableInfo.AT_BEGIN);
-           declareTagVariableInfos(tagVarInfos, n.getTagData(),
-                                   VariableInfo.AT_BEGIN);
-           
             if (implementsTryCatchFinally) {
                 out.printil("try {");
                 out.pushIndent();
@@ -1004,10 +999,9 @@
            boolean isBodyTag
                = BodyTag.class.isAssignableFrom(tagHandlerClass);
 
-           // Update AT_BEGIN variables
-           updateVariableInfos(varInfos, VariableInfo.AT_BEGIN, false);
-           updateTagVariableInfos(tagVarInfos, n.getTagData(),
-                                  VariableInfo.AT_BEGIN, false);
+           // Declare and synchronize AT_BEGIN scripting variables
+           syncScriptingVariables(varInfos, tagVarInfos, n.getTagData(),
+                                  VariableInfo.AT_BEGIN, true);
 
            if (n.getBody() != null) {
                out.printin("if (");
@@ -1042,14 +1036,12 @@
                }
            }
 
-           // Declare and update NESTED variables
-           updateVariableInfos(varInfos, VariableInfo.NESTED, true);
-           updateTagVariableInfos(tagVarInfos, n.getTagData(),
+           // Declare and synchronize NESTED scripting variables
+           syncScriptingVariables(varInfos, tagVarInfos, n.getTagData(),
                                   VariableInfo.NESTED, true);
 
-           // Update AT_BEGIN variables
-           updateVariableInfos(varInfos, VariableInfo.AT_BEGIN, false);
-           updateTagVariableInfos(tagVarInfos, n.getTagData(),
+           // Synchronize AT_BEGIN scripting variables
+           syncScriptingVariables(varInfos, tagVarInfos, n.getTagData(),
                                   VariableInfo.AT_BEGIN, false);
        };
        
@@ -1074,9 +1066,8 @@
                out.println(".doAfterBody() == 
javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN);");
            }
 
-           // Update AT_BEGIN variables
-           updateVariableInfos(varInfos, VariableInfo.AT_BEGIN, false);
-           updateTagVariableInfos(tagVarInfos, n.getTagData(),
+           // Synchronize AT_BEGIN scripting variables
+           syncScriptingVariables(varInfos, tagVarInfos, n.getTagData(),
                                   VariableInfo.AT_BEGIN, false);
 
            if (n.getBody() != null) {
@@ -1125,94 +1116,57 @@
                 out.println(".release();");
            }
 
-           // Declare and update AT_END variables
-           updateVariableInfos(varInfos, VariableInfo.AT_END, true);
-           updateTagVariableInfos(tagVarInfos, n.getTagData(),
+           // Declare and synchronize AT_END variables
+           syncScriptingVariables(varInfos, tagVarInfos, n.getTagData(),
                                   VariableInfo.AT_END, true);
 
            n.setEndJavaLine(out.getJavaLine());
        }
 
-       private void declareVariableInfos(VariableInfo[] varInfos, int scope) {
-           if (varInfos == null)
-               return;
-           
-           for (int i=0; i<varInfos.length; i++) {
-               if ((varInfos[i].getScope() == scope)
-                       && varInfos[i].getDeclare()) {
-                   out.printin(varInfos[i].getClassName());
-                   out.print(" ");
-                   out.print(varInfos[i].getVarName());
-                   out.println(" = null;");
-               }
-           }
-       }
-
-       private void updateVariableInfos(VariableInfo[] varInfos, int scope,
-                                        boolean declare) {
-           if (varInfos == null)
-               return;
-
-           for (int i=0; i<varInfos.length; i++) {
-               if (varInfos[i].getScope() == scope) {
-                   if (declare && varInfos[i].getDeclare()) {
-                       out.printin(varInfos[i].getClassName() + " ");
-                   }
-                   out.printin(varInfos[i].getVarName());
-                   out.print(" = (");
-                   out.print(varInfos[i].getClassName());
-                   out.print(") pageContext.findAttribute(");
-                   out.print(quote(varInfos[i].getVarName()));
-                   out.println(");");
-               }
-           }               
-       }
+       private void syncScriptingVariables(VariableInfo[] varInfos,
+                                           TagVariableInfo[] tagVarInfos,
+                                           TagData tagData,
+                                           int scope,
+                                           boolean declare) {
 
-       private void declareTagVariableInfos(TagVariableInfo[] tagVarInfos,
-                                            TagData tagData, int scope) {
-           if (tagVarInfos == null)
+           if ((varInfos == null) && (tagVarInfos == null)) {
                return;
-
-            for (int i=0; i<tagVarInfos.length; i++) {
-               String name = tagVarInfos[i].getNameGiven();
-               if (name == null) {
-                   name = tagData.getAttributeString(
-                                    tagVarInfos[i].getNameFromAttribute());
-               }
-                if ((tagVarInfos[i].getScope() == scope)
-                        && tagVarInfos[i].getDeclare()) {
-                   out.printin(tagVarInfos[i].getClassName());
-                   out.print(" ");
-                   out.print(name);
-                   out.println(" = null;");
-               }
            }
-       }
 
-       private void updateTagVariableInfos(TagVariableInfo[] tagVarInfos,
-                                           TagData tagData, int scope,
-                                           boolean declare) {
-           if (tagVarInfos == null)
-               return;
-
-            for (int i=0; i<tagVarInfos.length; i++) {
-               String name = tagVarInfos[i].getNameGiven();
-               if (name == null) {
-                   name = tagData.getAttributeString(
-                                    tagVarInfos[i].getNameFromAttribute());
+           if (varInfos != null) {
+               for (int i=0; i<varInfos.length; i++) {
+                   if (varInfos[i].getScope() == scope) {
+                       if (declare && varInfos[i].getDeclare()) {
+                           out.printin(varInfos[i].getClassName() + " ");
+                       }
+                       out.printin(varInfos[i].getVarName());
+                       out.print(" = (");
+                       out.print(varInfos[i].getClassName());
+                       out.print(") pageContext.findAttribute(");
+                       out.print(quote(varInfos[i].getVarName()));
+                       out.println(");");
+                   }
                }
-                if (tagVarInfos[i].getScope() == scope) {
-                   if (declare && tagVarInfos[i].getDeclare()) {
-                       out.printin(tagVarInfos[i].getClassName() + " ");
+           } else {
+               for (int i=0; i<tagVarInfos.length; i++) {
+                   String name = tagVarInfos[i].getNameGiven();
+                   if (name == null) {
+                       name = tagData.getAttributeString(
+                                        tagVarInfos[i].getNameFromAttribute());
+                   }
+                   if (tagVarInfos[i].getScope() == scope) {
+                       if (declare && tagVarInfos[i].getDeclare()) {
+                           out.printin(tagVarInfos[i].getClassName() + " ");
+                       }
+                       out.printin(name);
+                       out.print(" = (");
+                       out.print(tagVarInfos[i].getClassName());
+                       out.print(") pageContext.findAttribute(");
+                       out.print(quote(name));
+                       out.println(");");
                    }
-                   out.printin(name);
-                   out.print(" = (");
-                   out.print(tagVarInfos[i].getClassName());
-                   out.print(") pageContext.findAttribute(");
-                   out.print(quote(name));
-                   out.println(");");
                }
-           }
+           }    
        }
 
        private String replace(String name, char replace, String with) {
Index: src/share/org/apache/jasper/resources/messages.properties
===================================================================
RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/resources/messages.properties,v
retrieving revision 1.6
diff -u -r1.6 messages.properties
--- src/share/org/apache/jasper/resources/messages.properties   16 May 2002 20:59:21 
-0000      1.6
+++ src/share/org/apache/jasper/resources/messages.properties   24 May 2002 22:12:51 
+-0000
@@ -127,7 +127,7 @@
 jsp.warning.unknown.element.in.attribute=Warning: Unknown element {0} in attribute
 jsp.error.more.than.one.taglib=More than one taglib in the TLD: {0}
 jsp.warning.teiclass.is.null=Could not load TagExtraInfo class {0}: {1}
-jsp.warning.teiclass.is.nonnull=variable susbelement defined in tld when TagExtraInfo 
class {0} is non-null
+jsp.warning.teiclass.is.nonnull=variable subelement defined in tld when TagExtraInfo 
+class {0} is non-null
 jsp.error.parse.error.in.TLD=Parse Error in the tag library descriptor: {0}
 jsp.error.unable.to.open.TLD=Unable to open the tag library descriptor: {0}
 jsp.buffer.size.zero=Buffer size <= 0

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

Reply via email to