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: [email protected]
For additional commands, e-mail: [email protected]