[Ruby 1.9 - Bug #4536][Open] the differences between 1.8 and 1.9 in referencing constant variables

43365 Yukihiro Matsumoto <matz ruby-lang.org> (2011-03-29 17:41:13 +0900) [Ruby 1.9 - Bug #4536][Open] 定数参照について1.8と1.9の違い

Issue #4536 has been reported by Yukihiro Matsumoto.

----------------------------------------
Bug #4536: the differences between 1.8 and 1.9 in referencing constant variables
http://redmine.ruby-lang.org/issues/4536

Author: Yukihiro Matsumoto
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 
ruby -v: ruby 1.9.3dev (2011-03-29 trunk 31207) [i686-linux]


the program below is treated as error in 1.8,
but works without error in 1.9.
if we follow the policy that constant variable references should be treated as static scope, i think 1.8 is correct.

How do we correct this? Or do we leave it and decide that 1.9 is correct?

module A
  B = 42
end

A.class_eval do
  def self.f
    p B
  end
end

A.f



-- 
http://redmine.ruby-lang.org

Refine translation
Issue #4536 has been reported by Yukihiro Matsumoto.

---(click to toggle ticket description)---
Bug #4536: 定数参照について1.8と1.9の違い
http://redmine.ruby-lang.org/issues/4536

Author: Yukihiro Matsumoto
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 
ruby -v: ruby 1.9.3dev (2011-03-29 trunk 31207) [i686-linux]


以下のプログラムは1.8ではエラーになりますが、1.9ではエラーを
示さず動作します。定数参照は(できるだけ)静的スコープで、とい
う設計方針に従えば、1.8の方が正しいと思います。

どうやって直したら良いと思いますか? あるいは直さずに今後は
1.9的挙動が正としますか?

module A
  B = 42
end

A.class_eval do
  def self.f
    p B
  end
end

A.f



-- 
http://redmine.ruby-lang.org

43366 SASADA Koichi <ko1 atdot.net> (2011-03-29 17:55:46 +0900) Re: [ruby-dev:43365] [Ruby 1.9 - Bug #4536][Open] 定数参照について1.8と1.9の違い

I'm sasada.

(2011/03/29 17:41), Yukihiro Matsumoto wrote:
> the program below is treated as error in 1.8,
> but works without error in 1.9.
> if we follow the policy that constant variable references should be treated as static scope, i think 1.8 is correct.
> 
> How do we correct this? Or do we leave it and decide that 1.9 is correct?
> 
> module A
>   B = 42
> end
> 
> A.class_eval do
>   def self.f
>     p B
>   end
> end
> 
> A.f


module A; B = 42; end
A.class_eval{p B}
#=> `block in <main>': uninitialized constant Module::B (NameError)

this get an error, so it may be wrong that the code works fine.
let me think for some time.

# but, why Module::B?

-- 
// SASADA Koichi at atdot dot net
n
Refine translation
 ささだです.

(2011/03/29 17:41), Yukihiro Matsumoto wrote:
> 以下のプログラムは1.8ではエラーになりますが、1.9ではエラーを
> 示さず動作します。定数参照は(できるだけ)静的スコープで、とい
> う設計方針に従えば、1.8の方が正しいと思います。
> 
> どうやって直したら良いと思いますか? あるいは直さずに今後は
> 1.9的挙動が正としますか?
> 
> module A
>   B = 42
> end
> 
> A.class_eval do
>   def self.f
>     p B
>   end
> end
> 
> A.f


module A; B = 42; end
A.class_eval{p B}
#=> `block in <main>': uninitialized constant Module::B (NameError)

なので,それが動くのはまずいかもしれませんね.少し考えさせてください.

# しかし,なんで Module::B なんだ.

-- 
// SASADA Koichi at atdot dot net

43367 Shugo Maeda <shugo ruby-lang.org> (2011-03-29 18:37:47 +0900) Re: [Ruby 1.9 - Bug #4536][Open] 定数参照について1.8と1.9の違い

[Translation not available]
Add translation
前田です。

2011年3月29日17:55 SASADA Koichi <ko1 / atdot.net>:
> module A; B = 42; end
> A.class_eval{p B}
> #=> `block in <main>': uninitialized constant Module::B (NameError)
>
> なので,それが動くのはまずいかもしれませんね.少し考えさせてください.

以下のようにCOPY_CREFでフラグを伝搬させるとこの部分に関しては1.8と同じ動作になるようです。

diff --git a/vm_insnhelper.h b/vm_insnhelper.h
index 979c342..31ef216 100644
--- a/vm_insnhelper.h
+++ b/vm_insnhelper.h
@@ -154,6 +154,9 @@ extern VALUE ruby_vm_const_missing_count;
   (c1)->nd_clss = __tmp_c2->nd_clss; \
   (c1)->nd_visi = __tmp_c2->nd_visi;\
   (c1)->nd_next = __tmp_c2->nd_next; \
+  if (__tmp_c2->flags & NODE_FL_CREF_PUSHED_BY_EVAL) { \
+      (c1)->flags |= NODE_FL_CREF_PUSHED_BY_EVAL; \
+  } \
 } while (0)

 #define CALL_METHOD(num, blockptr, flag, id, me, recv) do { \

あんまりちゃんと考えてないので副作用があるかも。

> # しかし,なんで Module::B なんだ.

こっちはまだ見てませんが、何なんでしょうね…。

-- 
Shugo Maeda

43368 SASADA Koichi <ko1 atdot.net> (2011-03-29 19:20:31 +0900) Re: [Ruby 1.9 - Bug #4536][Open] 定数参照について1.8と1.9の違い

[Translation not available]
Add translation
 ささだです.

(2011/03/29 18:37), Shugo Maeda wrote:
> 以下のようにCOPY_CREFでフラグを伝搬させるとこの部分に関しては1.8と同じ動作になるようです。
> 
> diff --git a/vm_insnhelper.h b/vm_insnhelper.h
> index 979c342..31ef216 100644
> --- a/vm_insnhelper.h
> +++ b/vm_insnhelper.h
> @@ -154,6 +154,9 @@ extern VALUE ruby_vm_const_missing_count;
>    (c1)->nd_clss = __tmp_c2->nd_clss; \
>    (c1)->nd_visi = __tmp_c2->nd_visi;\
>    (c1)->nd_next = __tmp_c2->nd_next; \
> +  if (__tmp_c2->flags & NODE_FL_CREF_PUSHED_BY_EVAL) { \
> +      (c1)->flags |= NODE_FL_CREF_PUSHED_BY_EVAL; \
> +  } \
>  } while (0)
> 
>  #define CALL_METHOD(num, blockptr, flag, id, me, recv) do { \
> 
> あんまりちゃんと考えてないので副作用があるかも。

 おお,知らないところだ :) テストが通るのならいいんでないでしょうか.

-- 
// SASADA Koichi at atdot dot net

43370 Yukihiro Matsumoto <matz ruby-lang.org> (2011-03-30 08:28:53 +0900) Re: [Ruby 1.9 - Bug #4536][Open] 定数参照について1.8と1.9の違い

[Translation not available]
Add translation
まつもと ゆきひろです

テストでエラーが増えないようならコミットしていただけませんか?

In message "Re: [ruby-dev:43367] Re: [Ruby 1.9 - Bug #4536][Open] 	定数参照について1.8と1.9の違い"
    on Tue, 29 Mar 2011 18:37:47 +0900, Shugo Maeda <shugo / ruby-lang.org> writes:
|
|前田です。
|
|2011年3月29日17:55 SASADA Koichi <ko1 / atdot.net>:
|> module A; B = 42; end
|> A.class_eval{p B}
|> #=> `block in <main>': uninitialized constant Module::B (NameError)
|>
|> なので,それが動くのはまずいかもしれませんね.少し考えさせてください.
|
|以下のようにCOPY_CREFでフラグを伝搬させるとこの部分に関しては1.8と同じ動作になるようです。
|
|diff --git a/vm_insnhelper.h b/vm_insnhelper.h
|index 979c342..31ef216 100644
|--- a/vm_insnhelper.h
|+++ b/vm_insnhelper.h
|@@ -154,6 +154,9 @@ extern VALUE ruby_vm_const_missing_count;
|   (c1)->nd_clss = __tmp_c2->nd_clss; \
|   (c1)->nd_visi = __tmp_c2->nd_visi;\
|   (c1)->nd_next = __tmp_c2->nd_next; \
|+  if (__tmp_c2->flags & NODE_FL_CREF_PUSHED_BY_EVAL) { \
|+      (c1)->flags |= NODE_FL_CREF_PUSHED_BY_EVAL; \
|+  } \
| } while (0)
|
| #define CALL_METHOD(num, blockptr, flag, id, me, recv) do { \
|
|あんまりちゃんと考えてないので副作用があるかも。
|
|> # しかし,なんで Module::B なんだ.
|
|こっちはまだ見てませんが、何なんでしょうね…。
|
|-- 
|Shugo Maeda

43371 Shugo Maeda <shugo ruby-lang.org> (2011-03-30 14:40:40 +0900) Re: [Ruby 1.9 - Bug #4536][Open] 定数参照について1.8と1.9の違い

[Translation not available]
Add translation
前田です。

2011年3月30日8:28 Yukihiro Matsumoto <matz / ruby-lang.org>:
> テストでエラーが増えないようならコミットしていただけませんか?

test/ruby/test_defined.rbが失敗するようになりましたが、このバグに依存した
テストだったのでclass_evalを使わないように修正してcommitしました。

-- 
Shugo Maeda

43372 Shugo Maeda <shugo ruby-lang.org> (2011-03-31 16:59:06 +0900) Re: [Ruby 1.9 - Bug #4536][Open] 定数参照について1.8と1.9の違い

[Translation not available]
Add translation
前田です。

2011年3月29日18:37 Shugo Maeda <shugo / ruby-lang.org>:
>> # しかし,なんで Module::B なんだ.
>
> こっちはまだ見てませんが、何なんでしょうね…。

vm_get_ev_const()の中でroot_crefが正しく設定されないケースが
あったせいのようです。
修正したところ、test_eval.rbの以下のテストが失敗するようになりましたが、
テストの方を修正してcommit (r31221)しました。

assert_equal %q{C}, %q{
  Const = :top
  class C
    Const = :Cq
  end
  C.class_eval{
    def m
      Const
    end
  }
  C.new.m
}

-- 
Shugo Maeda

43734 Koichi Sasada <redmine ruby-lang.org> (2011-06-11 17:13:50 +0900) [Ruby 1.9 - Bug #4536][Feedback] 定数参照について1.8と1.9の違い

[Translation not available]
Add translation
Issue #4536 has been updated by Koichi Sasada.

Status changed from Open to Feedback
Assignee set to Shugo Maeda

これは閉じてもいいでしょうか.
---(click to toggle ticket description)---
Bug #4536: 定数参照について1.8と1.9の違い
http://redmine.ruby-lang.org/issues/4536

Author: Yukihiro Matsumoto
Status: Feedback
Priority: Normal
Assignee: Shugo Maeda
Category: 
Target version: 
ruby -v: -


=begin
以下のプログラムは1.8ではエラーになりますが、1.9ではエラーを
示さず動作します。定数参照は(できるだけ)静的スコープで、とい
う設計方針に従えば、1.8の方が正しいと思います。

どうやって直したら良いと思いますか? あるいは直さずに今後は
1.9的挙動が正としますか?

module A
  B = 42
end

A.class_eval do
  def self.f
    p B
  end
end

A.f

=end



-- 
http://redmine.ruby-lang.org

43775 Shugo Maeda <redmine ruby-lang.org> (2011-06-13 13:33:02 +0900) [Ruby 1.9 - Bug #4536] 定数参照について1.8と1.9の違い

[Translation not available]
Add translation
Issue #4536 has been updated by Shugo Maeda.

Assignee changed from Shugo Maeda to Yukihiro Matsumoto

Koichi Sasada wrote:
> これは閉じてもいいでしょうか.

まつともさんがこれでいいならいいと思います。
というわけでまつもとさんにアサインしました。
---(click to toggle ticket description)---
Bug #4536: 定数参照について1.8と1.9の違い
http://redmine.ruby-lang.org/issues/4536

Author: Yukihiro Matsumoto
Status: Feedback
Priority: Normal
Assignee: Yukihiro Matsumoto
Category: 
Target version: 
ruby -v: -


=begin
以下のプログラムは1.8ではエラーになりますが、1.9ではエラーを
示さず動作します。定数参照は(できるだけ)静的スコープで、とい
う設計方針に従えば、1.8の方が正しいと思います。

どうやって直したら良いと思いますか? あるいは直さずに今後は
1.9的挙動が正としますか?

module A
  B = 42
end

A.class_eval do
  def self.f
    p B
  end
end

A.f

=end



-- 
http://redmine.ruby-lang.org

43776 Yukihiro Matsumoto <matz ruby-lang.org> (2011-06-13 13:41:50 +0900) Re: [Ruby 1.9 - Bug #4536] 定数参照について1.8と1.9の違い

[Translation not available]
Add translation
まつとも ゆきひろです

もう直ったんだし、いいんじゃないでしょうか。

In message "Re: [ruby-dev:43775] [Ruby 1.9 - Bug #4536] 定数参照について1.8と1.9の違い"
    on Mon, 13 Jun 2011 13:33:02 +0900, Shugo Maeda <redmine / ruby-lang.org> writes:

|Koichi Sasada wrote:
|> これは閉じてもいいでしょうか.
|
|まつともさんがこれでいいならいいと思います。
|というわけでまつもとさんにアサインしました。

43777 Yukihiro Matsumoto <matz ruby-lang.org> (2011-06-13 13:42:45 +0900) [Ruby 1.9 - Bug #4536][Closed] 定数参照について1.8と1.9の違い

[Translation not available]
Add translation
Issue #4536 has been updated by Yukihiro Matsumoto.

Status changed from Feedback to Closed


---(click to toggle ticket description)---
Bug #4536: 定数参照について1.8と1.9の違い
http://redmine.ruby-lang.org/issues/4536

Author: Yukihiro Matsumoto
Status: Closed
Priority: Normal
Assignee: Yukihiro Matsumoto
Category: 
Target version: 
ruby -v: -


=begin
以下のプログラムは1.8ではエラーになりますが、1.9ではエラーを
示さず動作します。定数参照は(できるだけ)静的スコープで、とい
う設計方針に従えば、1.8の方が正しいと思います。

どうやって直したら良いと思いますか? あるいは直さずに今後は
1.9的挙動が正としますか?

module A
  B = 42
end

A.class_eval do
  def self.f
    p B
  end
end

A.f

=end



-- 
http://redmine.ruby-lang.org

Back