Author: markt
Date: Fri Jan 27 09:55:04 2017
New Revision: 1780530

URL: http://svn.apache.org/viewvc?rev=1780530&view=rev
Log:
More refactoring of generated code so tags require less code
Extract setters into a separate method when tag handling is in-lined in 
_jspService()

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=1780530&r1=1780529&r2=1780530&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/compiler/Generator.java (original)
+++ tomcat/trunk/java/org/apache/jasper/compiler/Generator.java Fri Jan 27 
09:55:04 2017
@@ -1796,7 +1796,8 @@ class Generator {
             // to a method.
             ServletWriter outSave = null;
             Node.ChildInfo ci = n.getChildInfo();
-            if (ci.isScriptless() && !ci.hasScriptingVars()) {
+            boolean hasNoScriptingElement = ci.isScriptless() && 
!ci.hasScriptingVars();
+            if (hasNoScriptingElement) {
                 // The tag handler and its body code can reside in a separate
                 // method if it is scriptless and does not have any scripting
                 // variable defined.
@@ -1891,14 +1892,14 @@ class Generator {
 
 
             if (n.implementsSimpleTag()) {
-                generateCustomDoTag(n, handlerInfo, tagHandlerVar);
+                generateCustomDoTag(n, handlerInfo, tagHandlerVar, 
hasNoScriptingElement);
             } else {
                 /*
                  * Classic tag handler: Generate code for start element, body,
                  * and end element
                  */
                 generateCustomStart(n, handlerInfo, tagHandlerVar, tagEvalVar,
-                        tagPushBodyCountVar);
+                        tagPushBodyCountVar, hasNoScriptingElement);
 
                 // visit body
                 String tmpParent = parent;
@@ -1926,7 +1927,7 @@ class Generator {
                         tagPushBodyCountVar);
             }
 
-            if (ci.isScriptless() && !ci.hasScriptingVars()) {
+            if (hasNoScriptingElement) {
                 // Generate end of method
                 if (methodNesting > 0) {
                     out.printil("return false;");
@@ -2366,10 +2367,9 @@ class Generator {
             }
         }
 
-        private void generateCustomStart(Node.CustomTag n,
-                TagHandlerInfo handlerInfo, String tagHandlerVar,
-                String tagEvalVar, String tagPushBodyCountVar)
-                throws JasperException {
+        private void generateCustomStart(Node.CustomTag n, TagHandlerInfo 
handlerInfo,
+                String tagHandlerVar, String tagEvalVar, String 
tagPushBodyCountVar,
+                boolean hasNoScriptingElement) throws JasperException {
 
             Class<?> tagHandlerClass =
                 handlerInfo.getTagHandlerClass();
@@ -2407,7 +2407,7 @@ class Generator {
             out.pushIndent();
 
             // includes setting the context
-            generateSetters(n, tagHandlerVar, handlerInfo, false);
+            generateSetters(n, tagHandlerVar, handlerInfo, false, 
hasNoScriptingElement);
 
             if (n.implementsTryCatchFinally()) {
                 out.printin("int[] ");
@@ -2625,9 +2625,8 @@ class Generator {
             restoreScriptingVars(n, VariableInfo.AT_BEGIN);
         }
 
-        private void generateCustomDoTag(Node.CustomTag n,
-                TagHandlerInfo handlerInfo, String tagHandlerVar)
-                throws JasperException {
+        private void generateCustomDoTag(Node.CustomTag n, TagHandlerInfo 
handlerInfo,
+                String tagHandlerVar, boolean hasNoScriptingElement) throws 
JasperException {
 
             Class<?> tagHandlerClass =
                 handlerInfo.getTagHandlerClass();
@@ -2643,7 +2642,7 @@ class Generator {
             String tagHandlerClassName = tagHandlerClass.getCanonicalName();
             writeNewInstance(tagHandlerVar, tagHandlerClassName);
 
-            generateSetters(n, tagHandlerVar, handlerInfo, true);
+            generateSetters(n, tagHandlerVar, handlerInfo, true, 
hasNoScriptingElement);
 
             // Set the body
             if (findJspBody(n) == null) {
@@ -3149,9 +3148,55 @@ class Generator {
         }
 
         private void generateSetters(Node.CustomTag n, String tagHandlerVar,
-                TagHandlerInfo handlerInfo, boolean simpleTag)
+                TagHandlerInfo handlerInfo, boolean simpleTag, boolean 
hasNoScriptingElement)
                 throws JasperException {
 
+            ServletWriter outSave = null;
+            // If the tag contains scripting elements, the setters can still be
+            // generated in a separate method. This reduces the amount of code
+            // required in the _jspService() method
+            if (!hasNoScriptingElement) {
+                outSave = out;
+
+                // Might be better to pass the baseVar
+                String tagSetterMethod = "_jspx_meth_set_" + 
tagHandlerVar.substring(9);
+
+                // Generate a call to the setter method
+                out.printin(tagSetterMethod);
+                out.print("(");
+                out.print(tagHandlerVar);
+                out.print(", _jspx_page_context");
+                if (parent != null) {
+                    out.print(", ");
+                    out.print(parent);
+                }
+                out.println(");");
+
+                // Setup new buffer for the method
+                GenBuffer genBuffer = new GenBuffer(n, null);
+                methodsBuffered.add(genBuffer);
+                out = genBuffer.getOut();
+
+                // Generate code for method declaration
+                out.println();
+                out.pushIndent();
+                out.printin("private void ");
+                out.print(tagSetterMethod);
+                out.print("(");
+                out.print(handlerInfo.getTagHandlerClass().getCanonicalName());
+                out.print(" ");
+                out.print(tagHandlerVar);
+                out.print(", javax.servlet.jsp.PageContext 
_jspx_page_context");
+                if (parent != null) {
+                    out.print(", ");
+                    out.print("javax.servlet.jsp.tagext.JspTag ");
+                    out.print(parent);
+                }
+                out.println(")");
+                out.printil("    throws java.lang.Throwable {");
+                out.pushIndent();
+            }
+
             // Set context
             if (simpleTag) {
                 // Generate alias map
@@ -3247,6 +3292,15 @@ class Generator {
                 out.print(createJspId());
                 out.println("\");");
             }
+
+            if (!hasNoScriptingElement) {
+                out.popIndent();
+                out.printil("}");
+                out.popIndent();
+
+                // restore previous writer
+                out = outSave;
+            }
         }
 
         /*



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to