diff options
| author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-05-27 19:12:43 +0000 |
|---|---|---|
| committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-05-27 19:12:43 +0000 |
| commit | e5f3b1a5cc39db25503f1d175fbd0f93c04a85c6 (patch) | |
| tree | 586958dc0f4d60d96f50d9a30ebfcc20b88f9d5a /eval.c | |
| parent | dbe2b0e416d8d28d82849eb5891a398e160c10f6 (diff) | |
| download | ruby-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.c | 16 |
1 files changed, 9 insertions, 7 deletions
@@ -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(); |
