[270] | 1 | /*
|
---|
| 2 | ** mruby/proc.h - Proc class
|
---|
| 3 | **
|
---|
| 4 | ** See Copyright Notice in mruby.h
|
---|
| 5 | */
|
---|
| 6 |
|
---|
| 7 | #ifndef MRUBY_PROC_H
|
---|
| 8 | #define MRUBY_PROC_H
|
---|
| 9 |
|
---|
| 10 | #include "mruby/common.h"
|
---|
| 11 | #include "mruby/irep.h"
|
---|
| 12 |
|
---|
| 13 | /**
|
---|
| 14 | * Proc class
|
---|
| 15 | */
|
---|
| 16 | MRB_BEGIN_DECL
|
---|
| 17 |
|
---|
| 18 | struct REnv {
|
---|
| 19 | MRB_OBJECT_HEADER;
|
---|
| 20 | mrb_value *stack;
|
---|
| 21 | mrb_sym mid;
|
---|
| 22 | ptrdiff_t cioff;
|
---|
| 23 | };
|
---|
| 24 |
|
---|
| 25 | #define MRB_SET_ENV_STACK_LEN(e,len) (e)->flags = (unsigned int)(len)
|
---|
| 26 | #define MRB_ENV_STACK_LEN(e) ((mrb_int)(e)->flags)
|
---|
| 27 | #define MRB_ENV_UNSHARE_STACK(e) ((e)->cioff = -1)
|
---|
| 28 | #define MRB_ENV_STACK_SHARED_P(e) ((e)->cioff >= 0)
|
---|
| 29 |
|
---|
| 30 | struct RProc {
|
---|
| 31 | MRB_OBJECT_HEADER;
|
---|
| 32 | union {
|
---|
| 33 | mrb_irep *irep;
|
---|
| 34 | mrb_func_t func;
|
---|
| 35 | } body;
|
---|
| 36 | struct RClass *target_class;
|
---|
| 37 | struct REnv *env;
|
---|
| 38 | };
|
---|
| 39 |
|
---|
| 40 | /* aspec access */
|
---|
| 41 | #define MRB_ASPEC_REQ(a) (((a) >> 18) & 0x1f)
|
---|
| 42 | #define MRB_ASPEC_OPT(a) (((a) >> 13) & 0x1f)
|
---|
| 43 | #define MRB_ASPEC_REST(a) (((a) >> 12) & 0x1)
|
---|
| 44 | #define MRB_ASPEC_POST(a) (((a) >> 7) & 0x1f)
|
---|
| 45 | #define MRB_ASPEC_KEY(a) (((a) >> 2) & 0x1f)
|
---|
| 46 | #define MRB_ASPEC_KDICT(a) ((a) & (1<<1))
|
---|
| 47 | #define MRB_ASPEC_BLOCK(a) ((a) & 1)
|
---|
| 48 |
|
---|
| 49 | #define MRB_PROC_CFUNC 128
|
---|
| 50 | #define MRB_PROC_CFUNC_P(p) (((p)->flags & MRB_PROC_CFUNC) != 0)
|
---|
| 51 | #define MRB_PROC_STRICT 256
|
---|
| 52 | #define MRB_PROC_STRICT_P(p) (((p)->flags & MRB_PROC_STRICT) != 0)
|
---|
| 53 |
|
---|
| 54 | #define mrb_proc_ptr(v) ((struct RProc*)(mrb_ptr(v)))
|
---|
| 55 |
|
---|
| 56 | struct RProc *mrb_proc_new(mrb_state*, mrb_irep*);
|
---|
| 57 | struct RProc *mrb_closure_new(mrb_state*, mrb_irep*);
|
---|
| 58 | MRB_API struct RProc *mrb_proc_new_cfunc(mrb_state*, mrb_func_t);
|
---|
| 59 | MRB_API struct RProc *mrb_closure_new_cfunc(mrb_state *mrb, mrb_func_t func, int nlocals);
|
---|
| 60 | void mrb_proc_copy(struct RProc *a, struct RProc *b);
|
---|
| 61 |
|
---|
| 62 | /* implementation of #send method */
|
---|
| 63 | MRB_API mrb_value mrb_f_send(mrb_state *mrb, mrb_value self);
|
---|
| 64 |
|
---|
| 65 | /* following functions are defined in mruby-proc-ext so please include it when using */
|
---|
| 66 | MRB_API struct RProc *mrb_proc_new_cfunc_with_env(mrb_state*, mrb_func_t, mrb_int, const mrb_value*);
|
---|
| 67 | MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state*, mrb_int);
|
---|
| 68 | /* old name */
|
---|
| 69 | #define mrb_cfunc_env_get(mrb, idx) mrb_proc_cfunc_env_get(mrb, idx)
|
---|
| 70 |
|
---|
| 71 | #include "mruby/khash.h"
|
---|
| 72 | KHASH_DECLARE(mt, mrb_sym, struct RProc*, TRUE)
|
---|
| 73 |
|
---|
| 74 | MRB_END_DECL
|
---|
| 75 |
|
---|
| 76 | #endif /* MRUBY_PROC_H */
|
---|