[#6617] Re: IPv6 ruby — Jun-ichiro itojun Hagino <itojun@...>

26 messages 1999/04/15
[#6672] Re: IPv6 ruby — matz@... (Yukihiro Matsumoto) 1999/04/28

まつもと ゆきひろです

[#6673] Re: IPv6 ruby — itojun@... 1999/04/28

[#6674] Re: IPv6 ruby — matz@... (Yukihiro Matsumoto) 1999/04/28

まつもと ゆきひろです

[#6675] Re: IPv6 ruby — itojun@... 1999/04/28

[#6676] Re: IPv6 ruby — matz@... (Yukihiro Matsumoto) 1999/04/28

まつもと ゆきひろです

[#6677] Re: IPv6 ruby — itojun@... 1999/04/28

[ruby-dev:6541] Re: Ruby 1.3.2-990402

From: Koji Arai <JCA02266@...>
Date: 1999-04-02 16:20:20 UTC
List: ruby-dev #6541
新井です。

BEGINブロックの中で、#{} や、eval を使うと本体が実
行されません。

1.3.2-990402でも、ruby-1.2.3 でも同じです。

$ cat hoge.rb
BEGIN {
    p "#{'hoge1'}"
}

p "hoge2"

ruby -v hoge.rb
ruby 1.3.2 (1999-04-02) [i586-linux]
"hoge1"

取り急ぎ、パッチを作って見ましたが…自信はないです。
もっとスマートな方法があるような気もするし。

# 追求してませんが、BEGINの中のrequireとかも同様っ
# ぽいですね。他にあるかなぁ

--- eval.c.org	Thu Apr  1 14:39:21 1999
+++ eval.c	Sat Apr  3 00:55:53 1999
@@ -2447,6 +2447,7 @@
 	    str = rb_str_new3(node->nd_lit);
 	    while (list) {
 		if (list->nd_head) {
+		    NODE *save;
 		    switch (nd_type(list->nd_head)) {
 		      case NODE_STR:
 			str2 = list->nd_head->nd_lit;
@@ -2454,8 +2455,9 @@
 		      case NODE_EVSTR:
 			ruby_sourceline = nd_line(node);
 			ruby_in_eval++;
+			save = ruby_eval_tree;
 			list->nd_head = compile(list->nd_head->nd_lit);
-			ruby_eval_tree = 0;
+			ruby_eval_tree = save;
 			ruby_in_eval--;
 			if (ruby_nerrs > 0) {
 			    compile_error("string expansion");
@@ -4164,6 +4166,8 @@
     }
     PUSH_TAG(PROT_NONE);
     if ((state = EXEC_TAG()) == 0) {
+	NODE *save = ruby_eval_tree;
+
 	ruby_sourcefile = file;
 	ruby_sourceline = line - 1;
 	compile(src);
@@ -4171,6 +4175,7 @@
 	    compile_error(0);
 	}
 	result = eval_node(self);
+	ruby_eval_tree = save;
     }
     POP_TAG();
     POP_CLASS();

In This Thread