Bug #803
eval with binding
| Status: | Closed | Start date: | ||
|---|---|---|---|---|
| Priority: | High | Due date: | 12/24/2008 | |
| Assignee: | % 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
* 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.