When pushing params, now just keep track of the param declaration
context and the reference context, and just change the start search
inside the loop, instead of doing two loops.


git-svn-id: https://svn.apache.org/repos/asf/xalan/java/trunk@334063 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/org/apache/xalan/transformer/TransformerImpl.java b/src/org/apache/xalan/transformer/TransformerImpl.java
index 7642c54..98efcc3 100644
--- a/src/org/apache/xalan/transformer/TransformerImpl.java
+++ b/src/org/apache/xalan/transformer/TransformerImpl.java
@@ -220,12 +220,12 @@
    */
   private ContentHandler m_outputContentHandler = null;
 
-  /**
-   * Use member variable to store param variables as they're
-   * being created, use member variable so we don't
-   * have to create a new vector every time.
-   */
-  private Vector m_newVars = new Vector();
+//  /*
+//   * Use member variable to store param variables as they're
+//   * being created, use member variable so we don't
+//   * have to create a new vector every time.
+//   */
+//  private Vector m_newVars = new Vector();
 
   /** The JAXP Document Builder, mainly to create Result Tree Fragments. */
   DocumentBuilder m_docBuilder = null;
@@ -1416,9 +1416,14 @@
     // of the current stack frame.
     VariableStack vars = xctxt.getVarStack();
     int n = xslCallTemplateElement.getParamElemCount();
+    
+    int paramDeclareContext = vars.getSearchStartOrTop();
+    vars.pushContextMarker();
+    int paramReferenceContext = -1;
 
     for (int i = 0; i < n; i++)
     {
+      vars.setSearchStart(paramDeclareContext);
       ElemWithParam xslParamElement = xslCallTemplateElement.getParamElem(i);
 
       // Get the argument value as either an expression or 
@@ -1444,23 +1449,23 @@
         var = new XRTreeFrag(df);
       }
 
-      m_newVars.addElement(new Arg(xslParamElement.getName(), var, true));
+      vars.setSearchStart(paramReferenceContext);
+      vars.pushVariableArg(new Arg(xslParamElement.getName(), var, true));
+//      m_newVars.addElement(new Arg(xslParamElement.getName(), var, true));
     }
 
-    vars.pushContextMarker();
-
-    int nNew = m_newVars.size();
-
-    if (nNew > 0)
-    {
-      for (int i = 0; i < nNew; i++)
-      {
-        vars.push((Arg) m_newVars.elementAt(i));
-      }
-
-      // Dragons check: make sure this is nulling the refs.
-      m_newVars.removeAllElements();
-    }
+//    int nNew = m_newVars.size();
+//
+//    if (nNew > 0)
+//    {
+//      for (int i = 0; i < nNew; i++)
+//      {
+//        vars.pushVariableArg((Arg) m_newVars.elementAt(i));
+//      }
+//
+//      // Dragons check: make sure this is nulling the refs.
+//      m_newVars.removeAllElements();
+//    }
   }  // end pushParams method
 
   /**
@@ -1600,7 +1605,8 @@
     
     // If this is an Stree instance, handle it with SourceTreeHandler
     // and bypass the whole DOM process.
-    if (sourceNode instanceof org.apache.xalan.stree.Child)
+    boolean isSTree = (sourceNode instanceof org.apache.xalan.stree.Child);
+    if (isSTree)
     {      
       rtfHandler = new SourceTreeHandler(this);
       ((SourceTreeHandler)rtfHandler).setUseMultiThreading(false);
@@ -1644,14 +1650,19 @@
 
     // And make a new handler for the RTF.
     this.m_resultTreeHandler = new ResultTreeHandler(this, rtfHandler);
-
-    // Do the transformation of the child elements.
-    executeChildTemplates(templateParent, sourceNode, mode);
+    
 
     try
     {
+      m_resultTreeHandler.startDocument();
+  
+      // Do the transformation of the child elements.
+      executeChildTemplates(templateParent, sourceNode, mode);
+      
       // Make sure everything is flushed!
       this.m_resultTreeHandler.flushPending();
+      
+      m_resultTreeHandler.endDocument();
     }
     catch(org.xml.sax.SAXException se)
     {