[#18440] racc segv revisited — "Akinori MUSHA" <knu@...>

 次のバグの件なんですが、現時点では原因究明を含めて未解決という

24 messages 2002/10/02
[#18617] Re: racc segv revisited — "Akinori MUSHA" <knu@...> 2002/11/02

At Wed, 2 Oct 2002 23:19:59 +0900,

[ruby-dev:18601] Re: embedded ruby interpreter friendly patch

From: nobu.nakada@...
Date: 2002-10-29 00:41:58 UTC
List: ruby-dev #18601
なかだです。

At Tue, 29 Oct 2002 08:51:24 +0900,
Nobuyoshi-Nakada wrote:
> > |flushはとくに問題もないだろうと思って省略しました。どちらかとい
> > |うと問題なのはruby_eval()という投げやりな名前。
> > 
> > ruby_exec()とか? _runとの区別が大変か。
> 
> ruby_exec()も候補として考えてたので、それでいいかも知れません。
> 
> あともう一つ気なるのが、[ruby-dev:18582]のこの部分。forkしたス
> レッドが終了したときなんですが、こっちは単純にexit()でいいんで
> しょうか。かといって何かできるかというとなんにもなさそうなんで
> すが。

直接exit()するかわりに関数を登録しといてそれを呼ぶ、という手も
あるかも知れません。

もう一ヶ所、ruby_options()でもexit()していますが、これは不要?


Index: eval.c
===================================================================
RCS file: /cvs/ruby/src/ruby/eval.c,v
retrieving revision 1.344
diff -u -2 -p -r1.344 eval.c
--- eval.c	25 Oct 2002 18:39:29 -0000	1.344
+++ eval.c	29 Oct 2002 00:16:49 -0000
@@ -1045,4 +1045,5 @@ error_print()
 	}
     }
+    fflush(stderr);
 }
 
@@ -1194,6 +1195,6 @@ error_handle(ex)
 }
 
-void
-ruby_options(argc, argv)
+int
+ruby_exec_options(argc, argv)
     int argc;
     char **argv;
@@ -1209,7 +1210,17 @@ ruby_options(argc, argv)
 	trace_func = 0;
 	tracing = 0;
-	exit(error_handle(state));
+	state = error_handle(state);
     }
     POP_TAG();
+    return state;
+}
+
+void
+ruby_options(argc, argv)
+    int argc;
+    char **argv;
+{
+    int state = ruby_exec_options(argc, argv);
+    if (state) exit(state);
 }
 
@@ -1230,6 +1241,6 @@ ruby_finalize()
 }
 
-void
-ruby_stop(ex)
+int
+ruby_cleanup(ex)
     int ex;
 {
@@ -1252,16 +1263,13 @@ ruby_stop(ex)
     POP_TAG();
     ruby_finalize();
-    exit(ex);
+    return ex;
 }
 
-void
-ruby_run()
+int
+ruby_exec()
 {
     int state;
-    static int ex;
     volatile NODE *tmp;
 
-    if (ruby_nerrs > 0) exit(ruby_nerrs);
-
     Init_stack((void*)&tmp);
     PUSH_TAG(PROT_NONE);
@@ -1274,5 +1282,21 @@ ruby_run()
     POP_ITER();
     POP_TAG();
+    return state;
+}
+
+void
+ruby_stop(ex)
+    int ex;
+{
+    exit(ruby_cleanup(ex));
+}
 
+void
+ruby_run()
+{
+    int state;
+    static int ex;
+    if (ruby_nerrs > 0) exit(ruby_nerrs);
+    state = ruby_exec();
     if (state && !ex) ex = state;
     ruby_stop(ex);
@@ -3612,4 +3636,5 @@ rb_longjmp(tag, mesg)
 		ruby_sourcefile, ruby_sourceline,
 		RSTRING(e)->ptr);
+	fflush(stderr);
     }
 
@@ -8121,4 +8146,5 @@ rb_thread_schedule()
 	}
 	END_FOREACH_FROM(curr, th);
+	fflush(stderr);
 	next = main_thread;
 	rb_thread_ready(next);
Index: intern.h
===================================================================
RCS file: /cvs/ruby/src/ruby/intern.h,v
retrieving revision 1.98
diff -u -2 -p -r1.98 intern.h
--- intern.h	23 Oct 2002 10:17:29 -0000	1.98
+++ intern.h	29 Oct 2002 00:17:15 -0000
@@ -174,4 +174,7 @@ void rb_exec_end_proc _((void));
 void ruby_finalize _((void));
 void ruby_stop _((int));
+int ruby_cleanup _((int));
+int ruby_exec _((void));
+int ruby_exec_options _((int, char **));
 void rb_gc_mark_threads _((void));
 void rb_thread_start_timer _((void));


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread