PLEASE DO NOT REPLY TO THIS MESSAGE. TO FURTHER COMMENT ON THE STATUS OF THIS BUG PLEASE FOLLOW THE LINK BELOW AND USE THE ON-LINE APPLICATION. REPLYING TO THIS MESSAGE DOES NOT UPDATE THE DATABASE, AND SO YOUR COMMENT WILL BE LOST SOMEWHERE. http://nagoya.apache.org/bugzilla/show_bug.cgi?id=3424 *** shadow/3424 Tue Sep 4 15:35:16 2001 --- shadow/3424.tmp.29625 Tue Sep 4 15:35:16 2001 *************** *** 0 **** --- 1,281 ---- + +============================================================================+ + | Memory Retention problem (diagnosis and patch) | + +----------------------------------------------------------------------------+ + | Bug #: 3424 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 | + It can be noticed that highly recursive stylesheets exhibit memory retention + problems that verge on the asymtotic. Much of this problem appears to be caused + by use of the Vector class insertElementAt(...) api (for runtime parameters and + stack variables) without the proper deletion of the inserted objects. Without + deletion there are also Vector induced performance penalities. + + XSL + --- + + <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> + <xsl:output method="text" /> + + <!-- FileName: log10.xsl --> + <!-- Author: Darryl Fuller, SchemaSoft --> + <!-- Purpose: Torture test, compute log10 recursivly for the a bunch of + numbers --> + + + <xsl:template match="/"> + <xsl:for-each select="./*/*/*/*"> + <xsl:variable name="val" select="position()"/> + <xsl:variable name="logval"> + <xsl:call-template name="log10"> + <xsl:with-param name="x" select="$val"/> + </xsl:call-template> + </xsl:variable> + Value: <xsl:value-of select="$val"/> Log10: <xsl:value-of select="$logval"/> + </xsl:for-each> + </xsl:template> + + <xsl:template name="ln" > + <xsl:param name="x"/> + <xsl:variable name="e">2.71828182845904</xsl:variable> + <xsl:choose> + <xsl:when test="$x = 0">0</xsl:when> + <!-- technically, a negative number should be NaN, but + we will + instead pretend we're just scaling a negative number + with the ln function --> + <xsl:when test="$x < 0"> + <xsl:variable name="scaled_answer"> + <xsl:call-template name="ln"> + <xsl:with-param name="x" + select="$x * -1"/> + </xsl:call-template> + </xsl:variable> + <xsl:value-of select="$scaled_answer * -1"/> + </xsl:when> + <!-- A table of some common values --> + <xsl:when test="$x = 10">2.3025850929940</xsl:when> + <xsl:when test="$x = 20">2.9957322735539</xsl:when> + <xsl:when test="$x = 30">3.4011973816621</xsl:when> + <xsl:when test="$x = 40">3.6888794541139</xsl:when> + <xsl:when test="$x = 50">3.9120230054281</xsl:when> + <xsl:when test="$x = 60">4.0943445622221</xsl:when> + <xsl:when test="$x = 70">4.2484952420493</xsl:when> + <xsl:when test="$x = 80">4.3820266346738</xsl:when> + <xsl:when test="$x = 90">4.4998096703302</xsl:when> + <xsl:when test="$x = 100">4.6051701859881</xsl:when> + <xsl:when test="$x = 200">5.2983173665480</xsl:when> + <xsl:when test="$x = 300">5.7037824746562</xsl:when> + <xsl:when test="$x = 400">5.9914645471079</xsl:when> + <xsl:when test="$x = 500">6.2146080984222</xsl:when> + <xsl:when test="$x = 600">6.3969296552161</xsl:when> + <xsl:when test="$x = 700">6.5510803350434</xsl:when> + <xsl:when test="$x = 800">6.6846117276679</xsl:when> + <xsl:when test="$x = 900">6.8023947633243</xsl:when> + <xsl:when test="$x = 1000">6.90775527898213</xsl:when> + <!-- scale the answer --> + <xsl:when test="$x > 20"> + <xsl:variable name="scaled_answer"> + <xsl:call-template name="ln"> + <xsl:with-param name="x" + select="$x div $e"/> + </xsl:call-template> + </xsl:variable> + <xsl:value-of select="$scaled_answer + 1"/> + </xsl:when> + <!-- scale the answer --> + <xsl:when test="$x < 0.005"> + <xsl:variable name="scaled_answer"> + <xsl:call-template name="ln"> + <xsl:with-param name="x" + select="$x * $e"/> + </xsl:call-template> + </xsl:variable> + <xsl:value-of select="$scaled_answer - 1"/> + </xsl:when> + <!-- The straight goods --> + <xsl:otherwise> + <xsl:variable name="z"> + <xsl:call-template name="z_value"> + <xsl:with-param name="x" + select="$x"/> + </xsl:call-template> + </xsl:variable> + <xsl:variable name="interim_answer"> + <xsl:call-template name="ln_recurse"> + <xsl:with-param name="z" + select="$z"/> + <xsl:with-param name="current" + select="0"/> + <xsl:with-param name="term" + select="1"/> + </xsl:call-template> + </xsl:variable> + <xsl:value-of select="$interim_answer * 2"/> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + <xsl:template name="z_value"> + <xsl:param name="x"/> + <xsl:value-of select="($x - 1) div ($x + 1)"/> + </xsl:template> + <xsl:template name="ln_recurse"> + <xsl:param name="z"/> + <xsl:param name="current"/> + <xsl:param name="term"/> + <xsl:variable name="term_value"> + <xsl:call-template name="ln_term"> + <xsl:with-param name="z" select="$z"/> + <xsl:with-param name="n" select="$term"/> + </xsl:call-template> + </xsl:variable> + <xsl:variable name="val" select="$current + $term_value"/> + <xsl:choose> + <xsl:when test="$val = $current"> + <xsl:value-of select="$current"/> + </xsl:when> + <!-- Limiting the number of terms we calculate to is a + trade + off of accuracy v.s. speed. I'm currently sacrificing + accuracy for a bit o' speed to make this less painfully + slow --> + <xsl:when test="$term > 100"> + <xsl:value-of select="$current"/> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="ln_recurse"> + <xsl:with-param name="z" select="$z"/> + <xsl:with-param name="current" + select="$val"/> + <xsl:with-param name="term" + select="$term + 2"/> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + <xsl:template name="ln_term"> + <xsl:param name="z"/> + <xsl:param name="n"/> + <xsl:variable name="numerator"> + <xsl:call-template name="pow_function"> + <xsl:with-param name="number" select="$z"/> + <xsl:with-param name="power" select="$n"/> + </xsl:call-template> + </xsl:variable> + <xsl:value-of select="$numerator div $n"/> + </xsl:template> + <xsl:template name="pow_function" ><!-- Power function. + Calculates number ^ power where power is an + integer. --> + <xsl:param name="number"/> + <xsl:param name="power"/> + + <xsl:variable name="int_power" select="round( $power )"/> + <xsl:variable name="rest"> + <xsl:choose> + <xsl:when test="$int_power > 0"> + <xsl:call-template name="pow_function"> + <xsl:with-param name="number" + select="$number"/> + <xsl:with-param name="power" + select="$int_power - 1"/> + </xsl:call-template> + </xsl:when> + <xsl:when test="$int_power < 0"> + <xsl:call-template name="pow_function"> + <xsl:with-param name="number" + select="$number"/> + <xsl:with-param name="power" + select="$int_power + 1"/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise>1</xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:variable name="result"> + <xsl:choose> + <xsl:when test="$int_power > 0"> + <xsl:value-of select="$rest * $number"/> + </xsl:when> + <xsl:when test="$int_power < 0"> + <xsl:value-of select="$rest div + $number"/> + </xsl:when> + <xsl:otherwise> + 1 + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:value-of select="$result"/> + </xsl:template> + <xsl:template name="log10"><!-- Log (base 10). --> + <xsl:param name="x"/> + <xsl:variable name="numerator"> + <xsl:call-template name="ln"> + <xsl:with-param name="x" select="$x"/> + </xsl:call-template> + </xsl:variable> + <!-- ln(10) --> + <xsl:variable name="denominator" + select="2.302585092994045684"/> + <xsl:value-of select="$numerator div $denominator"/> + </xsl:template> + + + </xsl:stylesheet> + + XML + --- + + + <bugTotals> + + <byState> + <open> + <total date="may 1" value="3"/> + <total date="may 2" value="13"/> + <total date="may 3" value="12"/> + <total date="may 4" value="22"/> + <total date="may 5" value="5"/> + <total date="may 6" value="8"/> + <total date="may 7" value="2"/> + <total date="may 8" value="4"/> + <total date="may 9" value="1"/> + </open> + + <testing> + <total date="may 1" value="0"/> + <total date="may 2" value="3"/> + <total date="may 3" value="10"/> + <total date="may 4" value="2"/> + <total date="may 5" value="15"/> + <total date="may 6" value="4"/> + <total date="may 7" value="8"/> + <total date="may 8" value="2"/> + <total date="may 9" value="0"/> + </testing> + + <closed> + <total date="may 1" value="0"/> + <total date="may 2" value="3"/> + <total date="may 3" value="4"/> + <total date="may 4" value="7"/> + <total date="may 5" value="15"/> + <total date="may 6" value="22"/> + <total date="may 7" value="22"/> + <total date="may 8" value="24"/> + <total date="may 9" value="28"/> + </closed> + + </byState> + + </bugTotals>
