Author: markt
Date: Wed May 14 21:02:27 2014
New Revision: 1594715

URL: http://svn.apache.org/r1594715
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56516
Place declarations for all scripting variables marked with declare=true
at the start of the page so they are always visible to the entire page.

Modified:
    tomcat/trunk/java/org/apache/jasper/compiler/Generator.java

Modified: tomcat/trunk/java/org/apache/jasper/compiler/Generator.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/compiler/Generator.java?rev=1594715&r1=1594714&r2=1594715&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/compiler/Generator.java (original)
+++ tomcat/trunk/java/org/apache/jasper/compiler/Generator.java Wed May 14 
21:02:27 2014
@@ -351,7 +351,7 @@ class Generator {
         page.visit(new TagHandlerPoolVisitor(tagHandlerPoolNames));
     }
 
-    private void declareTemporaryScriptingVars(Node.Nodes page)
+    private void declareScriptingVars(Node.Nodes page)
             throws JasperException {
 
         class ScriptingVarVisitor extends Node.Visitor {
@@ -364,6 +364,13 @@ class Generator {
 
             @Override
             public void visit(Node.CustomTag n) throws JasperException {
+                // Declare scripting variables so they are visible to the 
entire
+                // page.
+                declareScriptingVars(n, VariableInfo.AT_BEGIN);
+                declareScriptingVars(n, VariableInfo.AT_END);
+                declareScriptingVars(n, VariableInfo.NESTED);
+
+                // Declare temporary scripting variables
                 // XXX - Actually there is no need to declare those
                 // "_jspx_" + varName + "_" + nestingLevel variables when we 
are
                 // inside a JspFragment.
@@ -414,6 +421,42 @@ class Generator {
 
                 visitBody(n);
             }
+
+            private void declareScriptingVars(Node.CustomTag n, int scope) {
+
+                List<Object> vec = n.getScriptingVars(scope);
+                if (vec != null) {
+                    for (int i = 0; i < vec.size(); i++) {
+                        Object elem = vec.get(i);
+                        if (elem instanceof VariableInfo) {
+                            VariableInfo varInfo = (VariableInfo) elem;
+                            if (varInfo.getDeclare()) {
+                                out.printin(varInfo.getClassName());
+                                out.print(" ");
+                                out.print(varInfo.getVarName());
+                                out.println(" = null;");
+                            }
+                        } else {
+                            TagVariableInfo tagVarInfo = (TagVariableInfo) 
elem;
+                            if (tagVarInfo.getDeclare()) {
+                                String varName = tagVarInfo.getNameGiven();
+                                if (varName == null) {
+                                    varName = 
n.getTagData().getAttributeString(
+                                            tagVarInfo.getNameFromAttribute());
+                                } else if (tagVarInfo.getNameFromAttribute() 
!= null) {
+                                    // alias
+                                    continue;
+                                }
+                                out.printin(tagVarInfo.getClassName());
+                                out.print(" ");
+                                out.print(varName);
+                                out.println(" = null;");
+                            }
+                        }
+                    }
+                }
+            }
+
         }
 
         page.visit(new ScriptingVarVisitor());
@@ -667,7 +710,7 @@ class Generator {
         out.printil("javax.servlet.jsp.PageContext _jspx_page_context = 
null;");
         out.println();
 
-        declareTemporaryScriptingVars(page);
+        declareScriptingVars(page);
         out.println();
 
         out.printil("try {");
@@ -2235,8 +2278,7 @@ class Generator {
             out.println(n.getQName());
             n.setBeginJavaLine(out.getJavaLine());
 
-            // Declare AT_BEGIN scripting variables
-            declareScriptingVars(n, VariableInfo.AT_BEGIN);
+            // Save AT_BEGIN scripting variables
             saveScriptingVars(n, VariableInfo.AT_BEGIN);
 
             String tagHandlerClassName = tagHandlerClass.getCanonicalName();
@@ -2291,8 +2333,7 @@ class Generator {
                 out.println(" != javax.servlet.jsp.tagext.Tag.SKIP_BODY) {");
                 out.pushIndent();
 
-                // Declare NESTED scripting variables
-                declareScriptingVars(n, VariableInfo.NESTED);
+                // Save NESTED scripting variables
                 saveScriptingVars(n, VariableInfo.NESTED);
 
                 if (n.implementsBodyTag()) {
@@ -2479,9 +2520,8 @@ class Generator {
                 out.printil("}");
             }
 
-            // Declare and synchronize AT_END scripting variables (must do this
+            // synchronize AT_END scripting variables (must do this
             // outside the try/catch/finally block)
-            declareScriptingVars(n, VariableInfo.AT_END);
             syncScriptingVars(n, VariableInfo.AT_END);
 
             restoreScriptingVars(n, VariableInfo.AT_BEGIN);
@@ -2498,8 +2538,7 @@ class Generator {
             out.printin("//  ");
             out.println(n.getQName());
 
-            // Declare AT_BEGIN scripting variables
-            declareScriptingVars(n, VariableInfo.AT_BEGIN);
+            // Save AT_BEGIN scripting variables
             saveScriptingVars(n, VariableInfo.AT_BEGIN);
 
             String tagHandlerClassName = tagHandlerClass.getCanonicalName();
@@ -2552,8 +2591,7 @@ class Generator {
             // Synchronize AT_BEGIN scripting variables
             syncScriptingVars(n, VariableInfo.AT_BEGIN);
 
-            // Declare and synchronize AT_END scripting variables
-            declareScriptingVars(n, VariableInfo.AT_END);
+            // synchronize AT_END scripting variables
             syncScriptingVars(n, VariableInfo.AT_END);
 
             // Resource injection
@@ -2562,46 +2600,6 @@ class Generator {
             n.setEndJavaLine(out.getJavaLine());
         }
 
-        private void declareScriptingVars(Node.CustomTag n, int scope) {
-            if (isFragment) {
-                // No need to declare Java variables, if we inside a
-                // JspFragment, because a fragment is always scriptless.
-                return;
-            }
-
-            List<Object> vec = n.getScriptingVars(scope);
-            if (vec != null) {
-                for (int i = 0; i < vec.size(); i++) {
-                    Object elem = vec.get(i);
-                    if (elem instanceof VariableInfo) {
-                        VariableInfo varInfo = (VariableInfo) elem;
-                        if (varInfo.getDeclare()) {
-                            out.printin(varInfo.getClassName());
-                            out.print(" ");
-                            out.print(varInfo.getVarName());
-                            out.println(" = null;");
-                        }
-                    } else {
-                        TagVariableInfo tagVarInfo = (TagVariableInfo) elem;
-                        if (tagVarInfo.getDeclare()) {
-                            String varName = tagVarInfo.getNameGiven();
-                            if (varName == null) {
-                                varName = n.getTagData().getAttributeString(
-                                        tagVarInfo.getNameFromAttribute());
-                            } else if (tagVarInfo.getNameFromAttribute() != 
null) {
-                                // alias
-                                continue;
-                            }
-                            out.printin(tagVarInfo.getClassName());
-                            out.print(" ");
-                            out.print(varName);
-                            out.println(" = null;");
-                        }
-                    }
-                }
-            }
-        }
-
         /*
          * This method is called as part of the custom tag's start element.
          *
@@ -3609,7 +3607,7 @@ class Generator {
 
         generatePageScopedVariables(tagInfo);
 
-        declareTemporaryScriptingVars(tag);
+        declareScriptingVars(tag);
         out.println();
 
         out.printil("try {");



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to