From 5c0b9b703c9d1a08d7219b057b809bda4bc89f8a Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Mon, 20 May 2013 17:54:07 +0900 Subject: primary mruby fiber implementation --- include/mruby.h | 29 +++++++++++++++++------------ include/mruby/gc.h | 1 + include/mruby/value.h | 11 +++++++++-- 3 files changed, 27 insertions(+), 14 deletions(-) (limited to 'include') diff --git a/include/mruby.h b/include/mruby.h index 9fe70e5b8..73c38cf1d 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -61,16 +61,8 @@ typedef struct { struct REnv *env; } mrb_callinfo; -enum gc_state { - GC_STATE_NONE = 0, - GC_STATE_MARK, - GC_STATE_SWEEP -}; - -typedef struct mrb_state { - void *jmp; - - mrb_allocf allocf; +struct mrb_context { + struct mrb_context *prev; mrb_value *stack; mrb_value *stbase, *stend; @@ -82,10 +74,24 @@ typedef struct mrb_state { int rsize; struct RProc **ensure; int esize; +}; + +enum gc_state { + GC_STATE_NONE = 0, + GC_STATE_MARK, + GC_STATE_SWEEP +}; + +typedef struct mrb_state { + void *jmp; + + mrb_allocf allocf; + + struct mrb_context *c; + struct mrb_context *root_c; struct RObject *exc; struct iv_tbl *globals; - struct mrb_irep **irep; size_t irep_len, irep_capa; @@ -140,7 +146,6 @@ typedef struct mrb_state { struct RClass *eStandardError_class; void *ud; /* auxiliary data */ - } mrb_state; typedef mrb_value (*mrb_func_t)(mrb_state *mrb, mrb_value); diff --git a/include/mruby/gc.h b/include/mruby/gc.h index 2f7dc73cf..7afa24b48 100644 --- a/include/mruby/gc.h +++ b/include/mruby/gc.h @@ -12,5 +12,6 @@ typedef void (each_object_callback)(mrb_state *mrb, struct RBasic* obj, void *data); void mrb_objspace_each_objects(mrb_state *mrb, each_object_callback* callback, void *data); +void mrb_free_context(mrb_state *mrb, struct mrb_context *c); #endif /* MRUBY_GC_H */ diff --git a/include/mruby/value.h b/include/mruby/value.h index 0ce59e06a..fa2a68ac8 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -34,7 +34,8 @@ enum mrb_vtype { MRB_TT_FILE, /* 19 */ MRB_TT_ENV, /* 20 */ MRB_TT_DATA, /* 21 */ - MRB_TT_MAXDEFINE /* 22 */ + MRB_TT_FIBER, /* 22 */ + MRB_TT_MAXDEFINE /* 23 */ }; typedef struct mrb_value { @@ -92,7 +93,8 @@ enum mrb_vtype { MRB_TT_FILE, /* 20 */ MRB_TT_ENV, /* 21 */ MRB_TT_DATA, /* 22 */ - MRB_TT_MAXDEFINE /* 23 */ + MRB_TT_FIBER, /* 23 */ + MRB_TT_MAXDEFINE /* 24 */ }; #ifdef MRB_ENDIAN_BIG @@ -202,6 +204,11 @@ struct RObject { #define mrb_immediate_p(x) (mrb_type(x) <= MRB_TT_VOIDP) #define mrb_special_const_p(x) mrb_immediate_p(x) +struct RFiber { + MRB_OBJECT_HEADER; + struct mrb_context *cxt; +}; + static inline mrb_value mrb_fixnum_value(mrb_int i) { -- cgit v1.2.3