Project

General

Profile

Actions

Bug #803

closed

eval with binding

Added by usa (Usaku NAKAMURA) over 12 years ago. Updated almost 10 years ago.

Status:
Closed
Priority:
Normal
ruby -v:
Backport:
[ruby-dev:37240]

Description

=begin
こんにちは、なかむら(う)です。

誰も教えてくれないのでbugにします。
# これでなるのかな

In message "[ruby-dev:37142] eval with binding"
on Nov.21,2008 22:02:04, usa@garbagecollect.jp wrote:

以下の2つのコードが、1.8とtrunkで動作が異なります。
なぜでしょう?
私には1.8の挙動が自然に思えます。

その1

x = 0
eval("p x", TOPLEVEL_BINDING)

1.8 => 0

trunk => NameError

その2

BEGIN{$b = binding}
x = 0
eval("p x", $b)

1.8 => NameError

trunk => 0

それでは。
--
U.Nakamura usa@garbagecollect.jp
=end

Actions #1

Updated by ko1 (Koichi Sasada) over 12 years ago

  • Assignee set to ko1 (Koichi Sasada)

=begin

=end

Actions #2

Updated by yugui (Yuki Sonoda) over 12 years ago

  • Priority changed from 3 to 5
  • Target version set to 1.9.1 Release Candidate

=begin
@ Ruby開発会議

  • その1は頑張る
  • その2は重要度低い。KNOWN BUG扱い。 =end
Actions #3

Updated by ko1 (Koichi Sasada) over 12 years ago

=begin
 ささだです.

Yuki Sonoda wrote::

  • その2は重要度低い。KNOWN BUG扱い。

 KNOWN BUG というか,許されるのなら仕様変更にしたい.
(重要度は低そう,実装は大変)

--
// SASADA Koichi at atdot dot net

=end

Actions #4

Updated by yugui (Yuki Sonoda) over 12 years ago

  • Due date set to 12/24/2008

=begin

=end

Actions #5

Updated by ko1 (Koichi Sasada) over 12 years ago

=begin
 ささだです.

U.Nakamura wrote::

その1

x = 0
eval("p x", TOPLEVEL_BINDING)

1.8 => 0

trunk => NameError

