[Ruby 1.9 - Bug #4536][Open] 定数参照について1.8と1.9の違い

Issue #4536 has been reported by Yukihiro M…


Bug #4536: 定数参照について1.8と1.9の違い

Author: Yukihiro M.
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

ささだです.

(2011/03/29 17:41), Yukihiro M. wrote:

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 ': uninitialized constant Module::B (NameError)

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

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

$BA0ED$G$9!#(B

2011$BG/(B3$B7n(B29$BF|(B17:55 SASADA Koichi [email protected]:

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

$B$J$N$G!$$=$l$,F0$/$N$O$^$:$$$+$b$7$l$^$;$s$M!%>/$79M$($5$;$F$/$@$5$$!%(B

$B0J2<$N$h$&$K(BCOPY_CREF$B$G%U%i%0$rEAHB$5$;$k$H$3$NItJ,$K4X$7$F$O(B1.8$B$HF1$8F0:n$K$J$k$h$&$G$9!#(B

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 { \

$B$“$s$^$j$A$c$s$H9M$($F$J$$$N$GI{:nMQ$,$”$k$+$b!#(B

$B$7$+$7!$$J$s$G(B Module::B $B$J$s$@!%(B

$B$3$C$A$O$^$@8+$F$^$;$s$,!"2?$J$s$G$7$g$&$M!D!#(B

$B$^$D$b$H(B $B$f$-$R$m$G$9(B

$B%F%9%H$G%(%i!<$,A}$($J$$$h$&$J$i%3%_%C%H$7$F$$$?$@$1$^$;$s$+!)(B

In message “Re: [ruby-dev:43367] Re: [Ruby 1.9 - Bug #4536][Open]
$BDj?t;2>H$K$D$$$F(B1.8$B$H(B1.9$B$N0c$$(B”
on Tue, 29 Mar 2011 18:37:47 +0900, Shugo M.
[email protected] writes:
|
|$BA0ED$G$9!#(B
|
|2011$BG/(B3$B7n(B29$BF|(B17:55 SASADA Koichi [email protected]:
|> module A; B = 42; end
|> A.class_eval{p B}
|> #=> `block in ': uninitialized constant Module::B (NameError)
|>
|> $B$J$N$G!$$=$l$,F0$/$N$O$^$:$$$+$b$7$l$^$;$s$M!%>/$79M$($5$;$F$/$@$5$$!%(B
|
|$B0J2<$N$h$&$K(BCOPY_CREF$B$G%U%i%0$rEAHB$5$;$k$H$3$NItJ,$K4X$7$F$O(B1.8$B$HF1$8F0:n$K$J$k$h$&$G$9!#(B
|
|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 {
|
|$B$“$s$^$j$A$c$s$H9M$($F$J$$$N$GI{:nMQ$,$”$k$+$b!#(B
|
|> # $B$7$+$7!$$J$s$G(B Module::B $B$J$s$@!%(B
|
|$B$3$C$A$O$^$@8+$F$^$;$s$,!"2?$J$s$G$7$g$&$M!D!#(B
|
|–
|Shugo M.

$B!!$5$5$@$G$9!%(B

(2011/03/29 18:37), Shugo M. wrote:

  • 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 { \

$B$"$s$^$j$A$c$s$H9M$($F$J$$$N$GI{:nMQ$,$"$k$+$b!#(B

$B!!$$!$CN$i$J$$$H$3$m$@(B
:)$B!!%F%9%H$,DL$k$N$J$i$$$$$s$G$J$$$G$7$g$&$+!%(B

$BA0ED$G$9!#(B

2011$BG/(B3$B7n(B29$BF|(B18:37 Shugo M. [email protected]:

$B$7$+$7!$$J$s$G(B Module::B $B$J$s$@!%(B

$B$3$C$A$O$^$@8+$F$^$;$s$,!"2?$J$s$G$7$g$&$M!D!#(B

vm_get_ev_const()$B$NCf$G(Broot_cref$B$,@5$7$/@_Dj$5$l$J$$%1!<%9$,(B
$B$“$C$?$;$$$N$h$&$G$9!#(B
$B=$@5$7$?$H$3$m!”(Btest_eval.rb$B$N0J2<$N%F%9%H$,<:GT$9$k$h$&$K$J$j$^$7$?$,!"(B
$B%F%9%H$NJ}$r=$@5$7$F(Bcommit (r31221)$B$7$^$7$?!#(B

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

$BA0ED$G$9!#(B

2011$BG/(B3$B7n(B30$BF|(B8:28 Yukihiro M. [email protected]:

$B%F%9%H$G%(%i!<$,A}$($J$$$h$&$J$i%3%_%C%H$7$F$$$?$@$1$^$;$s$+!)(B

test/ruby/test_defined.rb$B$,<:GT$9$k$h$&$K$J$j$^$7$?$,!"$3$N%P%0$K0MB8$7$?(B
$B%F%9%H$@$C$?$N$G(Bclass_eval$B$r;H$o$J$$$h$&$K=$@5$7$F(Bcommit$B$7$^$7$?!#(B

Issue #4536 has been updated by Koichi Sasada.

Status changed from Open to Feedback
Assignee set to Shugo M.

これは閉じてもいいでしょうか.

Bug #4536: 定数参照について1.8と1.9の違い

Author: Yukihiro M.
Status: Feedback
Priority: Normal
Assignee: Shugo M.
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

$B$^$D$H$b(B $B$f$-$R$m$G$9(B

$B$b$&D>$C$?$s$@$7!"$$$$$s$8$c$J$$$G$7$g$&$+!#(B

In message “Re: [ruby-dev:43775] [Ruby 1.9 - Bug #4536]
$BDj?t;2>H$K$D$$$F(B1.8$B$H(B1.9$B$N0c$$(B”
on Mon, 13 Jun 2011 13:33:02 +0900, Shugo M.
[email protected] writes:

|Koichi Sasada wrote:
|> $B$3$l$OJD$8$F$b$$$$$G$7$g$&$+!%(B
|
|$B$^$D$H$b$5$s$,$3$l$G$$$$$J$i$$$$$H;W$$$^$9!#(B
|$B$H$$$&$o$1$G$^$D$b$H$5$s$K%"%5%$%s$7$^$7$?!#(B

Issue #4536 has been updated by Shugo M…

Assignee changed from Shugo M. to Yukihiro M.

Koichi Sasada wrote:

これは閉じてもいいでしょうか.

まつともさんがこれでいいならいいと思います。
というわけでまつもとさんにアサインしました。

Bug #4536: 定数参照について1.8と1.9の違い

Author: Yukihiro M.
Status: Feedback
Priority: Normal
Assignee: Yukihiro M.
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

Issue #4536 has been updated by Yukihiro M…

Status changed from Feedback to Closed


Bug #4536: 定数参照について1.8と1.9の違い

Author: Yukihiro M.
Status: Closed
Priority: Normal
Assignee: Yukihiro M.
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