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