kanayago 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +15 -0
  3. data/.rubocop_todo.yml +23 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +79 -0
  6. data/Rakefile +182 -0
  7. data/ext/kanayago/ccan/check_type/check_type.h +63 -0
  8. data/ext/kanayago/ccan/container_of/container_of.h +142 -0
  9. data/ext/kanayago/ccan/list/list.h +791 -0
  10. data/ext/kanayago/ccan/str/str.h +17 -0
  11. data/ext/kanayago/constant.h +53 -0
  12. data/ext/kanayago/extconf.rb +21 -0
  13. data/ext/kanayago/id.h +347 -0
  14. data/ext/kanayago/id_table.h +39 -0
  15. data/ext/kanayago/internal/array.h +151 -0
  16. data/ext/kanayago/internal/basic_operators.h +64 -0
  17. data/ext/kanayago/internal/bignum.h +244 -0
  18. data/ext/kanayago/internal/bits.h +568 -0
  19. data/ext/kanayago/internal/compile.h +34 -0
  20. data/ext/kanayago/internal/compilers.h +107 -0
  21. data/ext/kanayago/internal/complex.h +29 -0
  22. data/ext/kanayago/internal/encoding.h +36 -0
  23. data/ext/kanayago/internal/error.h +218 -0
  24. data/ext/kanayago/internal/fixnum.h +184 -0
  25. data/ext/kanayago/internal/gc.h +322 -0
  26. data/ext/kanayago/internal/hash.h +191 -0
  27. data/ext/kanayago/internal/imemo.h +261 -0
  28. data/ext/kanayago/internal/io.h +140 -0
  29. data/ext/kanayago/internal/numeric.h +274 -0
  30. data/ext/kanayago/internal/parse.h +117 -0
  31. data/ext/kanayago/internal/rational.h +71 -0
  32. data/ext/kanayago/internal/re.h +28 -0
  33. data/ext/kanayago/internal/ruby_parser.h +125 -0
  34. data/ext/kanayago/internal/sanitizers.h +297 -0
  35. data/ext/kanayago/internal/serial.h +23 -0
  36. data/ext/kanayago/internal/static_assert.h +16 -0
  37. data/ext/kanayago/internal/string.h +186 -0
  38. data/ext/kanayago/internal/symbol.h +45 -0
  39. data/ext/kanayago/internal/thread.h +79 -0
  40. data/ext/kanayago/internal/variable.h +72 -0
  41. data/ext/kanayago/internal/vm.h +137 -0
  42. data/ext/kanayago/internal/warnings.h +16 -0
  43. data/ext/kanayago/internal.h +108 -0
  44. data/ext/kanayago/kanayago.c +420 -0
  45. data/ext/kanayago/kanayago.h +21 -0
  46. data/ext/kanayago/lex.c +302 -0
  47. data/ext/kanayago/method.h +255 -0
  48. data/ext/kanayago/node.c +440 -0
  49. data/ext/kanayago/node.h +111 -0
  50. data/ext/kanayago/node_name.inc +224 -0
  51. data/ext/kanayago/parse.c +26931 -0
  52. data/ext/kanayago/parse.h +244 -0
  53. data/ext/kanayago/parse.tmp.y +16145 -0
  54. data/ext/kanayago/parser_bits.h +564 -0
  55. data/ext/kanayago/parser_node.h +32 -0
  56. data/ext/kanayago/parser_st.c +164 -0
  57. data/ext/kanayago/parser_st.h +162 -0
  58. data/ext/kanayago/parser_value.h +106 -0
  59. data/ext/kanayago/probes.h +4 -0
  60. data/ext/kanayago/ruby_assert.h +14 -0
  61. data/ext/kanayago/ruby_atomic.h +23 -0
  62. data/ext/kanayago/ruby_parser.c +1165 -0
  63. data/ext/kanayago/rubyparser.h +1391 -0
  64. data/ext/kanayago/shape.h +234 -0
  65. data/ext/kanayago/st.c +2339 -0
  66. data/ext/kanayago/symbol.h +123 -0
  67. data/ext/kanayago/thread_pthread.h +168 -0
  68. data/ext/kanayago/universal_parser.c +230 -0
  69. data/ext/kanayago/vm_core.h +2215 -0
  70. data/ext/kanayago/vm_opts.h +67 -0
  71. data/lib/kanayago/version.rb +5 -0
  72. data/lib/kanayago.rb +11 -0
  73. data/sig/kanayago.rbs +4 -0
  74. metadata +116 -0
