getsource 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +2 -0
- data/Rakefile +1 -1
- data/ext/getsource_base/getsource_base.c +15 -79
- data/lib/getsource.rb +34 -0
- metadata +4 -4
data/CHANGELOG
CHANGED
data/Rakefile
CHANGED
@@ -20,28 +20,10 @@ along with getsource. if not, see <http://www.gnu.org/licenses/>.
|
|
20
20
|
*/
|
21
21
|
|
22
22
|
#include <ruby.h>
|
23
|
-
|
24
23
|
#ifdef RUBY1_8
|
25
|
-
#include <node.h>
|
26
|
-
#endif
|
27
|
-
|
28
|
-
#ifdef RUBY1_9
|
29
|
-
#include <node_defs.h>
|
30
|
-
#endif
|
31
|
-
|
32
|
-
#ifndef __USE_GNU
|
33
|
-
#define __USE_GNU
|
34
|
-
#endif
|
35
|
-
#include <dlfcn.h>
|
36
24
|
|
25
|
+
#include <node.h>
|
37
26
|
|
38
|
-
VALUE rb_cNode;
|
39
|
-
ID intern_owner;
|
40
|
-
ID intern_name;
|
41
|
-
ID intern_sym;
|
42
|
-
|
43
|
-
/// from eval.c
|
44
|
-
#ifdef RUBY1_8
|
45
27
|
struct METHOD {
|
46
28
|
VALUE klass, rklass;
|
47
29
|
|
@@ -53,33 +35,17 @@ struct METHOD {
|
|
53
35
|
unsigned char* base__;
|
54
36
|
|
55
37
|
#define nd_file(n) n->nd_file
|
38
|
+
#include <dlfcn.h>
|
56
39
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
// from proc.c
|
62
|
-
struct METHOD {
|
63
|
-
VALUE oclass; /* class that holds the method */
|
64
|
-
VALUE rclass; /* class of the receiver */
|
65
|
-
VALUE recv;
|
66
|
-
ID id, oid;
|
67
|
-
NODE *body;
|
68
|
-
};
|
69
|
-
|
70
|
-
typedef struct rb_iseq_struct__ {
|
71
|
-
VALUE type; // instruction sequence type
|
72
|
-
VALUE name; // String: iseq name
|
73
|
-
VALUE filename; // file information where this sequence from
|
74
|
-
} rb_iseq_t__;
|
75
|
-
|
40
|
+
VALUE rb_cNode;
|
41
|
+
ID intern_owner;
|
42
|
+
ID intern_name;
|
43
|
+
ID intern_sym;
|
76
44
|
|
77
45
|
typedef VALUE (*MNEW)(VALUE klass, VALUE obj, ID id, VALUE mclass, int scope);
|
78
46
|
MNEW mnew_;
|
79
47
|
unsigned char* base__;
|
80
48
|
|
81
|
-
#endif
|
82
|
-
|
83
49
|
/*
|
84
50
|
The node that acts as body of the method
|
85
51
|
*/
|
@@ -95,12 +61,10 @@ VALUE rb_method_body(VALUE self) {
|
|
95
61
|
|
96
62
|
if (method->body == 0) return Qnil;
|
97
63
|
|
98
|
-
#ifdef RUBY1_8
|
99
64
|
// nd_defn is only present in ruby_1.8
|
100
65
|
if (method->body->nd_defn != 0) {
|
101
66
|
return Data_Wrap_Struct(rb_cNode, 0, 0, method->body->nd_defn);
|
102
67
|
}
|
103
|
-
#endif
|
104
68
|
|
105
69
|
return Data_Wrap_Struct(rb_cNode, 0, 0, method->body);
|
106
70
|
}
|
@@ -112,15 +76,11 @@ VALUE rb_node_line(VALUE self) {
|
|
112
76
|
NODE* _node;
|
113
77
|
Data_Get_Struct(self,NODE,_node);
|
114
78
|
|
115
|
-
#ifdef RUBY1_8
|
116
79
|
return INT2FIX(nd_line(_node));
|
117
|
-
#endif
|
118
80
|
|
119
|
-
#ifdef RUBY1_9
|
120
|
-
return INT2FIX(0);
|
121
|
-
#endif
|
122
81
|
}
|
123
82
|
|
83
|
+
|
124
84
|
/*
|
125
85
|
The name of the ruby source file where the code associated with the node are defined
|
126
86
|
*/
|
@@ -128,46 +88,20 @@ VALUE rb_node_file(VALUE self) {
|
|
128
88
|
NODE* _node;
|
129
89
|
Data_Get_Struct(self,NODE,_node);
|
130
90
|
|
131
|
-
#ifdef RUBY1_8
|
132
91
|
if (nd_file(_node) == NULL ) {
|
133
92
|
return rb_str_new2("");
|
134
93
|
}
|
135
94
|
return rb_str_new2(nd_file(_node) );
|
136
|
-
#endif
|
137
|
-
|
138
|
-
#ifdef RUBY1_9
|
139
|
-
|
140
|
-
if (nd_type(_node) == RUBY_VM_METHOD_NODE) {
|
141
|
-
VALUE iseqval = (VALUE)(_node->nd_body);
|
142
|
-
rb_iseq_t__* ptr;
|
143
|
-
Data_Get_Struct(iseqval, rb_iseq_t__, ptr);
|
144
|
-
|
145
|
-
return ptr->filename;
|
146
|
-
}
|
147
|
-
|
148
|
-
return rb_str_new2("");
|
149
|
-
|
150
|
-
#endif
|
151
|
-
|
152
95
|
}
|
153
96
|
|
154
97
|
|
155
98
|
static void
|
156
99
|
bm_mark(struct METHOD *data)
|
157
100
|
{
|
158
|
-
#ifdef RUBY1_8
|
159
101
|
rb_gc_mark(data->klass);
|
160
102
|
rb_gc_mark(data->rklass);
|
161
103
|
rb_gc_mark(data->recv);
|
162
104
|
rb_gc_mark((VALUE)data->body);
|
163
|
-
#endif
|
164
|
-
#ifdef RUBY1_9
|
165
|
-
rb_gc_mark(data->rclass);
|
166
|
-
rb_gc_mark(data->oclass);
|
167
|
-
rb_gc_mark(data->recv);
|
168
|
-
rb_gc_mark((VALUE)data->body);
|
169
|
-
#endif
|
170
|
-
|
171
105
|
}
|
172
106
|
|
173
107
|
static VALUE
|
@@ -180,12 +114,7 @@ umethod_unchecked_bind(VALUE method, VALUE recv)
|
|
180
114
|
method = Data_Make_Struct(rb_cMethod, struct METHOD, bm_mark, -1, bound);
|
181
115
|
*bound = *data;
|
182
116
|
bound->recv = recv;
|
183
|
-
#ifdef RUBY1_8
|
184
117
|
bound->rklass = CLASS_OF(recv);
|
185
|
-
#endif
|
186
|
-
#ifdef RUBY1_9
|
187
|
-
bound->rclass = CLASS_OF(recv);
|
188
|
-
#endif
|
189
118
|
|
190
119
|
return method;
|
191
120
|
}
|
@@ -202,11 +131,18 @@ void Init_getsource_base() {
|
|
202
131
|
the ruby source code and may be associated with a file and line where thats node are defined
|
203
132
|
*/
|
204
133
|
rb_cNode = rb_define_class("Node", rb_cObject);
|
205
|
-
|
206
134
|
rb_define_method(rb_cNode, "line", rb_node_line, 0);
|
207
135
|
rb_define_method(rb_cNode, "file", rb_node_file, 0);
|
208
136
|
|
137
|
+
|
209
138
|
intern_owner = rb_intern("owner");
|
210
139
|
intern_name = rb_intern("name");
|
211
140
|
intern_sym = rb_intern("to_sym");
|
212
141
|
}
|
142
|
+
#else
|
143
|
+
|
144
|
+
void Init_getsource_base() {
|
145
|
+
}
|
146
|
+
|
147
|
+
#endif
|
148
|
+
|
data/lib/getsource.rb
CHANGED
@@ -20,7 +20,41 @@ along with getsource. if not, see <http://www.gnu.org/licenses/>.
|
|
20
20
|
=end
|
21
21
|
require "getsource_base"
|
22
22
|
|
23
|
+
class Method
|
24
|
+
|
25
|
+
class Node
|
26
|
+
|
27
|
+
attr_reader :file
|
28
|
+
attr_reader :line
|
29
|
+
|
30
|
+
def initialize(file_,line_)
|
31
|
+
@file = file_
|
32
|
+
@line = line_
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
begin
|
37
|
+
instance_method("body")
|
38
|
+
rescue
|
39
|
+
def body
|
40
|
+
Method::Node.new(source_location[0], source_location[1])
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class UnboundMethod
|
46
|
+
begin
|
47
|
+
instance_method("body")
|
48
|
+
rescue
|
49
|
+
def body
|
50
|
+
Method::Node.new(source_location[0], source_location[1])
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
|
23
56
|
class Object
|
57
|
+
|
24
58
|
def specific_method(arg1, arg2=nil)
|
25
59
|
if arg2
|
26
60
|
method_name = arg2
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: getsource
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Dario Seminara
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-04-27 00:00:00 -03:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|