https://redmine.ruby-lang.org/https://redmine.ruby-lang.org/favicon.ico?17113305112014-12-08T02:00:36ZRuby Issue Tracking SystemRuby master - Bug #10466: rb_eval_string_wrap does not actually wrap in a module bindinghttps://redmine.ruby-lang.org/issues/10466?journal_id=503312014-12-08T02:00:36Zretro (Josef Šimánek)
<ul></ul><p>You can reproduce this without C code also.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="no">Module</span><span class="p">.</span><span class="nf">new</span> <span class="p">{</span><span class="no">X</span> <span class="o">=</span> <span class="mi">5</span><span class="p">}</span> <span class="c1">#=> #<Module:0x000000012186c0> </span>
<span class="no">Module</span><span class="p">.</span><span class="nf">new</span> <span class="p">{</span><span class="no">X</span> <span class="o">=</span> <span class="mi">5</span><span class="p">}</span> <span class="c1">#=> #<Module:0x00000001209da0> </span>
<span class="p">(</span><span class="n">irb</span><span class="p">):</span><span class="mi">2</span><span class="p">:</span> <span class="ss">warning: </span><span class="n">already</span> <span class="n">initialized</span> <span class="n">constant</span> <span class="no">X</span>
<span class="p">(</span><span class="n">irb</span><span class="p">):</span><span class="mi">1</span><span class="p">:</span> <span class="ss">warning: </span><span class="n">previous</span> <span class="n">definition</span> <span class="n">of</span> <span class="no">X</span> <span class="n">was</span> <span class="n">here</span>
</code></pre>
<p>And since <code>rb_eval_string_wrap</code> is really wrapping code into module, this works without warning:</p>
<pre><code class="c syntaxhl" data-language="c"><span class="cp">#include</span> <span class="cpf"><ruby.h></span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span>
<span class="p">{</span>
<span class="n">ruby_init</span><span class="p">();</span>
<span class="kt">int</span> <span class="n">state</span><span class="p">;</span>
<span class="n">rb_eval_string_wrap</span><span class="p">(</span><span class="s">"self::Y = 'wrap'"</span><span class="p">,</span> <span class="o">&</span><span class="n">state</span><span class="p">);</span>
<span class="n">rb_eval_string_wrap</span><span class="p">(</span><span class="s">"self::Y = 'wrap'"</span><span class="p">,</span> <span class="o">&</span><span class="n">state</span><span class="p">);</span>
<span class="k">return</span> <span class="n">ruby_cleanup</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="p">}</span>
</code></pre> Ruby master - Bug #10466: rb_eval_string_wrap does not actually wrap in a module bindinghttps://redmine.ruby-lang.org/issues/10466?journal_id=798402019-07-23T03:12:45Zjeremyevans0 (Jeremy Evans)merch-redmine@jeremyevans.net
<ul><li><strong>File</strong> <a href="/attachments/7910">rb_eval_string_wrap_cref.patch</a> <a class="icon-only icon-download" title="Download" href="/attachments/download/7910/rb_eval_string_wrap_cref.patch">rb_eval_string_wrap_cref.patch</a> added</li></ul><p>I agree this a bug. The documentation states for <code>rb_eval_string_wrap</code> that <code>This is same as the binding for loaded libraries on "load('foo', true)"</code>, but that doesn't appear to be the case. <code>load('foo', true)</code> evaluates with an anonymous module in <code>Module.nesting</code>, but <code>rb_eval_string_wrap</code> uses an empty <code>Module.nesting</code>.</p>
<p>The attached patch should fix the issue by setting a cref, so that <code>rb_eval_string_wrap</code> evaluates the string with an anonymous module in <code>Module.nesting</code>. I'm not sure if this is the best way to fix it, and would appreciate if another committer could review this patch. Unfortunately, there are no tests for the <code>rb_eval_string_wrap</code> function and nothing internally seems to use this method.</p> Ruby master - Bug #10466: rb_eval_string_wrap does not actually wrap in a module bindinghttps://redmine.ruby-lang.org/issues/10466?journal_id=802602019-07-30T07:54:13Zko1 (Koichi Sasada)
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Assigned</i></li><li><strong>Assignee</strong> set to <i>ko1 (Koichi Sasada)</i></li></ul> Ruby master - Bug #10466: rb_eval_string_wrap does not actually wrap in a module bindinghttps://redmine.ruby-lang.org/issues/10466?journal_id=829762019-12-05T01:05:03Zjeremyevans (Jeremy Evans)code@jeremyevans.net
<ul><li><strong>Status</strong> changed from <i>Assigned</i> to <i>Closed</i></li></ul><p>Applied in changeset <a class="changeset" title="Make rb_eval_string_wrap specify a cref so constant setting works correctly Fixes [Bug #10466]" href="https://redmine.ruby-lang.org/projects/ruby-master/repository/git/revisions/e4db0443bcfc94f9183e8ea72fb4ab560aa005bf">git|e4db0443bcfc94f9183e8ea72fb4ab560aa005bf</a>.</p>
<hr>
<p>Make rb_eval_string_wrap specify a cref so constant setting works correctly</p>
<p>Fixes [Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: rb_eval_string_wrap does not actually wrap in a module binding (Closed)" href="https://redmine.ruby-lang.org/issues/10466">#10466</a>]</p>