@@ -0,0 +1,302 @@
1
+ /* ANSI-C code produced by gperf version 3.1 */
2
+ /* Command-line: gperf -C -L ANSI-C -P -p -j1 -i 1 -g -o -t -N rb_reserved_word -k'1,3,$' defs/keywords */
3
+
4
+ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
5
+ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
6
+ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
7
+ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
8
+ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
9
+ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
10
+ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
11
+ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
12
+ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
13
+ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
14
+ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
15
+ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
16
+ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
17
+ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
18
+ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
19
+ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
20
+ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
21
+ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
22
+ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
23
+ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
24
+ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
25
+ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
26
+ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
27
+ /* The character set is not based on ISO-646. */
28
+ #error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gperf@gnu.org>."
29
+ #endif
30
+
31
+ #line 1 "defs/keywords"
32
+
33
+ struct kwtable {short name, id[2], state;};
34
+ const struct kwtable *rb_reserved_word(const char *, unsigned int);
35
+ #ifndef RIPPER
36
+ static const struct kwtable *reserved_word(register const char *str, register size_t len);
37
+ #define rb_reserved_word(str, len) reserved_word(str, len)
38
+ #line 9 "defs/keywords"
39
+ struct kwtable;
40
+
41
+ #define TOTAL_KEYWORDS 41
42
+ #define MIN_WORD_LENGTH 2
43
+ #define MAX_WORD_LENGTH 12
44
+ #define MIN_HASH_VALUE 8
45
+ #define MAX_HASH_VALUE 50
46
+ /* maximum key range = 43, duplicates = 0 */
47
+
48
+ #ifdef __GNUC__
49
+ __inline
50
+ #else
51
+ #ifdef __cplusplus
52
+ inline
53
+ #endif
54
+ #endif
55
+ static unsigned int
56
+ hash (register const char *str, register size_t len)
57
+ {
58
+ static const unsigned char asso_values[] =
59
+ {
60
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
61
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
62
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
63
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
64
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
65
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
66
+ 51, 51, 51, 26, 51, 51, 14, 51, 16, 8,
67
+ 11, 13, 51, 51, 51, 51, 10, 51, 13, 51,
68
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
69
+ 51, 51, 51, 51, 51, 11, 51, 13, 1, 26,
70
+ 4, 1, 8, 28, 51, 23, 51, 1, 1, 27,
71
+ 5, 19, 21, 51, 8, 3, 3, 11, 51, 21,
72
+ 24, 16, 51, 51, 51, 51, 51, 51, 51, 51,
73
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
74
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
75
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
76
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
77
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
78
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
79
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
80
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
81
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
82
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
83
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
84
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
85
+ 51, 51, 51, 51, 51, 51
86
+ };
87
+ register unsigned int hval = (unsigned int)len;
88
+
89
+ switch (hval)
90
+ {
91
+ default:
92
+ hval += asso_values[(unsigned char)str[2]];
93
+ /*FALLTHROUGH*/
94
+ case 2:
95
+ case 1:
96
+ hval += asso_values[(unsigned char)str[0]];
97
+ break;
98
+ }
99
+ return (unsigned int)hval + asso_values[(unsigned char)str[len - 1]];
100
+ }
101
+
102
+ struct stringpool_t
103
+ {
104
+ char stringpool_str8[sizeof("break")];
105
+ char stringpool_str9[sizeof("else")];
106
+ char stringpool_str10[sizeof("nil")];
107
+ char stringpool_str11[sizeof("ensure")];
108
+ char stringpool_str12[sizeof("end")];
109
+ char stringpool_str13[sizeof("then")];
110
+ char stringpool_str14[sizeof("not")];
111
+ char stringpool_str15[sizeof("false")];
112
+ char stringpool_str16[sizeof("self")];
113
+ char stringpool_str17[sizeof("elsif")];
114
+ char stringpool_str18[sizeof("rescue")];
115
+ char stringpool_str19[sizeof("true")];
116
+ char stringpool_str20[sizeof("until")];
117
+ char stringpool_str21[sizeof("unless")];
118
+ char stringpool_str22[sizeof("return")];
119
+ char stringpool_str23[sizeof("def")];
120
+ char stringpool_str24[sizeof("and")];
121
+ char stringpool_str25[sizeof("do")];
122
+ char stringpool_str26[sizeof("yield")];
123
+ char stringpool_str27[sizeof("for")];
124
+ char stringpool_str28[sizeof("undef")];
125
+ char stringpool_str29[sizeof("or")];
126
+ char stringpool_str30[sizeof("in")];
127
+ char stringpool_str31[sizeof("when")];
128
+ char stringpool_str32[sizeof("retry")];
129
+ char stringpool_str33[sizeof("if")];
130
+ char stringpool_str34[sizeof("case")];
131
+ char stringpool_str35[sizeof("redo")];
132
+ char stringpool_str36[sizeof("next")];
133
+ char stringpool_str37[sizeof("super")];
134
+ char stringpool_str38[sizeof("module")];
135
+ char stringpool_str39[sizeof("begin")];
136
+ char stringpool_str40[sizeof("__LINE__")];
137
+ char stringpool_str41[sizeof("__FILE__")];
138
+ char stringpool_str42[sizeof("__ENCODING__")];
139
+ char stringpool_str43[sizeof("END")];
140
+ char stringpool_str44[sizeof("alias")];
141
+ char stringpool_str45[sizeof("BEGIN")];
142
+ char stringpool_str46[sizeof("defined?")];
143
+ char stringpool_str47[sizeof("class")];
144
+ char stringpool_str50[sizeof("while")];
145
+ };
146
+ static const struct stringpool_t stringpool_contents =
147
+ {
148
+ "break",
149
+ "else",
150
+ "nil",
151
+ "ensure",
152
+ "end",
153
+ "then",
154
+ "not",
155
+ "false",
156
+ "self",
157
+ "elsif",
158
+ "rescue",
159
+ "true",
160
+ "until",
161
+ "unless",
162
+ "return",
163
+ "def",
164
+ "and",
165
+ "do",
166
+ "yield",
167
+ "for",
168
+ "undef",
169
+ "or",
170
+ "in",
171
+ "when",
172
+ "retry",
173
+ "if",
174
+ "case",
175
+ "redo",
176
+ "next",
177
+ "super",
178
+ "module",
179
+ "begin",
180
+ "__LINE__",
181
+ "__FILE__",
182
+ "__ENCODING__",
183
+ "END",
184
+ "alias",
185
+ "BEGIN",
186
+ "defined?",
187
+ "class",
188
+ "while"
189
+ };
190
+ #define stringpool ((const char *) &stringpool_contents)
191
+ const struct kwtable *
192
+ rb_reserved_word (register const char *str, register size_t len)
193
+ {
194
+ static const struct kwtable wordlist[] =
195
+ {
196
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
197
+ #line 19 "defs/keywords"
198
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str8, {keyword_break, keyword_break}, EXPR_MID},
199
+ #line 25 "defs/keywords"
200
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str9, {keyword_else, keyword_else}, EXPR_BEG},
201
+ #line 35 "defs/keywords"
202
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str10, {keyword_nil, keyword_nil}, EXPR_END},
203
+ #line 28 "defs/keywords"
204
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str11, {keyword_ensure, keyword_ensure}, EXPR_BEG},
205
+ #line 27 "defs/keywords"
206
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str12, {keyword_end, keyword_end}, EXPR_END},
207
+ #line 44 "defs/keywords"
208
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str13, {keyword_then, keyword_then}, EXPR_BEG},
209
+ #line 36 "defs/keywords"
210
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str14, {keyword_not, keyword_not}, EXPR_ARG},
211
+ #line 29 "defs/keywords"
212
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str15, {keyword_false, keyword_false}, EXPR_END},
213
+ #line 42 "defs/keywords"
214
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str16, {keyword_self, keyword_self}, EXPR_END},
215
+ #line 26 "defs/keywords"
216
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str17, {keyword_elsif, keyword_elsif}, EXPR_VALUE},
217
+ #line 39 "defs/keywords"
218
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str18, {keyword_rescue, modifier_rescue}, EXPR_MID},
219
+ #line 45 "defs/keywords"
220
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str19, {keyword_true, keyword_true}, EXPR_END},
221
+ #line 48 "defs/keywords"
222
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str20, {keyword_until, modifier_until}, EXPR_VALUE},
223
+ #line 47 "defs/keywords"
224
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str21, {keyword_unless, modifier_unless}, EXPR_VALUE},
225
+ #line 41 "defs/keywords"
226
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str22, {keyword_return, keyword_return}, EXPR_MID},
227
+ #line 22 "defs/keywords"
228
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str23, {keyword_def, keyword_def}, EXPR_FNAME},
229
+ #line 17 "defs/keywords"
230
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str24, {keyword_and, keyword_and}, EXPR_VALUE},
231
+ #line 24 "defs/keywords"
232
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str25, {keyword_do, keyword_do}, EXPR_BEG},
233
+ #line 51 "defs/keywords"
234
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str26, {keyword_yield, keyword_yield}, EXPR_ARG},
235
+ #line 30 "defs/keywords"
236
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str27, {keyword_for, keyword_for}, EXPR_VALUE},
237
+ #line 46 "defs/keywords"
238
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str28, {keyword_undef, keyword_undef}, EXPR_FNAME|EXPR_FITEM},
239
+ #line 37 "defs/keywords"
240
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str29, {keyword_or, keyword_or}, EXPR_VALUE},
241
+ #line 32 "defs/keywords"
242
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str30, {keyword_in, keyword_in}, EXPR_VALUE},
243
+ #line 49 "defs/keywords"
244
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str31, {keyword_when, keyword_when}, EXPR_VALUE},
245
+ #line 40 "defs/keywords"
246
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str32, {keyword_retry, keyword_retry}, EXPR_END},
247
+ #line 31 "defs/keywords"
248
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str33, {keyword_if, modifier_if}, EXPR_VALUE},
249
+ #line 20 "defs/keywords"
250
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str34, {keyword_case, keyword_case}, EXPR_VALUE},
251
+ #line 38 "defs/keywords"
252
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str35, {keyword_redo, keyword_redo}, EXPR_END},
253
+ #line 34 "defs/keywords"
254
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str36, {keyword_next, keyword_next}, EXPR_MID},
255
+ #line 43 "defs/keywords"
256
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str37, {keyword_super, keyword_super}, EXPR_ARG},
257
+ #line 33 "defs/keywords"
258
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str38, {keyword_module, keyword_module}, EXPR_VALUE},
259
+ #line 18 "defs/keywords"
260
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str39, {keyword_begin, keyword_begin}, EXPR_BEG},
261
+ #line 12 "defs/keywords"
262
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str40, {keyword__LINE__, keyword__LINE__}, EXPR_END},
263
+ #line 13 "defs/keywords"
264
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str41, {keyword__FILE__, keyword__FILE__}, EXPR_END},
265
+ #line 11 "defs/keywords"
266
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str42, {keyword__ENCODING__, keyword__ENCODING__}, EXPR_END},
267
+ #line 15 "defs/keywords"
268
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str43, {keyword_END, keyword_END}, EXPR_END},
269
+ #line 16 "defs/keywords"
270
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str44, {keyword_alias, keyword_alias}, EXPR_FNAME|EXPR_FITEM},
271
+ #line 14 "defs/keywords"
272
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str45, {keyword_BEGIN, keyword_BEGIN}, EXPR_END},
273
+ #line 23 "defs/keywords"
274
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str46, {keyword_defined, keyword_defined}, EXPR_ARG},
275
+ #line 21 "defs/keywords"
276
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str47, {keyword_class, keyword_class}, EXPR_CLASS},
277
+ {-1}, {-1},
278
+ #line 50 "defs/keywords"
279
+ {(int)(size_t)&((struct stringpool_t *)0)->stringpool_str50, {keyword_while, modifier_while}, EXPR_VALUE}
280
+ };
281
+
282
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
283
+ {
284
+ register unsigned int key = hash (str, len);
285
+
286
+ if (key <= MAX_HASH_VALUE)
287
+ {
288
+ register int o = wordlist[key].name;
289
+ if (o >= 0)
290
+ {
291
+ register const char *s = o + stringpool;
292
+
293
+ if (*str == *s && !strcmp (str + 1, s + 1))
294
+ return &wordlist[key];
295
+ }
296
+ }
297
+ }
298
+ return 0;
299
+ }
300
+ #line 52 "defs/keywords"
301
+
302
+ #endif
@@ -0,0 +1,255 @@
1
+ #ifndef RUBY_METHOD_H
2
+ #define RUBY_METHOD_H 1
3
+ /**********************************************************************
4
+
5
+ method.h -
6
+
7
+ $Author$
8
+ created at: Wed Jul 15 20:02:33 2009
9
+
10
+ Copyright (C) 2009 Koichi Sasada
11
+
12
+ **********************************************************************/
13
+
14
+ #include "internal.h"
15
+ #include "internal/imemo.h"
16
+ #include "internal/compilers.h"
17
+ #include "internal/static_assert.h"
18
+
19
+ #ifndef END_OF_ENUMERATION
20
+ # if defined(__GNUC__) &&! defined(__STRICT_ANSI__)
21
+ # define END_OF_ENUMERATION(key)
22
+ # else
23
+ # define END_OF_ENUMERATION(key) END_OF_##key##_PLACEHOLDER = 0
24
+ # endif
25
+ #endif
26
+
27
+ /* cref */
28
+
29
+ typedef enum {
30
+ METHOD_VISI_UNDEF = 0x00,
31
+ METHOD_VISI_PUBLIC = 0x01,
32
+ METHOD_VISI_PRIVATE = 0x02,
33
+ METHOD_VISI_PROTECTED = 0x03,
34
+
35
+ METHOD_VISI_MASK = 0x03
36
+ } rb_method_visibility_t;
37
+
38
+ typedef struct rb_scope_visi_struct {
39
+ BITFIELD(rb_method_visibility_t, method_visi, 3);
40
+ unsigned int module_func : 1;
41
+ } rb_scope_visibility_t;
42
+
43
+ /*! CREF (Class REFerence) */
44
+ typedef struct rb_cref_struct {
45
+ VALUE flags;
46
+ VALUE refinements;
47
+ VALUE klass_or_self;
48
+ struct rb_cref_struct * next;
49
+ const rb_scope_visibility_t scope_visi;
50
+ } rb_cref_t;
51
+
52
+ /* method data type */
53
+
54
+ typedef struct rb_method_entry_struct {
55
+ VALUE flags;
56
+ VALUE defined_class;
57
+ struct rb_method_definition_struct * const def;
58
+ ID called_id;
59
+ VALUE owner;
60
+ } rb_method_entry_t;
61
+
62
+ typedef struct rb_callable_method_entry_struct { /* same fields with rb_method_entry_t */
63
+ VALUE flags;
64
+ const VALUE defined_class;
65
+ struct rb_method_definition_struct * const def;
66
+ ID called_id;
67
+ const VALUE owner;
68
+ } rb_callable_method_entry_t;
69
+
70
+ #define METHOD_ENTRY_VISI(me) (rb_method_visibility_t)(((me)->flags & (IMEMO_FL_USER0 | IMEMO_FL_USER1)) >> (IMEMO_FL_USHIFT+0))
71
+ #define METHOD_ENTRY_BASIC(me) (int) (((me)->flags & (IMEMO_FL_USER2 )) >> (IMEMO_FL_USHIFT+2))
72
+ #define METHOD_ENTRY_COMPLEMENTED(me) ((me)->flags & IMEMO_FL_USER3)
73
+ #define METHOD_ENTRY_COMPLEMENTED_SET(me) ((me)->flags |= IMEMO_FL_USER3)
74
+ #define METHOD_ENTRY_CACHED(me) ((me)->flags & IMEMO_FL_USER4)
75
+ #define METHOD_ENTRY_CACHED_SET(me) ((me)->flags |= IMEMO_FL_USER4)
76
+ #define METHOD_ENTRY_INVALIDATED(me) ((me)->flags & IMEMO_FL_USER5)
77
+ #define METHOD_ENTRY_INVALIDATED_SET(me) ((me)->flags |= IMEMO_FL_USER5)
78
+
79
+ static inline void
80
+ METHOD_ENTRY_VISI_SET(rb_method_entry_t *me, rb_method_visibility_t visi)
81
+ {
82
+ VM_ASSERT((int)visi >= 0 && visi <= 3);
83
+ me->flags = (me->flags & ~(IMEMO_FL_USER0 | IMEMO_FL_USER1)) | (visi << (IMEMO_FL_USHIFT+0));
84
+ }
85
+ static inline void
86
+ METHOD_ENTRY_BASIC_SET(rb_method_entry_t *me, unsigned int basic)
87
+ {
88
+ VM_ASSERT(basic <= 1);
89
+ me->flags = (me->flags & ~(IMEMO_FL_USER2 )) | (basic << (IMEMO_FL_USHIFT+2));
90
+ }
91
+ static inline void
92
+ METHOD_ENTRY_FLAGS_SET(rb_method_entry_t *me, rb_method_visibility_t visi, unsigned int basic)
93
+ {
94
+ VM_ASSERT((int)visi >= 0 && visi <= 3);
95
+ VM_ASSERT(basic <= 1);
96
+ me->flags =
97
+ (me->flags & ~(IMEMO_FL_USER0|IMEMO_FL_USER1|IMEMO_FL_USER2)) |
98
+ ((visi << (IMEMO_FL_USHIFT+0)) | (basic << (IMEMO_FL_USHIFT+2)));
99
+ }
100
+ static inline void
101
+ METHOD_ENTRY_FLAGS_COPY(rb_method_entry_t *dst, const rb_method_entry_t *src)
102
+ {
103
+ dst->flags =
104
+ (dst->flags & ~(IMEMO_FL_USER0|IMEMO_FL_USER1|IMEMO_FL_USER2
105
+ |IMEMO_FL_USER3)) |
106
+ (src->flags & (IMEMO_FL_USER0|IMEMO_FL_USER1|IMEMO_FL_USER2|IMEMO_FL_USER3));
107
+ }
108
+
109
+ typedef enum {
110
+ VM_METHOD_TYPE_ISEQ, /*!< Ruby method */
111
+ VM_METHOD_TYPE_CFUNC, /*!< C method */
112
+ VM_METHOD_TYPE_ATTRSET, /*!< attr_writer or attr_accessor */
113
+ VM_METHOD_TYPE_IVAR, /*!< attr_reader or attr_accessor */
114
+ VM_METHOD_TYPE_BMETHOD,
115
+ VM_METHOD_TYPE_ZSUPER,
116
+ VM_METHOD_TYPE_ALIAS,
117
+ VM_METHOD_TYPE_UNDEF,
118
+ VM_METHOD_TYPE_NOTIMPLEMENTED,
119
+ VM_METHOD_TYPE_OPTIMIZED, /*!< Kernel#send, Proc#call, etc */
120
+ VM_METHOD_TYPE_MISSING, /*!< wrapper for method_missing(id) */
121
+ VM_METHOD_TYPE_REFINED, /*!< refinement */
122
+
123
+ END_OF_ENUMERATION(VM_METHOD_TYPE)
124
+ } rb_method_type_t;
125
+ #define VM_METHOD_TYPE_MINIMUM_BITS 4
126
+ STATIC_ASSERT(VM_METHOD_TYPE_MINIMUM_BITS,
127
+ VM_METHOD_TYPE_REFINED <= (1<<VM_METHOD_TYPE_MINIMUM_BITS));
128
+
129
+ #ifndef rb_iseq_t
130
+ typedef struct rb_iseq_struct rb_iseq_t;
131
+ #define rb_iseq_t rb_iseq_t
132
+ #endif
133
+
134
+ typedef struct rb_method_iseq_struct {
135
+ const rb_iseq_t * iseqptr; /*!< iseq pointer, should be separated from iseqval */
136
+ rb_cref_t * cref; /*!< class reference, should be marked */
137
+ } rb_method_iseq_t; /* check rb_add_method_iseq() when modify the fields */
138
+
139
+ typedef VALUE (*rb_cfunc_t)(ANYARGS);
140
+ typedef struct rb_method_cfunc_struct {
141
+ rb_cfunc_t func;
142
+ VALUE (*invoker)(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS));
143
+ int argc;
144
+ } rb_method_cfunc_t;
145
+
146
+ typedef struct rb_method_attr_struct {
147
+ ID id;
148
+ VALUE location; /* should be marked */
149
+ } rb_method_attr_t;
150
+
151
+ typedef struct rb_method_alias_struct {
152
+ struct rb_method_entry_struct * original_me; /* original_me->klass is original owner */
153
+ } rb_method_alias_t;
154
+
155
+ typedef struct rb_method_refined_struct {
156
+ struct rb_method_entry_struct * orig_me;
157
+ } rb_method_refined_t;
158
+
159
+ typedef struct rb_method_bmethod_struct {
160
+ VALUE proc; /* should be marked */
161
+ struct rb_hook_list_struct *hooks;
162
+ VALUE defined_ractor;
163
+ } rb_method_bmethod_t;
164
+
165
+ enum method_optimized_type {
166
+ OPTIMIZED_METHOD_TYPE_SEND,
167
+ OPTIMIZED_METHOD_TYPE_CALL,
168
+ OPTIMIZED_METHOD_TYPE_BLOCK_CALL,
169
+ OPTIMIZED_METHOD_TYPE_STRUCT_AREF,
170
+ OPTIMIZED_METHOD_TYPE_STRUCT_ASET,
171
+ OPTIMIZED_METHOD_TYPE__MAX
172
+ };
173
+
174
+ typedef struct rb_method_optimized {
175
+ enum method_optimized_type type;
176
+ unsigned int index;
177
+ } rb_method_optimized_t;
178
+
179
+ struct rb_method_definition_struct {
180
+ BITFIELD(rb_method_type_t, type, VM_METHOD_TYPE_MINIMUM_BITS);
181
+ unsigned int iseq_overload: 1;
182
+ unsigned int no_redef_warning: 1;
183
+ unsigned int aliased : 1;
184
+ int reference_count : 28;
185
+
186
+ union {
187
+ rb_method_iseq_t iseq;
188
+ rb_method_cfunc_t cfunc;
189
+ rb_method_attr_t attr;
190
+ rb_method_alias_t alias;
191
+ rb_method_refined_t refined;
192
+ rb_method_bmethod_t bmethod;
193
+ rb_method_optimized_t optimized;
194
+ } body;
195
+
196
+ ID original_id;
197
+ uintptr_t method_serial;
198
+ };
199
+
200
+ struct rb_id_table;
201
+
202
+ typedef struct rb_method_definition_struct rb_method_definition_t;
203
+ STATIC_ASSERT(sizeof_method_def, offsetof(rb_method_definition_t, body) <= 8);
204
+
205
+ #define UNDEFINED_METHOD_ENTRY_P(me) (!(me) || !(me)->def || (me)->def->type == VM_METHOD_TYPE_UNDEF)
206
+ #define UNDEFINED_REFINED_METHOD_P(def) \
207
+ ((def)->type == VM_METHOD_TYPE_REFINED && \
208
+ UNDEFINED_METHOD_ENTRY_P((def)->body.refined.orig_me))
209
+
210
+ void rb_add_method(VALUE klass, ID mid, rb_method_type_t type, void *option, rb_method_visibility_t visi);
211
+ void rb_add_method_cfunc(VALUE klass, ID mid, VALUE (*func)(ANYARGS), int argc, rb_method_visibility_t visi);
212
+ void rb_add_method_iseq(VALUE klass, ID mid, const rb_iseq_t *iseq, rb_cref_t *cref, rb_method_visibility_t visi);
213
+ void rb_add_method_optimized(VALUE klass, ID mid, enum method_optimized_type, unsigned int index, rb_method_visibility_t visi);
214
+ void rb_add_refined_method_entry(VALUE refined_class, ID mid);
215
+
216
+ rb_method_entry_t *rb_method_entry_set(VALUE klass, ID mid, const rb_method_entry_t *, rb_method_visibility_t noex);
217
+ rb_method_entry_t *rb_method_entry_create(ID called_id, VALUE klass, rb_method_visibility_t visi, rb_method_definition_t *def);
218
+
219
+ const rb_method_entry_t *rb_method_entry_at(VALUE obj, ID id);
220
+
221
+ const rb_method_entry_t *rb_method_entry(VALUE klass, ID id);
222
+ const rb_method_entry_t *rb_method_entry_with_refinements(VALUE klass, ID id, VALUE *defined_class);
223
+ const rb_method_entry_t *rb_method_entry_without_refinements(VALUE klass, ID id, VALUE *defined_class);
224
+ const rb_method_entry_t *rb_resolve_refined_method(VALUE refinements, const rb_method_entry_t *me);
225
+ RUBY_SYMBOL_EXPORT_BEGIN
226
+ const rb_method_entry_t *rb_resolve_me_location(const rb_method_entry_t *, VALUE[5]);
227
+ RUBY_SYMBOL_EXPORT_END
228
+
229
+ const rb_callable_method_entry_t *rb_callable_method_entry(VALUE klass, ID id);
230
+ const rb_callable_method_entry_t *rb_callable_method_entry_or_negative(VALUE klass, ID id);
231
+ const rb_callable_method_entry_t *rb_callable_method_entry_with_refinements(VALUE klass, ID id, VALUE *defined_class);
232
+ const rb_callable_method_entry_t *rb_callable_method_entry_without_refinements(VALUE klass, ID id, VALUE *defined_class);
233
+
234
+ int rb_method_entry_arity(const rb_method_entry_t *me);
235
+ int rb_method_entry_eq(const rb_method_entry_t *m1, const rb_method_entry_t *m2);
236
+ st_index_t rb_hash_method_entry(st_index_t hash, const rb_method_entry_t *me);
237
+
238
+ VALUE rb_method_entry_location(const rb_method_entry_t *me);
239
+
240
+ void rb_free_method_entry(const rb_method_entry_t *me);
241
+
242
+ const rb_method_entry_t *rb_method_entry_clone(const rb_method_entry_t *me);
243
+ 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);
244
+ void rb_method_entry_copy(rb_method_entry_t *dst, const rb_method_entry_t *src);
245
+
246
+ void rb_method_table_insert(VALUE klass, struct rb_id_table *table, ID method_id, const rb_method_entry_t *me);
247
+
248
+ void rb_scope_visibility_set(rb_method_visibility_t);
249
+
250
+ VALUE rb_unnamed_parameters(int arity);
251
+
252
+ void rb_clear_method_cache(VALUE klass_or_module, ID mid);
253
+ void rb_clear_all_refinement_method_cache(void);
254
+
255
+ #endif /* RUBY_METHOD_H */