[前][次][番号順一覧][スレッド一覧]

ruby-changes:9619

From: yugui <ko1@a...>
Date: Mon, 29 Dec 2008 16:19:55 +0900 (JST)
Subject: [ruby-changes:9619] Ruby:r21158 (ruby_1_9_1): merges r21143 from trunk into ruby_1_9_1.

yugui	2008-12-29 16:19:11 +0900 (Mon, 29 Dec 2008)

  New Revision: 21158

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=21158

  Log:
    merges r21143 from trunk into ruby_1_9_1.
    * ruby.c (process_options): set th->base_block only while
      it is needed. [ruby-dev:37634]
    * ruby.c (require_libraries): clear th->base_block before
      require libraries.

  Modified files:
    branches/ruby_1_9_1/ChangeLog
    branches/ruby_1_9_1/ruby.c

Index: ruby_1_9_1/ChangeLog
===================================================================
--- ruby_1_9_1/ChangeLog	(revision 21157)
+++ ruby_1_9_1/ChangeLog	(revision 21158)
@@ -1,3 +1,10 @@
+Mon Dec 29 03:43:25 2008  Koichi Sasada  <ko1@a...> 
+	* ruby.c (process_options): set th->base_block only while
+	  it is needed.  [ruby-dev:37634] [Bug #939]
+
+	* ruby.c (require_libraries): clear th->base_block before
+	  require libraries.
+
 Sun Dec 28 18:39:57 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* sprintf.c: not force to override snprintf/vsnprintf.
Index: ruby_1_9_1/ruby.c
===================================================================
--- ruby_1_9_1/ruby.c	(revision 21157)
+++ ruby_1_9_1/ruby.c	(revision 21158)
@@ -453,6 +453,9 @@
 {
     VALUE list = opt->req_list;
     ID require;
+    rb_thread_t *th = GET_THREAD();
+    rb_block_t *prev_base_block = th->base_block;
+    th->base_block = 0;
 
     Init_ext();		/* should be called here for some reason :-( */
     CONST_ID(require, "require");
@@ -461,6 +464,7 @@
 	rb_funcall2(rb_vm_top_self(), require, 1, &feature);
     }
     opt->req_list = 0;
+    th->base_block = prev_base_block;
 }
 
 static void
@@ -1312,10 +1316,16 @@
 
 	GetBindingPtr(toplevel_binding, bind);
 	GetEnvPtr(bind->env, env);
-
-	th->parse_in_eval++;
     }
 
+#define PREPARE_PARSE_MAIN(expr) do { \
+    th->parse_in_eval++; \
+    th->base_block = &env->block; \
+    expr; \
+    th->parse_in_eval--; \
+    th->base_block = 0; \
+} while (0)
+
     if (opt->e_script) {
 	rb_encoding *eenc;
 	if (opt->src.enc.index >= 0) {
@@ -1327,16 +1337,18 @@
 	rb_enc_associate(opt->e_script, eenc);
 	require_libraries(opt);
 
-	th->base_block = &env->block;
-	tree = rb_parser_compile_string(parser, opt->script, opt->e_script, 1);
+	PREPARE_PARSE_MAIN({
+	    tree = rb_parser_compile_string(parser, opt->script, opt->e_script, 1);
+	});
     }
     else {
 	if (opt->script[0] == '-' && !opt->script[1]) {
 	    forbid_setid("program input from stdin");
 	}
 
-	th->base_block = &env->block;
-	tree = load_file(parser, opt->script, 1, opt);
+	PREPARE_PARSE_MAIN({
+	    tree = load_file(parser, opt->script, 1, opt);
+	});
     }
 
     if (opt->intern.enc.index >= 0) {
@@ -1364,19 +1376,23 @@
     }
 
     if (opt->do_print) {
-	tree = rb_parser_append_print(parser, tree);
+	PREPARE_PARSE_MAIN({
+	    tree = rb_parser_append_print(parser, tree);
+	});
     }
     if (opt->do_loop) {
-	tree = rb_parser_while_loop(parser, tree, opt->do_line, opt->do_split);
+	PREPARE_PARSE_MAIN({
+	    tree = rb_parser_while_loop(parser, tree, opt->do_line, opt->do_split);
+	});
 	rb_define_global_function("sub", rb_f_sub, -1);
 	rb_define_global_function("gsub", rb_f_gsub, -1);
 	rb_define_global_function("chop", rb_f_chop, 0);
 	rb_define_global_function("chomp", rb_f_chomp, -1);
     }
 
-    iseq = rb_iseq_new_main(tree, opt->script_name);
-    th->parse_in_eval--;
-    th->base_block = 0;
+    PREPARE_PARSE_MAIN({
+	iseq = rb_iseq_new_main(tree, opt->script_name);
+    });
 
     if (opt->dump & DUMP_BIT(insns)) {
 	rb_io_write(rb_stdout, ruby_iseq_disasm(iseq));

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]