Bug #803

eval with binding

Added by usa (Usaku NAKAMURA) over 3 years ago. Updated about 1 year ago.

[ruby-dev:37240]
Status:Closed Start date:
Priority:High Due date:12/24/2008
Assignee:ko1 (Koichi Sasada) % Done:

100%

Category:-
Target version:1.9.1 Release Candidate
ruby -v:

Description

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

誰も教えてくれないので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>

Associated revisions

Revision 21079
Added by ko1 (Koichi Sasada) over 3 years ago

* vm.c (Init_VM): create and define TOPLEVEL_BINDING at first. * vm.c (vm_set_main_stack, rb_iseq_eval_main): added. * parse.y (rb_parser_compile_file): fix to check parse_in_eval flag. * eval.c (ruby_exec_node): use rb_iseq_eval_main() instead of rb_iseq_eval(). * iseq.c (rb_iseq_new_main), vm_core.h: added. main script (specified by -e or script name) should be run under TOPLEVEL_BINDING using Kernel#eval. Above changes simulate Kernel#eval behaviour. [ruby-dev:37240] * compile.c (make_name_for_block): skip iseq except block type. this fix is needed for [ruby-dev:37240], and also fixes [ruby-dev:35392].

History

Updated by ko1 (Koichi Sasada) over 3 years ago

  • Assignee set to ko1 (Koichi Sasada)

Updated by yugui (Yuki Sonoda) over 3 years ago

  • Priority changed from Low to High
  • Target version set to 1.9.1 Release Candidate
@ Ruby開発会議

* その1は頑張る
* その2は重要度低い。KNOWN BUG扱い。

Updated by ko1 (Koichi Sasada) over 3 years ago

 ささだです.

Yuki Sonoda wrote::
> * その2は重要度低い。KNOWN BUG扱い。

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

-- 
// SASADA Koichi at atdot dot net

Updated by yugui (Yuki Sonoda) over 3 years ago

  • Due date set to 12/24/2008

Updated by ko1 (Koichi Sasada) over 3 years ago

 ささだです.

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

Updated by usa (Usaku NAKAMURA) over 3 years ago

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

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>

Updated by ko1 (Koichi Sasada) over 3 years ago

 ささだです.

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

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

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

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

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

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

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

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

(テスト付きで)

>>>> # その2
>>  こちらは,前から書いていたとおり,仕様としていただけると.「こういう場
>> 合に嫌だ」とか,そういう話ってありますかね.
> 
> そもそも「バグだ」と指摘しているわけではなくて、1.8と違うのは
> なぜですか、と聞いているだけなので、理由さえ説明されていれば
> 違っていてもかまわないとは思います。

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

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

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

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

-- 
// SASADA Koichi at atdot dot net

Updated by usa (Usaku NAKAMURA) over 3 years ago

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

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>

Updated by ko1 (Koichi Sasada) over 3 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100
Applied in changeset r21079.

Also available in: Atom PDF