Ruby
2.1.3p242(2014-09-19revision47630)
Main Page
Modules
Data Structures
Files
File List
Globals
method.h
Go to the documentation of this file.
1
/**********************************************************************
2
3
method.h -
4
5
$Author: tmm1 $
6
created at: Wed Jul 15 20:02:33 2009
7
8
Copyright (C) 2009 Koichi Sasada
9
10
**********************************************************************/
11
#ifndef METHOD_H
12
#define METHOD_H
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
typedef
enum
{
25
NOEX_PUBLIC
= 0x00,
26
NOEX_NOSUPER
= 0x01,
27
NOEX_PRIVATE
= 0x02,
28
NOEX_PROTECTED
= 0x04,
29
NOEX_MASK
= 0x06,
30
NOEX_BASIC
= 0x08,
31
NOEX_UNDEF
=
NOEX_NOSUPER
,
32
NOEX_MODFUNC
= 0x12,
33
NOEX_SUPER
= 0x20,
34
NOEX_VCALL
= 0x40,
35
NOEX_RESPONDS
= 0x80,
36
37
NOEX_BIT_WIDTH
= 8,
38
NOEX_SAFE_SHIFT_OFFSET
= ((
NOEX_BIT_WIDTH
+3)/4)*4
/* round up to nibble */
39
}
rb_method_flag_t
;
40
41
#define NOEX_SAFE(n) ((int)((n) >> NOEX_SAFE_SHIFT_OFFSET) & 0x0F)
42
#define NOEX_WITH(n, s) (((s) << NOEX_SAFE_SHIFT_OFFSET) | (n) | (ruby_running ? 0 : NOEX_BASIC))
43
#define NOEX_WITH_SAFE(n) NOEX_WITH((n), rb_safe_level())
44
45
/* method data type */
46
47
typedef
enum
{
48
VM_METHOD_TYPE_ISEQ
,
49
VM_METHOD_TYPE_CFUNC
,
50
VM_METHOD_TYPE_ATTRSET
,
51
VM_METHOD_TYPE_IVAR
,
52
VM_METHOD_TYPE_BMETHOD
,
53
VM_METHOD_TYPE_ZSUPER
,
54
VM_METHOD_TYPE_UNDEF
,
55
VM_METHOD_TYPE_NOTIMPLEMENTED
,
56
VM_METHOD_TYPE_OPTIMIZED
,
/* Kernel#send, Proc#call, etc */
57
VM_METHOD_TYPE_MISSING
,
/* wrapper for method_missing(id) */
58
VM_METHOD_TYPE_REFINED
,
59
60
END_OF_ENUMERATION
(VM_METHOD_TYPE)
61
}
rb_method_type_t
;
62
63
struct
rb_call_info_struct
;
64
65
typedef
struct
rb_method_cfunc_struct
{
66
VALUE
(*
func
)(
ANYARGS
);
67
VALUE
(*
invoker
)(
VALUE
(*
func
)(
ANYARGS
),
VALUE
recv,
int
argc
,
const
VALUE
*
argv
);
68
int
argc
;
69
}
rb_method_cfunc_t
;
70
71
typedef
struct
rb_method_attr_struct
{
72
ID
id
;
73
const
VALUE
location
;
74
}
rb_method_attr_t
;
75
76
typedef
struct
rb_iseq_struct
rb_iseq_t
;
77
78
typedef
struct
rb_method_definition_struct
{
79
rb_method_type_t
type
;
/* method type */
80
ID
original_id
;
81
union
{
82
rb_iseq_t
*
const
iseq
;
/* should be mark */
83
rb_method_cfunc_t
cfunc
;
84
rb_method_attr_t
attr
;
85
const
VALUE
proc
;
/* should be mark */
86
enum
method_optimized_type {
87
OPTIMIZED_METHOD_TYPE_SEND
,
88
OPTIMIZED_METHOD_TYPE_CALL
,
89
90
OPTIMIZED_METHOD_TYPE__MAX
91
}
optimize_type
;
92
struct
rb_method_entry_struct
*
orig_me
;
93
}
body
;
94
int
alias_count
;
95
}
rb_method_definition_t
;
96
97
typedef
struct
rb_method_entry_struct
{
98
rb_method_flag_t
flag
;
99
char
mark
;
100
rb_method_definition_t
*
def
;
101
ID
called_id
;
102
VALUE
klass
;
/* should be mark */
103
}
rb_method_entry_t
;
104
105
struct
unlinked_method_entry_list_entry
{
106
struct
unlinked_method_entry_list_entry
*
next
;
107
rb_method_entry_t
*
me
;
108
};
109
110
#define UNDEFINED_METHOD_ENTRY_P(me) (!(me) || !(me)->def || (me)->def->type == VM_METHOD_TYPE_UNDEF)
111
112
void
rb_add_method_cfunc
(
VALUE
klass,
ID
mid,
VALUE
(*
func
)(ANYARGS),
int
argc
,
rb_method_flag_t
noex);
113
rb_method_entry_t
*
rb_add_method
(
VALUE
klass,
ID
mid,
rb_method_type_t
type
,
void
*option,
rb_method_flag_t
noex);
114
rb_method_entry_t
*
rb_method_entry
(
VALUE
klass,
ID
id
,
VALUE
*define_class_ptr);
115
rb_method_entry_t
*
rb_method_entry_at
(
VALUE
obj,
ID
id
);
116
void
rb_add_refined_method_entry
(
VALUE
refined_class,
ID
mid);
117
rb_method_entry_t
*
rb_resolve_refined_method
(
VALUE
refinements,
118
const
rb_method_entry_t
*
me
,
119
VALUE
*defined_class_ptr);
120
rb_method_entry_t
*
rb_method_entry_with_refinements
(
VALUE
klass,
ID
id
,
121
VALUE
*defined_class_ptr);
122
rb_method_entry_t
*
rb_method_entry_without_refinements
(
VALUE
klass,
ID
id
,
123
VALUE
*defined_class_ptr);
124
125
rb_method_entry_t
*
rb_method_entry_get_without_cache
(
VALUE
klass,
ID
id
,
VALUE
*define_class_ptr);
126
rb_method_entry_t
*
rb_method_entry_set
(
VALUE
klass,
ID
mid,
const
rb_method_entry_t
*,
rb_method_flag_t
noex);
127
128
int
rb_method_entry_arity
(
const
rb_method_entry_t
*
me
);
129
int
rb_method_entry_eq
(
const
rb_method_entry_t
*m1,
const
rb_method_entry_t
*m2);
130
st_index_t
rb_hash_method_entry
(
st_index_t
hash
,
const
rb_method_entry_t
*
me
);
131
132
VALUE
rb_method_entry_location
(
rb_method_entry_t
*
me
);
133
VALUE
rb_mod_method_location
(
VALUE
mod
,
ID
id
);
134
VALUE
rb_obj_method_location
(
VALUE
obj,
ID
id
);
135
136
void
rb_mark_method_entry
(
const
rb_method_entry_t
*
me
);
137
void
rb_free_method_entry
(
rb_method_entry_t
*
me
);
138
void
rb_sweep_method_entry
(
void
*vm);
139
void
rb_free_m_tbl
(
st_table
*tbl);
140
void
rb_free_m_tbl_wrapper
(
struct
method_table_wrapper
*wrapper);
141
142
#endif
/* METHOD_H */
143
Generated on Mon Sep 22 2014 11:05:34 for Ruby by
1.8.2