ruby-internal 0.7.2 → 0.7.3
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/ruby-internal-node-dump +1 -1
- data/bin/ruby-internal-obfuscate +1 -1
- data/ext/internal/method/extconf.rb +4 -0
- data/ext/internal/method/internal_method.h +65 -0
- data/ext/internal/method/{method.h.rpp → internal_method.h.rpp} +21 -0
- data/ext/internal/method/method.c +69 -13
- data/ext/internal/module/classpath.c +12 -14
- data/ext/internal/module/extconf.rb +3 -2
- data/ext/internal/module/module.c +36 -15
- data/ext/internal/node/block.h.rpp +1 -0
- data/ext/internal/node/extconf.rb +0 -22
- data/ext/internal/node/global_entry.h +45 -3
- data/ext/internal/node/global_entry.h.rpp +12 -3
- data/ext/internal/node/node.c +42 -15
- data/ext/internal/node/node_type_descrip.c +16 -20
- data/ext/internal/node/node_type_descrip.c.rpp +1 -0
- data/ext/internal/node/nodeinfo.c +133 -281
- data/ext/internal/node/nodeinfo.c.rpp +8 -4
- data/ext/internal/node/nodeinfo.h.rpp +2 -1
- data/ext/internal/noex/noex.c +4 -0
- data/ext/internal/proc/proc.c +2 -2
- data/ext/internal/vm/constants/constants.c +2 -0
- data/ext/internal/vm/constants/extconf.rb +2 -0
- data/ext/internal/vm/control_frame/control_frame.c +21 -3
- data/ext/internal/vm/control_frame/extconf.rb +4 -0
- data/ext/internal/vm/inline_cache/inline_cache.c +12 -5
- data/ext/internal/vm/instruction/insns_info.c +141 -64
- data/ext/internal/vm/instruction/insns_info.c.rpp +3 -0
- data/ext/internal/vm/instruction/insns_info.h +80 -71
- data/ext/internal/vm/iseq/iseq.c +6 -6
- data/ext/internal/vm/iseq/iseq_load.inc.rpp +6 -3
- data/ext/mkmf-ruby-internal.rb +21 -1
- data/ext/ruby_source_dir.rb +6 -2
- data/post-setup.rb +1 -0
- data/pre-config.rb +9 -0
- data/run_tests.rb +1 -0
- data/test/test_method.rb +1 -1
- data/test/test_module.rb +1 -1
- metadata +309 -321
- data/ext/internal/method/method.h +0 -20
- data/ext/internal/yarv-headers/debug.h +0 -36
- data/ext/internal/yarv-headers/dln.h +0 -41
- data/ext/internal/yarv-headers/encdb.h +0 -147
- data/ext/internal/yarv-headers/eval_intern.h +0 -215
- data/ext/internal/yarv-headers/gc.h +0 -75
- data/ext/internal/yarv-headers/id.h +0 -163
- data/ext/internal/yarv-headers/iseq.h +0 -103
- data/ext/internal/yarv-headers/node.h +0 -516
- data/ext/internal/yarv-headers/parse.h +0 -188
- data/ext/internal/yarv-headers/regenc.h +0 -207
- data/ext/internal/yarv-headers/regint.h +0 -842
- data/ext/internal/yarv-headers/regparse.h +0 -351
- data/ext/internal/yarv-headers/revision.h +0 -1
- data/ext/internal/yarv-headers/thread_pthread.h +0 -24
- data/ext/internal/yarv-headers/thread_win32.h +0 -33
- data/ext/internal/yarv-headers/transcode_data.h +0 -106
- data/ext/internal/yarv-headers/transdb.h +0 -147
- data/ext/internal/yarv-headers/version.h +0 -54
- data/ext/internal/yarv-headers/vm_core.h +0 -646
- data/ext/internal/yarv-headers/vm_exec.h +0 -184
- data/ext/internal/yarv-headers/vm_insnhelper.h +0 -195
- data/ext/internal/yarv-headers/vm_opts.h +0 -51
- data/ext/rubypp.rb +0 -97
data/bin/ruby-internal-node-dump
CHANGED
data/bin/ruby-internal-obfuscate
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
$: << '../..'
|
2
2
|
require 'mkmf-ruby-internal'
|
3
3
|
|
4
|
+
ruby_version_code = RUBY_VERSION.gsub(/\./, '').to_i
|
5
|
+
$CPPFLAGS << " -DRUBY_VERSION_CODE=#{ruby_version_code}"
|
6
|
+
|
4
7
|
have_var('rb_cMethod', 'ruby.h')
|
5
8
|
have_var('rb_cUnboundMethod', 'ruby.h')
|
6
9
|
have_header('ruby/node.h') or have_header('node.h')
|
10
|
+
have_type('struct RTypedData')
|
7
11
|
|
8
12
|
create_ruby_internal_makefile 'internal/method/method'
|
@@ -0,0 +1,65 @@
|
|
1
|
+
#ifndef ruby_internal_method__h_
|
2
|
+
#define ruby_internal_method__h_
|
3
|
+
|
4
|
+
#include <ruby.h>
|
5
|
+
|
6
|
+
#ifdef RUBY_VM
|
7
|
+
#include "method.h"
|
8
|
+
#endif
|
9
|
+
|
10
|
+
#include "internal/node/ruby_internal_node.h"
|
11
|
+
|
12
|
+
#ifndef FALSE
|
13
|
+
#define FALSE 0
|
14
|
+
#endif
|
15
|
+
|
16
|
+
#ifndef TRUE
|
17
|
+
#define TRUE (!FALSE)
|
18
|
+
#endif
|
19
|
+
|
20
|
+
struct METHOD {
|
21
|
+
VALUE recv;
|
22
|
+
VALUE rclass;
|
23
|
+
ID id;
|
24
|
+
rb_method_entry_t me;
|
25
|
+
};
|
26
|
+
|
27
|
+
static void
|
28
|
+
bm_mark(void *ptr)
|
29
|
+
{
|
30
|
+
struct METHOD *data = ptr;
|
31
|
+
rb_gc_mark(data->rclass);
|
32
|
+
rb_gc_mark(data->recv);
|
33
|
+
rb_mark_method_entry(&data->me);
|
34
|
+
}
|
35
|
+
|
36
|
+
static void
|
37
|
+
bm_free(void *ptr)
|
38
|
+
{
|
39
|
+
struct METHOD *data = ptr;
|
40
|
+
rb_method_definition_t *def = data->me.def;
|
41
|
+
if (def->alias_count == 0)
|
42
|
+
xfree(def);
|
43
|
+
else if (def->alias_count > 0)
|
44
|
+
def->alias_count--;
|
45
|
+
xfree(ptr);
|
46
|
+
}
|
47
|
+
|
48
|
+
static size_t
|
49
|
+
bm_memsize(const void *ptr)
|
50
|
+
{
|
51
|
+
return ptr ? sizeof(struct METHOD) : 0;
|
52
|
+
}
|
53
|
+
|
54
|
+
static const rb_data_type_t method_data_type = {
|
55
|
+
"method",
|
56
|
+
bm_mark,
|
57
|
+
bm_free,
|
58
|
+
bm_memsize,
|
59
|
+
};
|
60
|
+
|
61
|
+
#define METHOD_OCLASS(m) m->klass
|
62
|
+
#define METHOD_RCLASS(m) m->rclass
|
63
|
+
|
64
|
+
#endif
|
65
|
+
|
@@ -3,8 +3,20 @@
|
|
3
3
|
|
4
4
|
#include <ruby.h>
|
5
5
|
|
6
|
+
#ifdef RUBY_VM
|
7
|
+
#include "method.h"
|
8
|
+
#endif
|
9
|
+
|
6
10
|
#include "internal/node/ruby_internal_node.h"
|
7
11
|
|
12
|
+
#ifndef FALSE
|
13
|
+
#define FALSE 0
|
14
|
+
#endif
|
15
|
+
|
16
|
+
#ifndef TRUE
|
17
|
+
#define TRUE (!FALSE)
|
18
|
+
#endif
|
19
|
+
|
8
20
|
#ruby <<END
|
9
21
|
$: << '../..'
|
10
22
|
require 'ruby_source_dir'
|
@@ -20,11 +32,19 @@
|
|
20
32
|
File.open(file) do |eval_c|
|
21
33
|
write = false
|
22
34
|
stopwrite = false
|
35
|
+
prev_line = nil
|
23
36
|
while (line = eval_c.gets) != nil do
|
24
37
|
case line
|
25
38
|
when /^struct (METHOD)/
|
26
39
|
write = true
|
27
40
|
stopwrite = false
|
41
|
+
when /rb_data_type_t method_data_type = {/
|
42
|
+
write = true
|
43
|
+
stopwrite = false
|
44
|
+
when /^(bm_mark|bm_free|bm_memsize)/
|
45
|
+
puts prev_line
|
46
|
+
write = true
|
47
|
+
stopwrite = false
|
28
48
|
when /^\}/
|
29
49
|
stopwrite = true
|
30
50
|
when /VALUE oclass/
|
@@ -42,6 +62,7 @@
|
|
42
62
|
write = false
|
43
63
|
puts ''
|
44
64
|
end
|
65
|
+
prev_line = line
|
45
66
|
end
|
46
67
|
end
|
47
68
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#include <ruby.h>
|
2
2
|
#include "internal/node/ruby_internal_node.h"
|
3
|
-
#include "
|
3
|
+
#include "internal_method.h"
|
4
4
|
|
5
5
|
#ifdef RUBY_VM
|
6
6
|
#include "vm_core.h"
|
@@ -22,6 +22,14 @@ static VALUE rb_cUnboundMethod = Qnil;
|
|
22
22
|
#define RARRAY_PTR(a) RARRAY(a)->ptr
|
23
23
|
#endif
|
24
24
|
|
25
|
+
#ifdef HAVE_TYPE_STRUCT_RTYPEDDATA
|
26
|
+
# define UNWRAP_METHOD(method, m) \
|
27
|
+
TypedData_Get_Struct(method, struct METHOD, &method_data_type, m);
|
28
|
+
#else
|
29
|
+
# define UNWRAP_METHOD(method, m) \
|
30
|
+
Data_Get_Struct(method, struct METHOD, m)
|
31
|
+
#endif
|
32
|
+
|
25
33
|
static VALUE rb_mMarshal;
|
26
34
|
|
27
35
|
static VALUE marshal_dump(VALUE obj, VALUE limit)
|
@@ -58,7 +66,7 @@ static VALUE lookup_module_proc = Qnil;
|
|
58
66
|
static VALUE method_receiver(VALUE method)
|
59
67
|
{
|
60
68
|
struct METHOD * m;
|
61
|
-
|
69
|
+
UNWRAP_METHOD(method, m);
|
62
70
|
return m->recv;
|
63
71
|
}
|
64
72
|
|
@@ -74,7 +82,7 @@ static VALUE method_receiver(VALUE method)
|
|
74
82
|
static VALUE method_id(VALUE method)
|
75
83
|
{
|
76
84
|
struct METHOD * m;
|
77
|
-
|
85
|
+
UNWRAP_METHOD(method, m);
|
78
86
|
return ID2SYM(m->id);
|
79
87
|
}
|
80
88
|
|
@@ -90,8 +98,14 @@ static VALUE method_id(VALUE method)
|
|
90
98
|
static VALUE method_oid(VALUE method)
|
91
99
|
{
|
92
100
|
struct METHOD * m;
|
93
|
-
|
101
|
+
UNWRAP_METHOD(method, m);
|
102
|
+
#if RUBY_VERSION_CODE >= 193
|
103
|
+
return ID2SYM(m->me->def->original_id);
|
104
|
+
#elif RUBY_VERSION_CODE >= 192
|
105
|
+
return ID2SYM(m->me.def->original_id);
|
106
|
+
#else
|
94
107
|
return ID2SYM(m->oid);
|
108
|
+
#endif
|
95
109
|
}
|
96
110
|
|
97
111
|
/*
|
@@ -106,8 +120,14 @@ static VALUE method_oid(VALUE method)
|
|
106
120
|
static VALUE method_origin_class(VALUE method)
|
107
121
|
{
|
108
122
|
struct METHOD * m;
|
109
|
-
|
123
|
+
UNWRAP_METHOD(method, m);
|
124
|
+
#if RUBY_VERSION_CODE >= 193
|
125
|
+
return m->me->klass;
|
126
|
+
#elif RUBY_VERSION_CODE >= 192
|
127
|
+
return m->me.klass;
|
128
|
+
#else
|
110
129
|
return METHOD_OCLASS(m);
|
130
|
+
#endif
|
111
131
|
}
|
112
132
|
|
113
133
|
/*
|
@@ -119,7 +139,7 @@ static VALUE method_origin_class(VALUE method)
|
|
119
139
|
static VALUE method_attached_class(VALUE method)
|
120
140
|
{
|
121
141
|
struct METHOD * m;
|
122
|
-
|
142
|
+
UNWRAP_METHOD(method, m);
|
123
143
|
return CLASS_OF(m->recv);
|
124
144
|
}
|
125
145
|
|
@@ -139,8 +159,14 @@ static VALUE method_body(VALUE method)
|
|
139
159
|
/* no access to potentially sensitive data from the sandbox */
|
140
160
|
rb_raise(rb_eSecurityError, "Insecure: can't get method body");
|
141
161
|
}
|
142
|
-
|
162
|
+
UNWRAP_METHOD(method, m);
|
163
|
+
#if RUBY_VERSION_CODE >= 193
|
164
|
+
return m->me->def->body.iseq->self; /* TODO: body is a union; is this right? */
|
165
|
+
#elif RUBY_VERSION_CODE >= 192
|
166
|
+
return m->me.def->body.iseq->self; /* TODO: body is a union; is this right? */
|
167
|
+
#else
|
143
168
|
return wrap_node(m->body);
|
169
|
+
#endif
|
144
170
|
}
|
145
171
|
|
146
172
|
/*
|
@@ -165,9 +191,17 @@ static VALUE method_dump(VALUE self, VALUE limit)
|
|
165
191
|
}
|
166
192
|
|
167
193
|
arr = rb_ary_new();
|
168
|
-
|
194
|
+
UNWRAP_METHOD(self, method);
|
195
|
+
#if RUBY_VERSION_CODE >= 193
|
196
|
+
rb_ary_push(arr, rb_mod_name(method->me->klass));
|
197
|
+
rb_ary_push(arr, Qnil); /* TODO */
|
198
|
+
#elif RUBY_VERSION_CODE >= 192
|
199
|
+
rb_ary_push(arr, rb_mod_name(method->me.klass));
|
200
|
+
rb_ary_push(arr, Qnil); /* TODO */
|
201
|
+
#else
|
169
202
|
rb_ary_push(arr, rb_mod_name(METHOD_OCLASS(method)));
|
170
203
|
rb_ary_push(arr, rb_mod_name(METHOD_RCLASS(method)));
|
204
|
+
#endif
|
171
205
|
if(rb_class_of(self) == rb_cUnboundMethod)
|
172
206
|
{
|
173
207
|
rb_ary_push(arr, Qnil);
|
@@ -177,7 +211,13 @@ static VALUE method_dump(VALUE self, VALUE limit)
|
|
177
211
|
rb_ary_push(arr, method->recv);
|
178
212
|
}
|
179
213
|
rb_ary_push(arr, ID2SYM(method->id));
|
214
|
+
#if RUBY_VERSION_CODE >= 193
|
215
|
+
rb_ary_push(arr, ID2SYM(method->me->def->original_id));
|
216
|
+
#elif RUBY_VERSION_CODE >= 192
|
217
|
+
rb_ary_push(arr, ID2SYM(method->me.def->original_id));
|
218
|
+
#else
|
180
219
|
rb_ary_push(arr, ID2SYM(method->oid));
|
220
|
+
#endif
|
181
221
|
rb_ary_push(arr, method_body(self));
|
182
222
|
|
183
223
|
return marshal_dump(arr, limit);
|
@@ -194,7 +234,6 @@ static VALUE method_load(VALUE klass, VALUE str)
|
|
194
234
|
struct METHOD * method;
|
195
235
|
VALUE rarr = marshal_load(str);
|
196
236
|
VALUE * arr;
|
197
|
-
NODE * n;
|
198
237
|
VALUE retval;
|
199
238
|
|
200
239
|
if( rb_safe_level() >= 4
|
@@ -213,17 +252,32 @@ static VALUE method_load(VALUE klass, VALUE str)
|
|
213
252
|
/* Create a METHOD object -- doesn't matter which method we use */
|
214
253
|
retval = rb_funcall(
|
215
254
|
rb_cObject, rb_intern("method"), 1, ID2SYM(rb_intern("__id__")));
|
216
|
-
|
255
|
+
UNWRAP_METHOD(retval, method);
|
217
256
|
arr = RARRAY_PTR(rarr);
|
257
|
+
#if RUBY_VERSION_CODE >= 193
|
258
|
+
method->me->klass =
|
259
|
+
rb_funcall(lookup_module_proc, rb_intern("call"), 1, arr[0]);
|
260
|
+
method->me->def->original_id = SYM2ID(arr[4]);
|
261
|
+
GetISeqPtr(arr[5], method->me->def->body.iseq);
|
262
|
+
#elif RUBY_VERSION_CODE >= 192
|
263
|
+
method->me.klass =
|
264
|
+
rb_funcall(lookup_module_proc, rb_intern("call"), 1, arr[0]);
|
265
|
+
method->me.def->original_id = SYM2ID(arr[4]);
|
266
|
+
GetISeqPtr(arr[5], method->me.def->body.iseq);
|
267
|
+
#else
|
218
268
|
METHOD_OCLASS(method) =
|
219
269
|
rb_funcall(lookup_module_proc, rb_intern("call"), 1, arr[0]);
|
220
270
|
METHOD_RCLASS(method) =
|
221
271
|
rb_funcall(lookup_module_proc, rb_intern("call"), 1, arr[1]);
|
272
|
+
method->oid = SYM2ID(arr[4]);
|
273
|
+
{
|
274
|
+
NODE * n;
|
275
|
+
Data_Get_Struct(arr[5], NODE, n);
|
276
|
+
method->body = n;
|
277
|
+
}
|
278
|
+
#endif
|
222
279
|
method->recv = arr[2];
|
223
280
|
method->id = SYM2ID(arr[3]);
|
224
|
-
method->oid = SYM2ID(arr[4]);
|
225
|
-
Data_Get_Struct(arr[5], NODE, n);
|
226
|
-
method->body = n;
|
227
281
|
|
228
282
|
if(klass == rb_cUnboundMethod)
|
229
283
|
{
|
@@ -243,6 +297,8 @@ void Init_method(void)
|
|
243
297
|
#ifndef HAVE_RB_CMETHOD
|
244
298
|
rb_cMethod = rb_const_get(rb_cObject, rb_intern("Method"));
|
245
299
|
#endif
|
300
|
+
|
301
|
+
/* TODO: ruby 1.9 has this function but not 1.8 */
|
246
302
|
rb_define_method(rb_cMethod, "receiver", method_receiver, 0);
|
247
303
|
|
248
304
|
/* For rdoc: rb_cUnboundMethod = rb_define_class("UnboundMethod", rb_cObject) */
|
@@ -4,37 +4,35 @@ VALUE
|
|
4
4
|
class2path(VALUE klass)
|
5
5
|
{
|
6
6
|
VALUE path = rb_class_path(klass);
|
7
|
-
char *n
|
7
|
+
const char *n;
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
n);
|
13
|
-
}
|
14
|
-
if (rb_path2class(n) != rb_class_real(klass)) {
|
15
|
-
rb_raise(rb_eTypeError, "%s can't be referred", n);
|
9
|
+
n = must_not_be_anonymous((TYPE(klass) == T_CLASS ? "class" : "module"), path);
|
10
|
+
if (rb_path_to_class(path) != rb_class_real(klass)) {
|
11
|
+
rb_raise(rb_eTypeError, "%s can't be referred to", n);
|
16
12
|
}
|
17
13
|
return path;
|
18
14
|
}
|
19
15
|
|
20
16
|
VALUE
|
21
|
-
path2class(
|
17
|
+
path2class(VALUE path)
|
22
18
|
{
|
23
|
-
VALUE v =
|
19
|
+
VALUE v = rb_path_to_class(path);
|
24
20
|
|
25
21
|
if (TYPE(v) != T_CLASS) {
|
26
|
-
rb_raise(rb_eArgError, "
|
22
|
+
rb_raise(rb_eArgError, "%.*s does not refer to class",
|
23
|
+
(int)RSTRING_LEN(path), RSTRING_PTR(path));
|
27
24
|
}
|
28
25
|
return v;
|
29
26
|
}
|
30
27
|
|
31
28
|
VALUE
|
32
|
-
path2module(
|
29
|
+
path2module(VALUE path)
|
33
30
|
{
|
34
|
-
VALUE v =
|
31
|
+
VALUE v = rb_path_to_class(path);
|
35
32
|
|
36
33
|
if (TYPE(v) != T_MODULE) {
|
37
|
-
rb_raise(rb_eArgError, "
|
34
|
+
rb_raise(rb_eArgError, "%.*s does not refer to module",
|
35
|
+
(int)RSTRING_LEN(path), RSTRING_PTR(path));
|
38
36
|
}
|
39
37
|
return v;
|
40
38
|
}
|
@@ -1,9 +1,10 @@
|
|
1
1
|
$: << '../..'
|
2
2
|
require 'mkmf-ruby-internal'
|
3
3
|
|
4
|
-
have_func('vm_get_ruby_level_cfp', 'cfp.h')
|
5
|
-
have_func('rb_vm_get_ruby_level_next_cfp', 'cfp.h')
|
4
|
+
have_func('vm_get_ruby_level_cfp', [ 'cfp.h', 'vm_core.h' ])
|
5
|
+
have_func('rb_vm_get_ruby_level_next_cfp', [ 'cfp.h', 'vm_core.h' ])
|
6
6
|
have_header('ruby/node.h') or have_header('node.h')
|
7
|
+
have_struct_member('struct RClass', 'iv_index_tbl')
|
7
8
|
|
8
9
|
ruby_version_code = RUBY_VERSION.gsub(/\./, '').to_i
|
9
10
|
$CPPFLAGS << " -DRUBY_VERSION_CODE=#{ruby_version_code}"
|
@@ -16,7 +16,11 @@
|
|
16
16
|
#endif
|
17
17
|
|
18
18
|
#ifndef RCLASS_IV_TBL
|
19
|
-
#
|
19
|
+
# ifdef HAVE_STRUCT_RCLASS_IV_INDEX_TBL
|
20
|
+
# define RCLASS_IV_TBL(c) RCLASS(c)->iv_index_tbl
|
21
|
+
# else
|
22
|
+
# define RCLASS_IV_TBL(c) RCLASS(c)->iv_tbl
|
23
|
+
# endif
|
20
24
|
#endif
|
21
25
|
|
22
26
|
#ifndef RCLASS_M_TBL
|
@@ -214,7 +218,7 @@ static VALUE included_modules_list(VALUE module)
|
|
214
218
|
{
|
215
219
|
VALUE included_modules = rb_mod_included_modules(module);
|
216
220
|
VALUE included_module_list = rb_ary_new();
|
217
|
-
|
221
|
+
long j;
|
218
222
|
|
219
223
|
for(j = 0; j < RARRAY_LEN(included_modules); ++j)
|
220
224
|
{
|
@@ -391,7 +395,9 @@ static VALUE module_add_method(VALUE klass, VALUE id, VALUE node, VALUE noex)
|
|
391
395
|
rb_raise(rb_eSecurityError, "Insecure: can't add method");
|
392
396
|
}
|
393
397
|
|
394
|
-
#
|
398
|
+
#if RUBY_VERSION_CODE >= 192
|
399
|
+
rb_raise(rb_eRuntimeError, "NOT SUPPORTED");
|
400
|
+
#elif RUBY_VERSION_CODE >= 190
|
395
401
|
if(rb_obj_is_kind_of(node, rb_cISeq))
|
396
402
|
{
|
397
403
|
rb_iseq_t *iseqdat = iseq_check(node);
|
@@ -415,7 +421,9 @@ static VALUE module_add_method(VALUE klass, VALUE id, VALUE node, VALUE noex)
|
|
415
421
|
|
416
422
|
Data_Get_Struct(node, NODE, n);
|
417
423
|
|
418
|
-
#
|
424
|
+
#if RUBY_VERSION_CODE >= 192
|
425
|
+
rb_raise(rb_eRuntimeError, "NOT SUPPORTED");
|
426
|
+
#elif RUBY_VERSION_CODE >= 190
|
419
427
|
if(nd_type(n) != NODE_METHOD)
|
420
428
|
{
|
421
429
|
rb_raise(
|
@@ -424,19 +432,26 @@ static VALUE module_add_method(VALUE klass, VALUE id, VALUE node, VALUE noex)
|
|
424
432
|
rb_class2name(CLASS_OF(n)));
|
425
433
|
}
|
426
434
|
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
435
|
+
{
|
436
|
+
rb_iseq_t *iseqdat = iseq_check((VALUE)n->nd_body);
|
437
|
+
set_cref_stack(iseqdat, klass, noex);
|
438
|
+
iseqdat->klass = klass;
|
439
|
+
iseqdat->defined_method_id = SYM2ID(id);
|
440
|
+
n = NEW_METHOD(iseqdat->self, klass, NUM2INT(noex));
|
441
|
+
}
|
432
442
|
|
433
443
|
add_node:
|
434
444
|
#endif
|
445
|
+
|
446
|
+
#if RUBY_VERSION_CODE >= 192
|
447
|
+
rb_raise(rb_eRuntimeError, "NOT SUPPORTED");
|
448
|
+
#else
|
435
449
|
/* TODO: if noex is NOEX_MODFUNC, add this method as a module function
|
436
450
|
* (that is, both as an instance and singleton method)
|
437
451
|
*/
|
438
452
|
rb_add_method(klass, SYM2ID(id), n, NUM2INT(noex));
|
439
453
|
return Qnil;
|
454
|
+
#endif
|
440
455
|
}
|
441
456
|
|
442
457
|
/*
|
@@ -609,9 +624,9 @@ static VALUE module_dump(VALUE self, VALUE limit)
|
|
609
624
|
return str;
|
610
625
|
}
|
611
626
|
|
612
|
-
static void include_modules(module, included_modules)
|
627
|
+
static void include_modules(VALUE module, VALUE included_modules)
|
613
628
|
{
|
614
|
-
|
629
|
+
long j;
|
615
630
|
VALUE v;
|
616
631
|
VALUE name;
|
617
632
|
|
@@ -636,7 +651,11 @@ static int add_method_iter(VALUE name, VALUE value, VALUE module)
|
|
636
651
|
rb_class2name(CLASS_OF(value)));
|
637
652
|
}
|
638
653
|
Data_Get_Struct(value, NODE, n);
|
654
|
+
#if RUBY_VERSION_CODE >= 192
|
655
|
+
rb_raise(rb_eRuntimeError, "NOT SUPPORTED");
|
656
|
+
#elif RUBY_VERSION_CODE >= 190
|
639
657
|
rb_add_method(module, SYM2ID(name), n->nd_body, n->nd_noex);
|
658
|
+
#endif
|
640
659
|
return ST_CONTINUE;
|
641
660
|
}
|
642
661
|
|
@@ -775,10 +794,12 @@ void Init_module(void)
|
|
775
794
|
rb_global_variable(&module_name_proc);
|
776
795
|
|
777
796
|
#if RUBY_VERSION_CODE >= 180
|
778
|
-
|
779
|
-
|
780
|
-
|
781
|
-
|
797
|
+
{
|
798
|
+
VALUE rb_mNodewrap = rb_define_module("Nodewrap");
|
799
|
+
rb_cClass_Restorer = rb_define_class_under(rb_mNodewrap, "ClassRestorer", rb_cObject);
|
800
|
+
rb_define_method(rb_cClass_Restorer, "_dump", class_restorer_dump, 1);
|
801
|
+
rb_define_singleton_method(rb_cClass_Restorer, "_load", class_restorer_load, 1);
|
802
|
+
}
|
782
803
|
#endif
|
783
804
|
|
784
805
|
#if RUBY_VERSION_CODE == 180
|