Index: vm.c
===================================================================
--- vm.c (リビジョン 20969)
+++ vm.c (作業コピー)
@@ -1240,7 +1240,10 @@ rb_iseq_eval(VALUE iseqval)
vm_set_top_stack(th, iseqval);

  if (!rb_const_defined(rb_cObject, rb_intern("TOPLEVEL_BINDING"))) {
  • rb_define_global_const("TOPLEVEL_BINDING", rb_binding_new());
  • VALUE bind;
  • rb_vm_set_finish_env(th); /* push dummy frame */
  • rb_define_global_const("TOPLEVEL_BINDING", bind);
  • vm_pop_frame(th); /* pop dummy frame / } val = vm_exec(th); tmp = iseqval; / prohibit tail call optimization */

 これで直るのではないかと思います.ご確認いただけませんか.

その2

BEGIN{$b = binding}
x = 0
eval("p x", $b)

1.8 => NameError

trunk => 0

 こちらは,前から書いていたとおり,仕様としていただけると.「こういう場
合に嫌だ」とか,そういう話ってありますかね.

--
// SASADA Koichi at atdot dot net

=end

Actions #6

Updated by usa (Usaku NAKAMURA) over 12 years ago

=begin
こんにちは、なかむら(う)です。

In message "[ruby-dev:37585] Re: [Bug:trunk] eval with binding"
on Dec.25,2008 00:20:48, ko1@atdot.net wrote:

 これで直るのではないかと思います.ご確認いただけませんか.

変数bindに一度も値を代入したことがないのに直ることはありえな
いと思うんですが。

それはともかく、どこでも通用する再現ケースを示しても、報告者
が確認しないとダメですか。いや言われればやりますけどね。

その2

 こちらは,前から書いていたとおり,仕様としていただけると.「こういう場
合に嫌だ」とか,そういう話ってありますかね.

そもそも「バグだ」と指摘しているわけではなくて、1.8と違うのは
なぜですか、と聞いているだけなので、理由さえ説明されていれば
違っていてもかまわないとは思います。

それでは。
--
U.Nakamura usa@garbagecollect.jp

=end

Actions #7

Updated by ko1 (Koichi Sasada) over 12 years ago

=begin
 ささだです.

U.Nakamura wrote::

変数bindに一度も値を代入したことがないのに直ることはありえな
いと思うんですが。

 これに関してはコピペミスでした.で,投稿したパッチだと直らないことがわ
かったので,方針を変えて修正中です.かなりの大改修になりそうです.

それはともかく、どこでも通用する再現ケースを示しても、報告者
が確認しないとダメですか。いや言われればやりますけどね。

 手元ではそのケースと make test に限り確認していたんですが,それ以外の
テストを行っていないので確認をお願いしたつもりでした.

(で,手元で小さいプログラムで確認したと思ったんだけど,直ってなかった.
おかしいなあ)

 つまり,困ったプログラムがあったんだろう,そういうプログラムでもきちん
と動作するのか,エンバグをしていないか等,そちらの持っているプログラムで
確認してもらうようにお願いしたつもりでした.

(で,そもそも直ってなかった)

 今回は,何を思ったか先にメールで確認しましたが,とりあえず,今後は気に
せずコミットしようと思います.

(テスト付きで)

その2

 こちらは,前から書いていたとおり,仕様としていただけると.「こういう場
合に嫌だ」とか,そういう話ってありますかね.

そもそも「バグだ」と指摘しているわけではなくて、1.8と違うのは
なぜですか、と聞いているだけなので、理由さえ説明されていれば
違っていてもかまわないとは思います。

 理由は [ruby-dev:37376] で書いたとおり,「実装が大変」だからです.

 まつもとさんに聞いたら,とくに問題ない(実装と1.8互換性の天秤にかけ
て,この互換性欠如が問題になることはないのではないか)という回答を得てい
ます.が,うささんには困った事情があったのではないかと推察します.その事
情がどれくらい問題であるか聞きたかった,ということです.

 もし,その問題がまつもとさんに「これは直さないといかん」ということにな
れば,私は直すことになるかと思います.

 この挙動自体は,BEGIN{} のスコープに関する私の勘違いからこのようになっ
ています.具体的には,BEGIN{} を iseq の先頭にくっつけるような実装にして
いる.

--
// SASADA Koichi at atdot dot net

=end

Actions #8

Updated by usa (Usaku NAKAMURA) over 12 years ago

=begin
こんにちは、なかむら(う)です。

In message "[ruby-dev:37600] Re: [Bug:trunk] eval with binding"
on Dec.26,2008 07:58:59, ko1@atdot.net wrote:

 つまり,困ったプログラムがあったんだろう,そういうプログラムでもきちん
と動作するのか,エンバグをしていないか等,そちらの持っているプログラムで
確認してもらうようにお願いしたつもりでした.

話の元はIRCでの遠藤さんとの雑談(「rubyで〜〜なことができるか」
というクイズ)だったので、他の何の前提もなく、問題ケースその1
のコードが書かれています。
なので、私の手元で特にこれが原因で困ったプログラムがあるわけ
ではありません。

ただし、この挙動を前提としたコードをどこかで見た記憶はあるの
で(私が書いたものじゃないですが)、世界のどこかにはこれで困る
ことになる人はいるだろうと思われます。

そもそも「バグだ」と指摘しているわけではなくて、1.8と違うのは
なぜですか、と聞いているだけなので、理由さえ説明されていれば
違っていてもかまわないとは思います。

 理由は [ruby-dev:37376] で書いたとおり,「実装が大変」だからです.

 まつもとさんに聞いたら,とくに問題ない(実装と1.8互換性の天秤にかけ
て,この互換性欠如が問題になることはないのではないか)という回答を得てい
ます.が,うささんには困った事情があったのではないかと推察します.その事
情がどれくらい問題であるか聞きたかった,ということです.

その2については、その1の元となったクイズをいかに1.9で解くか、
という点からひねり出したものなので、正直挙動自体はどうでもい
いです。

私に関してはruby_1_8ブランチが切られてからずっとtrunk使ってる
ので今更1.8と互換性がない部分があったのに気づいた、とかいうこ
とがあっても何も困りません。
# 昨日までのtrunkと今日のtrunkで違うよ、とかいうことがあった
# らさすがに困りますが :)

ただ、説明されていない非互換性はバグとしか考えようがありませ
んから、バグじゃないなら説明をしてね、と言ってるだけです。
本件については、非互換であること自体は当初から一度も問題には
していないつもりです。

それでは。
--
U.Nakamura usa@garbagecollect.jp

=end

Actions #9

Updated by ko1 (Koichi Sasada) over 12 years ago

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

=begin
Applied in changeset r21079.
=end

Actions

Also available in: Atom PDF