https://saxonica.plan.io/https://saxonica.plan.io/favicon.ico2022-05-23T15:30:37ZSaxonica Developer CommunitySaxonC - Bug #5533: segfault when setting xslt parameter in a loophttps://saxonica.plan.io/issues/5533?journal_id=208312022-05-23T15:30:37ZO'Neil Delprattoneil@saxonica.com
<ul><li><strong>Category</strong> set to <i>Python</i></li><li><strong>Assignee</strong> set to <i>O'Neil Delpratt</i></li><li><strong>Priority</strong> changed from <i>Low</i> to <i>Normal</i></li><li><strong>Found in version</strong> set to <i>11.3</i></li></ul><p>This looks like a bug. Thanks for reporting it.</p>
<p>For the <code>make_string_value</code> it looks like python is deleting the object created at the end of the loop thinking that the object is not used again.</p>
<p>As a workaround, for the following code:</p>
<pre><code class="python syntaxhl" data-language="python"> <span class="n">xsltproc</span><span class="p">.</span><span class="n">set_parameter</span><span class="p">(</span><span class="s">"corpus"</span><span class="p">,</span><span class="n">proc</span><span class="p">.</span><span class="n">make_string_value</span><span class="p">(</span><span class="n">LANG</span><span class="p">))</span>
<span class="n">xsltproc</span><span class="p">.</span><span class="n">set_parameter</span><span class="p">(</span><span class="s">"lastUpdate"</span><span class="p">,</span><span class="n">proc</span><span class="p">.</span><span class="n">make_string_value</span><span class="p">(</span><span class="n">lastUpdate</span><span class="p">))</span>
</code></pre>
<p>Is it possible to replace it as follows:</p>
<pre><code class="python syntaxhl" data-language="python"> <span class="n">XDM_LANG</span><span class="o">=</span> <span class="n">proc</span><span class="p">.</span><span class="n">make_string_value</span><span class="p">(</span><span class="n">LANG</span><span class="p">)</span>
<span class="n">xdm_lastUpdate</span> <span class="o">=</span> <span class="n">proc</span><span class="p">.</span><span class="n">make_string_value</span><span class="p">(</span><span class="n">lastUpdate</span><span class="p">)</span>
<span class="n">xsltproc</span><span class="p">.</span><span class="n">set_parameter</span><span class="p">(</span><span class="s">"corpus"</span><span class="p">,</span> <span class="n">XDM_LANG</span><span class="p">)</span>
<span class="n">xsltproc</span><span class="p">.</span><span class="n">set_parameter</span><span class="p">(</span><span class="s">"lastUpdate"</span><span class="p">,</span><span class="n">xdm_lastUpdate</span><span class="p">)</span>
</code></pre>
<p>I will try to create a repo, but is it possible you can supply the stylesheet please so that I can investigate it further?</p> SaxonC - Bug #5533: segfault when setting xslt parameter in a loophttps://saxonica.plan.io/issues/5533?journal_id=208332022-05-23T15:56:17ZLou Burnard
<ul><li><strong>File</strong> <a href="/attachments/56682">summarize2.py</a> <a class="icon-only icon-download" title="Download" href="/attachments/download/56682/summarize2.py">summarize2.py</a> added</li><li><strong>File</strong> <a href="/attachments/56683">summarize.xsl</a> <a class="icon-only icon-download" title="Download" href="/attachments/download/56683/summarize.xsl">summarize.xsl</a> added</li></ul><p>Excellent! That work around seems to have been successful. Many thanks for the quick turnround, and good luck hunting down the bug. I am attaching my current version of the python code and the style sheet it invokes, since you asked for it, though they won't make much sense without all the other bits and pieces.</p> SaxonC - Bug #5533: segfault when setting xslt parameter in a loophttps://saxonica.plan.io/issues/5533?journal_id=208352022-05-23T17:43:08ZO'Neil Delprattoneil@saxonica.com
<ul></ul><p>Alternatively, you can call <code>clear_parameters</code> on the PyXslt30Processor at the end of the for loop. This is the recommended practice.</p>
<p>See the example below:</p>
<pre><code class="python syntaxhl" data-language="python"> <span class="k">for</span> <span class="n">LANG</span> <span class="ow">in</span> <span class="n">LANGS</span><span class="p">:</span>
<span class="n">repoName</span><span class="o">=</span><span class="n">repoRoot</span><span class="o">+</span><span class="n">LANG</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Summarizing repo "</span><span class="o">+</span><span class="n">repoName</span><span class="o">+</span> <span class="s">" on "</span><span class="o">+</span><span class="n">lastUpdate</span><span class="p">)</span>
<span class="n">params</span><span class="o">=</span><span class="s">' corpus='</span><span class="o">+</span><span class="n">LANG</span> <span class="o">+</span> <span class="s">' lastUpdate='</span><span class="o">+</span> <span class="n">lastUpdate</span>
<span class="n">xsltproc</span><span class="p">.</span><span class="n">set_parameter</span><span class="p">(</span><span class="s">"corpus"</span><span class="p">,</span><span class="n">proc</span><span class="p">.</span><span class="n">make_string_value</span><span class="p">(</span><span class="n">LANG</span><span class="p">))</span>
<span class="n">xsltproc</span><span class="p">.</span><span class="n">set_parameter</span><span class="p">(</span><span class="s">"lastUpdate"</span><span class="p">,</span><span class="n">proc</span><span class="p">.</span><span class="n">make_string_value</span><span class="p">(</span><span class="n">lastUpdate</span><span class="p">))</span>
<span class="n">src</span><span class="o">=</span><span class="n">repoName</span> <span class="o">+</span> <span class="s">"/driver.tei"</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">xsltproc</span><span class="p">.</span><span class="n">transform_to_string</span><span class="p">(</span><span class="n">source_file</span><span class="o">=</span><span class="n">src</span><span class="p">,</span> <span class="n">stylesheet_file</span><span class="o">=</span><span class="n">scriptRoot</span><span class="o">+</span><span class="s">"summarize.xsl"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="n">xsltproc</span><span class="p">.</span><span class="n">clear_parameter</span><span class="p">()</span>
</code></pre> SaxonC - Bug #5533: segfault when setting xslt parameter in a loophttps://saxonica.plan.io/issues/5533?journal_id=208542022-05-26T06:29:16ZO'Neil Delprattoneil@saxonica.com
<ul><li><strong>Related to</strong> <i><a class="issue tracker-1 status-3 priority-2 priority-default closed" href="/issues/4386">Bug #4386</a>: setProperty and setParameter does not replace keys already in the map</i> added</li></ul> SaxonC - Bug #5533: segfault when setting xslt parameter in a loophttps://saxonica.plan.io/issues/5533?journal_id=208562022-05-26T06:40:26ZO'Neil Delprattoneil@saxonica.com
<ul><li><strong>Status</strong> changed from <i>New</i> to <i>Resolved</i></li><li><strong>% Done</strong> changed from <i>0</i> to <i>100</i></li></ul><p>Bug fixed in the <code>Xslt30Processor</code> and across other Processors too. There is a regression from bug issue <a class="issue tracker-1 status-3 priority-2 priority-default closed" title="Bug: setProperty and setParameter does not replace keys already in the map (Closed)" href="https://saxonica.plan.io/issues/4386">#4386</a>. The check for existing keys in the map failed. This has now been patched and available for the next maintenance release.</p>
<p>The workaround in comment #3 avoids the crash. Also as a speed improvement, I recommend compiling the stylesheet to a <code>PyXsltExecutable</code> object before the for loop, which can then be reused. See below:</p>
<pre><code class="python syntaxhl" data-language="python"> <span class="n">executable</span> <span class="o">=</span> <span class="n">xsltproc</span><span class="p">.</span><span class="n">compile_stylesheet</span><span class="p">(</span><span class="n">stylesheet_file</span><span class="o">=</span><span class="n">scriptRoot</span><span class="o">+</span><span class="s">"summarize.xsl"</span><span class="p">)</span>
<span class="k">for</span> <span class="n">LANG</span> <span class="ow">in</span> <span class="n">LANGS</span><span class="p">:</span>
<span class="n">repoName</span><span class="o">=</span><span class="n">repoRoot</span><span class="o">+</span><span class="n">LANG</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Summarizing repo "</span><span class="o">+</span><span class="n">repoName</span><span class="o">+</span> <span class="s">" on "</span><span class="o">+</span><span class="n">lastUpdate</span><span class="p">)</span>
<span class="n">params</span><span class="o">=</span><span class="s">' corpus='</span><span class="o">+</span><span class="n">LANG</span> <span class="o">+</span> <span class="s">' lastUpdate='</span><span class="o">+</span> <span class="n">lastUpdate</span>
<span class="n">executable</span><span class="p">.</span><span class="n">set_parameter</span><span class="p">(</span><span class="s">"corpus"</span><span class="p">,</span><span class="n">proc</span><span class="p">.</span><span class="n">make_string_value</span><span class="p">(</span><span class="n">LANG</span><span class="p">))</span>
<span class="n">executable</span><span class="p">.</span><span class="n">set_parameter</span><span class="p">(</span><span class="s">"lastUpdate"</span><span class="p">,</span><span class="n">proc</span><span class="p">.</span><span class="n">make_string_value</span><span class="p">(</span><span class="n">lastUpdate</span><span class="p">))</span>
<span class="n">src</span><span class="o">=</span><span class="n">repoName</span> <span class="o">+</span> <span class="s">"/driver.tei"</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">executable</span><span class="p">.</span><span class="n">transform_to_string</span><span class="p">(</span><span class="n">source_file</span><span class="o">=</span><span class="n">src</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
<span class="n">executable</span><span class="p">.</span><span class="n">clear_parameter</span><span class="p">()</span>
</code></pre> SaxonC - Bug #5533: segfault when setting xslt parameter in a loophttps://saxonica.plan.io/issues/5533?journal_id=208652022-05-26T22:02:05ZO'Neil Delprattoneil@saxonica.com
<ul><li><strong>Related to</strong> <i><a class="issue tracker-1 status-3 priority-2 priority-default closed" href="/issues/5542">Bug #5542</a>: Python example causes segmentation error</i> added</li></ul> SaxonC - Bug #5533: segfault when setting xslt parameter in a loophttps://saxonica.plan.io/issues/5533?journal_id=214922022-07-28T17:00:30ZO'Neil Delprattoneil@saxonica.com
<ul><li><strong>Status</strong> changed from <i>Resolved</i> to <i>Closed</i></li><li><strong>Fixed in version</strong> set to <i>11.4</i></li></ul><p>Bug fix applied in the SaxonC 11.4 maintenance release.</p>