summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-05-27 19:12:43 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-05-27 19:12:43 +0000
commite5f3b1a5cc39db25503f1d175fbd0f93c04a85c6 (patch)
tree586958dc0f4d60d96f50d9a30ebfcc20b88f9d5a /eval.c
parentdbe2b0e416d8d28d82849eb5891a398e160c10f6 (diff)
downloadruby-e5f3b1a5cc39db25503f1d175fbd0f93c04a85c6.tar.gz
ruby-e5f3b1a5cc39db25503f1d175fbd0f93c04a85c6.tar.xz
ruby-e5f3b1a5cc39db25503f1d175fbd0f93c04a85c6.zip
* cont.c: support Fiber. Check test/ruby/test_fiber.rb for detail.
Fiber is known as "Micro Thread", "Coroutine", and other terms. At this time, only Fiber#pass is supported to change context. I want to know more suitable method name/API for Fiber (... do you know more suitable class name instead of Fiber?) as "suspend/resume", "call", "yield", "start/kick/stop/restart", .... * eval.c, eval_intern.h, thread.c, yarvcore.c, yarvcore.h: ditto. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@12395 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/eval.c b/eval.c
index 327cfbfd6..106f2c95a 100644
--- a/eval.c
+++ b/eval.c
@@ -45,7 +45,6 @@ static VALUE rb_call(VALUE, VALUE, ID, int, const VALUE *, int);
#include "eval_safe.h"
#include "eval_jump.h"
-
/* initialize ruby */
#if defined(__APPLE__)
@@ -114,7 +113,7 @@ ruby_options(int argc, char **argv)
Init_stack((void *)&state);
PUSH_TAG();
if ((state = EXEC_TAG()) == 0) {
- ruby_process_options(argc, argv);
+ SAVE_ROOT_JMPBUF(GET_THREAD(), ruby_process_options(argc, argv));
}
else {
rb_clear_trace_func();
@@ -166,7 +165,7 @@ ruby_cleanup(int ex)
errs[0] = th->errinfo;
PUSH_TAG();
if ((state = EXEC_TAG()) == 0) {
- rb_thread_terminate_all();
+ SAVE_ROOT_JMPBUF(th, rb_thread_terminate_all());
}
else if (ex == 0) {
ex = state;
@@ -204,13 +203,16 @@ ruby_exec_internal(void)
{
int state;
VALUE val;
+ rb_thread_t *th = GET_THREAD();
if (!ruby_eval_tree) return 0;
+
PUSH_TAG();
if ((state = EXEC_TAG()) == 0) {
- GET_THREAD()->base_block = 0;
- val = yarvcore_eval_parsed(ruby_eval_tree,
- rb_str_new2(ruby_sourcefile));
+ SAVE_ROOT_JMPBUF(th, {
+ th->base_block = 0;
+ val = yarvcore_eval_parsed(ruby_eval_tree, rb_str_new2(ruby_sourcefile));
+ });
}
POP_TAG();
return state;
@@ -1171,7 +1173,7 @@ rb_protect(VALUE (*proc) (VALUE), VALUE data, int *state)
PUSH_TAG();
th->trap_tag = &trap_tag;
if ((status = EXEC_TAG()) == 0) {
- result = (*proc) (data);
+ SAVE_ROOT_JMPBUF(th, result = (*proc) (data));
}
th->trap_tag = trap_tag.prev;
POP_TAG();