Bug #8722

Refinements remain active beyond the end of an evaled string

Added by Charlie Somerville 9 months ago. Updated 8 months ago.

[ruby-core:56329]
Status:Closed
Priority:Normal
Assignee:Shugo Maeda
Category:-
Target version:-
ruby -v:ruby 2.1.0dev (2013-08-02 trunk 42320) [x86_64-darwin12.4.0] Backport:1.9.3: UNKNOWN, 2.0.0: UNKNOWN

Description

=begin

The RefinementsSpec states:

"When main.using is invoked in a string given as the first argument of Kernel#eval, Kernel#instanceeval, or Module#moduleeval, the end of the scope is the end of the string."

However, in this example script, String#upcase remains refined even after the call to eval() has finished:

module M
refine String do
def upcase
reverse
end
end
end

puts "hello world".upcase
puts eval(%{using M; "hello world".upcase})
puts "hello world".upcase

I would expect the output of this script to be:

HELLO WORLD
dlrow olleh
HELLO WORLD

Instead it is:

HELLO WORLD
dlrow olleh
dlrow olleh

=end

Associated revisions

Revision 42396
Added by Shugo Maeda 9 months ago

  • vmeval.c (evalstringwithcref): copy cref to limit the scope of
    refienements in the eval string. [Bug #8722]

  • test/ruby/test_refinement.rb: related test.

Revision 42437
Added by Shugo Maeda 8 months ago

  • NEWS: add description of incompatibility introduced by r42396. [Bug #8722]

History

#1 Updated by Shugo Maeda 9 months ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r42396.
Charlie, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • vmeval.c (evalstringwithcref): copy cref to limit the scope of
    refienements in the eval string. [Bug #8722]

  • test/ruby/test_refinement.rb: related test.

#2 Updated by Yui NARUSE 8 months ago

  • Status changed from Closed to Assigned

m = Module.new {
eval "module_function"

def test1() end
}
r = m.respond_to?(:test1)
の r が r42396 以降 true から false に変わっています

#3 Updated by Shugo Maeda 8 months ago

  • Status changed from Assigned to Feedback

naruse (Yui NARUSE) wrote:

m = Module.new {
eval "module_function"

def test1() end
}
r = m.respond_to?(:test1)
の r が r42396 以降 true から false に変わっています

うーん、これ対応すべきでしょうか?
module_functionはスコープに作用するものなのでeval内で使用した場合の挙動は自明ではないと思います。

実際のアプリケーションでどんなケースで困るでしょうか?

#4 Updated by Yukihiro Matsumoto 8 months ago

仕様変更としてNEWSファイルに書けば良いことだと思います。

Matz.

#5 Updated by Yui NARUSE 8 months ago

  • Status changed from Feedback to Assigned

matz (Yukihiro Matsumoto) wrote:

仕様変更としてNEWSファイルに書けば良いことだと思います。

Matz.

はい。「変えた」ということにし、NEWSに書いてあれば異議はありません。

#6 Updated by Shugo Maeda 8 months ago

naruse (Yui NARUSE) wrote:

仕様変更としてNEWSファイルに書けば良いことだと思います。

Matz.

はい。「変えた」ということにし、NEWSに書いてあれば異議はありません。

ではそのように対応します。

ちなみにjruby 1.6.7で試したら今のtrunkの挙動と同じでした。

private/public/protectedなども同様ですね。

c = Class.new {
eval "private"
def foo
end
}
c.new.foo

他に何か同じような機能ってありましたっけ?

#7 Updated by Shugo Maeda 8 months ago

  • Status changed from Assigned to Closed

This issue was solved with changeset r42437.
Charlie, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • NEWS: add description of incompatibility introduced by r42396. [Bug #8722]

#8 Updated by Yui NARUSE 8 months ago

shugo (Shugo Maeda) wrote:

naruse (Yui NARUSE) wrote:

仕様変更としてNEWSファイルに書けば良いことだと思います。

Matz.

はい。「変えた」ということにし、NEWSに書いてあれば異議はありません。

ではそのように対応します。

ちなみにjruby 1.6.7で試したら今のtrunkの挙動と同じでした。

private/public/protectedなども同様ですね。

c = Class.new {
eval "private"
def foo
end
}
c.new.foo

他に何か同じような機能ってありましたっけ?

少なくとも rubyspec ではひっかかりませんでした。

#9 Updated by Yui NARUSE 8 months ago

test for ruby-dev's mail-count/post_id

#10 Updated by Shugo Maeda 8 months ago

naruse (Yui NARUSE) wrote:

private/public/protectedなども同様ですね。
(snip)
他に何か同じような機能ってありましたっけ?

少なくとも rubyspec ではひっかかりませんでした。

ご確認ありがとうございました。
何か他に指摘があれば説明を追加するようにします。

Also available in: Atom PDF