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 "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 | ptrdiff_t cioff;
|
---|
22 | union {
|
---|
23 | mrb_sym mid;
|
---|
24 | struct mrb_context *c;
|
---|
25 | } cxt;
|
---|
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 |
|
---|
33 | MRB_API void mrb_env_unshare(mrb_state*, struct REnv*);
|
---|
34 |
|
---|
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)
|
---|
58 | #define MRB_PROC_ORPHAN 512
|
---|
59 | #define MRB_PROC_ORPHAN_P(p) (((p)->flags & MRB_PROC_ORPHAN) != 0)
|
---|
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 |
|
---|
78 | #include <mruby/khash.h>
|
---|
79 | KHASH_DECLARE(mt, mrb_sym, struct RProc*, TRUE)
|
---|
80 |
|
---|
81 | MRB_END_DECL
|
---|
82 |
|
---|
83 | #endif /* MRUBY_PROC_H */
|
---|