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