mbed I/F binding for mruby

Dependents:   mruby_mbed_web mirb_mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers proc.h Source File

proc.h

00001 /*
00002 ** mruby/proc.h - Proc class
00003 **
00004 ** See Copyright Notice in mruby.h
00005 */
00006 
00007 #ifndef MRUBY_PROC_H
00008 #define MRUBY_PROC_H
00009 
00010 #include "mruby/irep.h"
00011 
00012 #if defined(__cplusplus)
00013 extern "C" {
00014 #endif
00015 
00016 struct REnv {
00017   MRB_OBJECT_HEADER;
00018   mrb_value *stack;
00019   mrb_sym mid;
00020   ptrdiff_t cioff;
00021 };
00022 
00023 #define MRB_SET_ENV_STACK_LEN(e,len) (e)->flags = (unsigned int)(len)
00024 #define MRB_ENV_STACK_LEN(e) ((mrb_int)(e)->flags)
00025 #define MRB_ENV_UNSHARE_STACK(e) ((e)->cioff = -1)
00026 #define MRB_ENV_STACK_SHARED_P(e) ((e)->cioff >= 0)
00027 
00028 struct RProc {
00029   MRB_OBJECT_HEADER;
00030   union {
00031     mrb_irep *irep;
00032     mrb_func_t func;
00033   } body;
00034   struct RClass *target_class;
00035   struct REnv *env;
00036 };
00037 
00038 /* aspec access */
00039 #define MRB_ASPEC_REQ(a)          (((a) >> 18) & 0x1f)
00040 #define MRB_ASPEC_OPT(a)          (((a) >> 13) & 0x1f)
00041 #define MRB_ASPEC_REST(a)         (((a) >> 12) & 0x1)
00042 #define MRB_ASPEC_POST(a)         (((a) >> 7) & 0x1f)
00043 #define MRB_ASPEC_KEY(a)          (((a) >> 2) & 0x1f)
00044 #define MRB_ASPEC_KDICT(a)        ((a) & (1<<1))
00045 #define MRB_ASPEC_BLOCK(a)        ((a) & 1)
00046 
00047 #define MRB_PROC_CFUNC 128
00048 #define MRB_PROC_CFUNC_P(p) (((p)->flags & MRB_PROC_CFUNC) != 0)
00049 #define MRB_PROC_STRICT 256
00050 #define MRB_PROC_STRICT_P(p) (((p)->flags & MRB_PROC_STRICT) != 0)
00051 
00052 #define mrb_proc_ptr(v)    ((struct RProc*)(mrb_ptr(v)))
00053 
00054 struct RProc *mrb_proc_new(mrb_state*, mrb_irep*);
00055 struct RProc *mrb_closure_new(mrb_state*, mrb_irep*);
00056 MRB_API struct RProc *mrb_proc_new_cfunc(mrb_state*, mrb_func_t);
00057 MRB_API struct RProc *mrb_closure_new_cfunc(mrb_state *mrb, mrb_func_t func, int nlocals);
00058 void mrb_proc_copy(struct RProc *a, struct RProc *b);
00059 
00060 /* implementation of #send method */
00061 MRB_API mrb_value mrb_f_send(mrb_state *mrb, mrb_value self);
00062 
00063 /* following functions are defined in mruby-proc-ext so please include it when using */
00064 MRB_API struct RProc *mrb_proc_new_cfunc_with_env(mrb_state*, mrb_func_t, mrb_int, const mrb_value*);
00065 MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state*, mrb_int);
00066 /* old name */
00067 #define mrb_cfunc_env_get(mrb, idx) mrb_proc_cfunc_env_get(mrb, idx)
00068 
00069 #include "mruby/khash.h"
00070 KHASH_DECLARE(mt, mrb_sym, struct RProc*, TRUE)
00071 
00072 #if defined(__cplusplus)
00073 }  /* extern "C" { */
00074 #endif
00075 
00076 #endif  /* MRUBY_PROC_H */
00077