Ruby  2.4.2p198(2017-09-14revision59899)
method.h
Go to the documentation of this file.
1 /**********************************************************************
2 
3  method.h -
4 
5  $Author: ktsj $
6  created at: Wed Jul 15 20:02:33 2009
7 
8  Copyright (C) 2009 Koichi Sasada
9 
10 **********************************************************************/
11 #ifndef RUBY_METHOD_H
12 #define RUBY_METHOD_H 1
13 
14 #include "internal.h"
15 
16 #ifndef END_OF_ENUMERATION
17 # if defined(__GNUC__) &&! defined(__STRICT_ANSI__)
18 # define END_OF_ENUMERATION(key)
19 # else
20 # define END_OF_ENUMERATION(key) END_OF_##key##_PLACEHOLDER = 0
21 # endif
22 #endif
23 
24 /* cref */
25 
26 typedef enum {
31 
34 
35 typedef struct rb_scope_visi_struct {
37  unsigned int module_func : 1;
39 
40 typedef struct rb_cref_struct {
43  const VALUE klass;
44  struct rb_cref_struct * const next;
46 } rb_cref_t;
47 
48 /* method data type */
49 
50 typedef struct rb_method_entry_struct {
55  const VALUE owner;
57 
58 typedef struct rb_callable_method_entry_struct { /* same fields with rb_method_entry_t */
63  const VALUE owner;
65 
66 #define METHOD_ENTRY_VISI(me) (rb_method_visibility_t)(((me)->flags & (IMEMO_FL_USER0 | IMEMO_FL_USER1)) >> (IMEMO_FL_USHIFT+0))
67 #define METHOD_ENTRY_BASIC(me) (int) (((me)->flags & (IMEMO_FL_USER2 )) >> (IMEMO_FL_USHIFT+2))
68 #define METHOD_ENTRY_COMPLEMENTED(me) ((me)->flags & IMEMO_FL_USER3)
69 #define METHOD_ENTRY_COMPLEMENTED_SET(me) ((me)->flags = (me)->flags | IMEMO_FL_USER3)
70 
71 static inline void
73 {
74  VM_ASSERT((int)visi >= 0 && visi <= 3);
75  me->flags = (me->flags & ~(IMEMO_FL_USER0 | IMEMO_FL_USER1)) | (visi << (IMEMO_FL_USHIFT+0));
76 }
77 static inline void
78 METHOD_ENTRY_BASIC_SET(rb_method_entry_t *me, unsigned int basic)
79 {
80  VM_ASSERT(basic <= 1);
81  me->flags = (me->flags & ~(IMEMO_FL_USER2 )) | (basic << (IMEMO_FL_USHIFT+2));
82 }
83 static inline void
85 {
86  VM_ASSERT((int)visi >= 0 && visi <= 3);
87  VM_ASSERT(basic <= 1);
88  me->flags =
90  ((visi << (IMEMO_FL_USHIFT+0)) | (basic << (IMEMO_FL_USHIFT+2)));
91 }
92 static inline void
94 {
95  dst->flags =
98 }
99 
100 typedef enum {
110  VM_METHOD_TYPE_OPTIMIZED, /* Kernel#send, Proc#call, etc */
111  VM_METHOD_TYPE_MISSING, /* wrapper for method_missing(id) */
113 
114  END_OF_ENUMERATION(VM_METHOD_TYPE)
116 
117 #ifndef rb_iseq_t
118 typedef struct rb_iseq_struct rb_iseq_t;
119 #define rb_iseq_t rb_iseq_t
120 #endif
121 
122 typedef struct rb_method_iseq_struct {
123  const rb_iseq_t * const iseqptr; /* should be separated from iseqval */
124  rb_cref_t * const cref; /* should be marked */
125 } rb_method_iseq_t; /* check rb_add_method_iseq() when modify the fields */
126 
127 typedef struct rb_method_cfunc_struct {
129  VALUE (*invoker)(VALUE (*func)(ANYARGS), VALUE recv, int argc, const VALUE *argv);
130  int argc;
132 
133 typedef struct rb_method_attr_struct {
135  const VALUE location; /* should be marked */
137 
138 typedef struct rb_method_alias_struct {
139  const struct rb_method_entry_struct * const original_me; /* original_me->klass is original owner */
141 
142 typedef struct rb_method_refined_struct {
143  const struct rb_method_entry_struct * const orig_me;
144  const VALUE owner;
146 
148  rb_method_type_t type : 8; /* method type */
149  int alias_count : 28;
151 
152  union {
158 
159  const VALUE proc; /* should be marked */
160  enum method_optimized_type {
163 
164  OPTIMIZED_METHOD_TYPE__MAX
165  } optimize_type;
166  } body;
167 
170 
171 #define UNDEFINED_METHOD_ENTRY_P(me) (!(me) || !(me)->def || (me)->def->type == VM_METHOD_TYPE_UNDEF)
172 #define UNDEFINED_REFINED_METHOD_P(def) \
173  ((def)->type == VM_METHOD_TYPE_REFINED && \
174  UNDEFINED_METHOD_ENTRY_P((def)->body.refined.orig_me))
175 
176 void rb_add_method_cfunc(VALUE klass, ID mid, VALUE (*func)(ANYARGS), int argc, rb_method_visibility_t visi);
177 void rb_add_method_iseq(VALUE klass, ID mid, const rb_iseq_t *iseq, rb_cref_t *cref, rb_method_visibility_t visi);
178 void rb_add_refined_method_entry(VALUE refined_class, ID mid);
179 
180 rb_method_entry_t *rb_add_method(VALUE klass, ID mid, rb_method_type_t type, void *option, rb_method_visibility_t visi);
183 
185 
186 const rb_method_entry_t *rb_method_entry(VALUE klass, ID id);
190 
195 
197 int rb_method_entry_eq(const rb_method_entry_t *m1, const rb_method_entry_t *m2);
199 
203 
205 void rb_sweep_method_entry(void *vm);
206 
210 
212 
213 #endif /* RUBY_METHOD_H */
const VALUE owner
Definition: method.h:144
rb_method_type_t type
Definition: method.h:148
rb_method_entry_t * rb_method_entry_set(VALUE klass, ID mid, const rb_method_entry_t *, rb_method_visibility_t noex)
Definition: vm_method.c:666
const rb_callable_method_entry_t * rb_callable_method_entry_with_refinements(VALUE klass, ID id)
Definition: vm_method.c:873
rb_method_attr_t attr
Definition: method.h:155
struct rb_method_iseq_struct rb_method_iseq_t
const rb_method_entry_t * rb_method_entry_clone(const rb_method_entry_t *me)
Definition: vm_method.c:402
void rb_add_method_iseq(VALUE klass, ID mid, const rb_iseq_t *iseq, rb_cref_t *cref, rb_method_visibility_t visi)
Definition: vm_method.c:643
const VALUE owner
Definition: method.h:63
static unsigned int hash(str, len) register const char *str
const VALUE location
Definition: method.h:135
static void METHOD_ENTRY_BASIC_SET(rb_method_entry_t *me, unsigned int basic)
Definition: method.h:78
rb_cref_t *const cref
Definition: method.h:124
struct rb_method_definition_struct *const def
Definition: method.h:61
VALUE rb_mod_method_location(VALUE mod, ID id)
Definition: proc.c:2508
struct rb_method_attr_struct rb_method_attr_t
SSL_METHOD *(* func)(void)
Definition: ossl_ssl.c:54
rb_method_entry_t * rb_method_entry_create(ID called_id, VALUE klass, rb_method_visibility_t visi, const rb_method_definition_t *def)
Definition: vm_method.c:393
const VALUE owner
Definition: method.h:55
static void METHOD_ENTRY_VISI_SET(rb_method_entry_t *me, rb_method_visibility_t visi)
Definition: method.h:72
struct rb_method_alias_struct rb_method_alias_t
ID called_id
Definition: method.h:54
void rb_sweep_method_entry(void *vm)
struct rb_method_entry_struct rb_method_entry_t
st_data_t st_index_t
Definition: st.h:50
#define IMEMO_FL_USER1
Definition: internal.h:758
struct rb_method_refined_struct rb_method_refined_t
struct rb_method_definition_struct rb_method_definition_t
int rb_method_entry_eq(const rb_method_entry_t *m1, const rb_method_entry_t *m2)
Definition: vm_method.c:1421
static void METHOD_ENTRY_FLAGS_COPY(rb_method_entry_t *dst, const rb_method_entry_t *src)
Definition: method.h:93
rb_method_iseq_t iseq
Definition: method.h:153
VALUE flags
Definition: method.h:59
rb_method_cfunc_t cfunc
Definition: method.h:154
const rb_scope_visibility_t scope_visi
Definition: method.h:45
struct rb_cref_struct rb_cref_t
struct rb_cref_struct *const next
Definition: method.h:44
void rb_method_entry_copy(rb_method_entry_t *dst, const rb_method_entry_t *src)
Definition: vm_method.c:424
static void METHOD_ENTRY_FLAGS_SET(rb_method_entry_t *me, rb_method_visibility_t visi, unsigned int basic)
Definition: method.h:84
rb_method_alias_t alias
Definition: method.h:156
#define IMEMO_FL_USER2
Definition: internal.h:759
rb_method_visibility_t
Definition: method.h:26
struct rb_method_definition_struct *const def
Definition: method.h:53
void rb_free_method_entry(const rb_method_entry_t *me)
Definition: vm_method.c:174
const rb_method_entry_t * rb_method_entry_with_refinements(VALUE klass, ID id)
Definition: vm_method.c:867
int rb_method_entry_arity(const rb_method_entry_t *me)
Definition: proc.c:2341
int argc
Definition: ruby.c:183
const rb_method_entry_t * rb_resolve_refined_method(VALUE refinements, const rb_method_entry_t *me)
Definition: vm_method.c:941
const VALUE refinements
Definition: method.h:42
const VALUE defined_class
Definition: method.h:60
Definition: method.h:50
Definition: method.h:58
VALUE rb_method_entry_location(const rb_method_entry_t *me)
Definition: proc.c:2501
const rb_callable_method_entry_t * rb_resolve_refined_method_callable(VALUE refinements, const rb_callable_method_entry_t *me)
Definition: vm_method.c:947
rb_method_type_t
Definition: method.h:100
void rb_add_method_cfunc(VALUE klass, ID mid, VALUE(*func)(ANYARGS), int argc, rb_method_visibility_t visi)
Definition: vm_method.c:136
const VALUE klass
Definition: method.h:43
const rb_callable_method_entry_t * rb_callable_method_entry(VALUE klass, ID id)
Definition: vm_method.c:834
#define VM_ASSERT(expr)
Definition: vm_core.h:54
const rb_method_entry_t * rb_method_entry(VALUE klass, ID id)
Definition: vm_method.c:796
unsigned long ID
Definition: ruby.h:86
#define IMEMO_FL_USER0
Definition: internal.h:757
st_index_t rb_hash_method_entry(st_index_t hash, const rb_method_entry_t *me)
Definition: vm_method.c:1520
unsigned long VALUE
Definition: ruby.h:85
const VALUE defined_class
Definition: method.h:52
rb_method_visibility_t method_visi
Definition: method.h:36
ID called_id
Definition: method.h:62
const struct rb_method_entry_struct *const original_me
Definition: method.h:139
struct rb_callable_method_entry_struct rb_callable_method_entry_t
const rb_method_entry_t * rb_method_entry_at(VALUE obj, ID id)
Definition: vm_method.c:714
struct rb_method_cfunc_struct rb_method_cfunc_t
#define IMEMO_FL_USHIFT
Definition: internal.h:756
const rb_callable_method_entry_t * rb_callable_method_entry_without_refinements(VALUE klass, ID id)
Definition: vm_method.c:887
#define END_OF_ENUMERATION(key)
Definition: method.h:20
const rb_callable_method_entry_t * rb_method_entry_complement_defined_class(const rb_method_entry_t *src_me, ID called_id, VALUE defined_class)
Definition: vm_method.c:411
#define ANYARGS
Definition: defines.h:173
struct rb_scope_visi_struct rb_scope_visibility_t
rb_method_entry_t * rb_add_method(VALUE klass, ID mid, rb_method_type_t type, void *option, rb_method_visibility_t visi)
Definition: vm_method.c:631
void rb_scope_visibility_set(rb_method_visibility_t)
Definition: vm_method.c:1126
void rb_add_refined_method_entry(VALUE refined_class, ID mid)
Definition: vm_method.c:462
VALUE flags
Definition: method.h:41
VALUE flags
Definition: method.h:51
const rb_iseq_t *const iseqptr
Definition: method.h:123
#define mod(x, y)
Definition: date_strftime.c:28
const struct rb_method_entry_struct *const orig_me
Definition: method.h:143
rb_method_refined_t refined
Definition: method.h:157
const rb_method_entry_t * rb_method_entry_without_refinements(VALUE klass, ID id)
Definition: vm_method.c:881
VALUE rb_obj_method_location(VALUE obj, ID id)
Definition: proc.c:2515
unsigned int module_func
Definition: method.h:37
char ** argv
Definition: ruby.c:184