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]>