http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2468 *** shadow/2468 Thu Jul 5 16:58:52 2001 --- shadow/2468.tmp.8777 Thu Jul 5 16:58:52 2001 *************** *** 0 **** --- 1,121 ---- + +============================================================================+ + | AbsoluteIterator.setStartNode(int) not sufficient to initialize a NodeIter | + +----------------------------------------------------------------------------+ + | Bug #: 2468 Product: XalanJ2 | + | Status: NEW Version: CurrentCVS | + | Resolution: Platform: PC | + | Severity: Major OS/Version: Windows NT/2K | + | Priority: Other Component: org.apache.xalan.xsltc | + +----------------------------------------------------------------------------+ + | Assigned To: [EMAIL PROTECTED] | + | Reported By: [EMAIL PROTECTED] | + | CC list: Cc: | + +----------------------------------------------------------------------------+ + | URL: | + +============================================================================+ + | DESCRIPTION | + [Investigation of this bug was accomplished by decompiling the translet using + jode-1.1, applying appropriate source-level fixups and finally recompilation + and execution of the translet from the new source. This description references + annotated lines of code in a snippet of the translet's java source (see + attached for complete source).] + + In most cases of compiler generated stylesheets, AbsoluteIterator.setStartNode + (int) is followed by a call to cloneIterator() prior to use by the runtime. + This bug describes a case when an iterator for an xpath is passed as an + argument to a template function and then used, without any intervening call to + cloneIterator(). It has been discovered that when a call to cloneIterator() was + made directly after the construction of AbsoluteIterator, the stylesheet worked + as expected. + + When the enclosed changes are made to mk031.xsl and the translet is compiled, + the xpath that is specified as a calling parameter is initialized improperly - + resulting in no output. Examining the decompiled translet leads to a <line-of- + suspicion> that may be in error (the nodeiterator initialization). See attached + source, or code snippet below. + + The translet can be made to work by changing the <line-of-suspicion> as follows + (with subsequent recompilation): + - ).setStartNode( i ) // *** <line-of-suspicion> *** + + ).setStartNode( i ).cloneIterator() // *** <line-of-suspicion> *** + + What is curious about this bug is that it seems related to the presence of an + enclosing for-each. This led me down the original train of thought that perhaps + the <line-of-suspicion> was being initialized using the state variable i from + the wrong scope (i is reassigned by <line-of-curiosity>) and that the following + would make things work: + - ).setStartNode( i ) // *** <line-of-suspicion> *** + + ).setStartNode( i_5_ ) // *** <line-of-suspicion> *** + + Since i_5_ is a saved copy of i from the scope before <line-of-curiosity>. Alas + no. + + No tests that cover this case were found in my search of the test suite. + mk031.xsl comes close in that it is the only test that specifies an xpath in + the "select" of a template parameter. To reproduce the bug, mk031.xsl can be + modified as follows: + + XSL diffs + --------- + + --- mk031.xsl 2001/06/20 18:54:41 1.1 + +++ mk031.xsl 2001/07/05 23:11:49 + @@ -19,9 +19,11 @@ + + <xsl:template match="/"> + <xsl:variable name="list"> + + <xsl:for-each select="/programme/composer/fullname"> + <xsl:call-template name="make-list"> + <xsl:with-param name="names" + select="/programme/composer/fullname"/> + </xsl:call-template> + + </xsl:for-each> + </xsl:variable> + This week's composers are: + <xsl:value-of select="translate($list, ',', ';')"/> + + JAVA (snippet of decompiled translet, reformatted and annotated) + ---------------------------------------------------------------- + + ... + int i_5_ = i; + NodeIterator nodeiterator_6_ = nodeiterator; + nodeiterator = + new AbsoluteIterator( + new StepIterator( + new StepIterator( + domadapter.getTypedAxisIterator(3, 7), + domadapter.getTypedAxisIterator(3, 8) + ), + domadapter.getTypedAxisIterator(3, 9) + ) + ).setStartNode(i); + while ((i = nodeiterator.next()) != 0) { // *** <line-of-curiosity> *** + this.pushParamFrame(); + this.addParameter( + "names", + new AbsoluteIterator( + new StepIterator( + new StepIterator( + domadapter.getTypedAxisIterator(3, 7), + domadapter.getTypedAxisIterator(3, 8) + ), + domadapter.getTypedAxisIterator(3, 9) + ) + ).setStartNode(i) // *** <line-of-suspicion> *** + ); + make_list(domadapter, nodeiterator, transletoutputhandler, i); + ... + + OUTPUT + ------ + + This week's composers are: + + EXPECTED + -------- + + This week's composers are: + Wolfgang Amadeus Mozart; Guiseppe Verdi; and Giacomo PucciniWolfgang + Amadeus Mozart; Guiseppe Verdi; and Giacomo PucciniWolfgang Amadeus Mozart; + Guiseppe Verdi; and Giacomo Puccini
