ruby18_source_location 0.1

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.
@@ -0,0 +1,7 @@
1
+ require 'mkmf'
2
+
3
+ extension_name = "ruby18_source_location"
4
+
5
+ dir_config(extension_name)
6
+
7
+ create_makefile(extension_name)
@@ -0,0 +1,147 @@
1
+ // Include the Ruby headers and goodies
2
+ #include "ruby.h"
3
+
4
+ typedef struct RNode {
5
+ unsigned long flags;
6
+ char *nd_file;
7
+ union {
8
+ struct RNode *node;
9
+ ID id;
10
+ VALUE value;
11
+ VALUE (*cfunc)(ANYARGS);
12
+ ID *tbl;
13
+ } u1;
14
+ union {
15
+ struct RNode *node;
16
+ ID id;
17
+ long argc;
18
+ VALUE value;
19
+ } u2;
20
+ union {
21
+ struct RNode *node;
22
+ ID id;
23
+ long state;
24
+ struct global_entry *entry;
25
+ long cnt;
26
+ VALUE value;
27
+ } u3;
28
+ } NODE;
29
+
30
+ struct FRAME {
31
+ VALUE self;
32
+ int argc;
33
+ ID last_func;
34
+ ID orig_func;
35
+ VALUE last_class;
36
+ struct FRAME *prev;
37
+ struct FRAME *tmp;
38
+ struct RNode *node;
39
+ int iter;
40
+ int flags;
41
+ unsigned long uniq;
42
+ } *ruby_frame;
43
+
44
+ struct METHOD {
45
+ VALUE klass, rklass;
46
+ VALUE recv;
47
+ ID id, oid;
48
+ int safe_level;
49
+ NODE *body;
50
+ };
51
+
52
+ struct BLOCK {
53
+ NODE *var;
54
+ NODE *body;
55
+ VALUE self;
56
+ struct FRAME frame;
57
+ struct SCOPE *scope;
58
+ VALUE klass;
59
+ NODE *cref;
60
+ int iter;
61
+ int vmode;
62
+ int flags;
63
+ int uniq;
64
+ struct RVarmap *dyna_vars;
65
+ VALUE orig_thread;
66
+ VALUE wrapper;
67
+ VALUE block_obj;
68
+ struct BLOCK *outer;
69
+ struct BLOCK *prev;
70
+ };
71
+ #define RNODE(obj) (R_CAST(RNode)(obj))
72
+ #define NODE_LSHIFT (FL_USHIFT+8)
73
+ #define NODE_LMASK (((long)1<<(sizeof(NODE*)*CHAR_BIT-NODE_LSHIFT))-1)
74
+ #define nd_line(n) ((unsigned int)(((RNODE(n))->flags>>NODE_LSHIFT)&NODE_LMASK))
75
+
76
+
77
+ static VALUE
78
+ source_pair(const char *filename, int lineno)
79
+ {
80
+ VALUE array = rb_ary_new();
81
+ rb_ary_push(array, rb_str_new2(filename));
82
+ rb_ary_push(array, INT2FIX(lineno));
83
+
84
+ return array;
85
+ }
86
+
87
+ static VALUE
88
+ node_source_location(NODE *node)
89
+ {
90
+ const char *filename = node->nd_file;
91
+ int lineno = nd_line(node);
92
+
93
+ if (filename && lineno)
94
+ return source_pair(filename, lineno);
95
+
96
+ return Qnil;
97
+ }
98
+
99
+ /*
100
+ * call-seq:
101
+ * meth.source_location => [String, Fixnum]
102
+ *
103
+ * returns a pair of the Filename and line number on which the method is defined
104
+ *
105
+ * returns nil if method has no associated ruby source code
106
+ */
107
+ static VALUE
108
+ method_source_location(VALUE method)
109
+ {
110
+ struct METHOD *data;
111
+ NODE *node;
112
+
113
+ Data_Get_Struct(method, struct METHOD, data);
114
+ if (node = data->body) {
115
+ return node_source_location(node);
116
+ }
117
+ return Qnil;
118
+ }
119
+
120
+ /*
121
+ * call-seq:
122
+ * meth.source_location => [String, Fixnum]
123
+ *
124
+ * returns a pair of the Filename and line number on which the method is defined
125
+ *
126
+ * returns nil if method has no associated ruby source code
127
+ */
128
+ static VALUE
129
+ proc_source_location(VALUE block)
130
+ {
131
+ struct BLOCK *data;
132
+ NODE *node;
133
+
134
+ Data_Get_Struct(block, struct BLOCK, data);
135
+ if ((node = data->frame.node) || (node = data->body)) {
136
+ return node_source_location(node);
137
+ }
138
+ return Qnil;
139
+ }
140
+
141
+ void
142
+ Init_ruby18_source_location()
143
+ {
144
+ rb_define_method(rb_cUnboundMethod, "source_location", method_source_location, 0);
145
+ rb_define_method(rb_cMethod, "source_location", method_source_location, 0);
146
+ rb_define_method(rb_cProc, "source_location", proc_source_location, 0);
147
+ }
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby18_source_location
3
+ version: !ruby/object:Gem::Version
4
+ hash: 9
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ version: "0.1"
10
+ platform: ruby
11
+ authors:
12
+ - Conrad Irwin
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-10-22 00:00:00 Z
18
+ dependencies: []
19
+
20
+ description: Allows you to make use of lots of ruby 1.9.2 specific goodness
21
+ email: conrad.irwin@gmail.com
22
+ executables: []
23
+
24
+ extensions:
25
+ - ext/extconf.rb
26
+ extra_rdoc_files: []
27
+
28
+ files:
29
+ - ext/ruby18_source_location.c
30
+ - ext/extconf.rb
31
+ homepage: http://github.com/ConradIrwin/ruby18_source_location
32
+ licenses: []
33
+
34
+ post_install_message:
35
+ rdoc_options: []
36
+
37
+ require_paths:
38
+ - ext
39
+ required_ruby_version: !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ hash: 3
45
+ segments:
46
+ - 0
47
+ version: "0"
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ hash: 3
54
+ segments:
55
+ - 0
56
+ version: "0"
57
+ requirements: []
58
+
59
+ rubyforge_project:
60
+ rubygems_version: 1.8.6
61
+ signing_key:
62
+ specification_version: 3
63
+ summary: Add .source_location to methods in Ruby 1.8.7
64
+ test_files: []
65
+