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 */
|
---|