parsetree19 0.2

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,369 @@
1
+ /* Headers Exposing a little more of the 1.9 runtime and some
2
+ method prototypes for extensions to the Thread class.
3
+ */
4
+ #include <ruby.h>
5
+ #include <signal.h>
6
+ #include "thread_pthread.h"
7
+ #include "node.h"
8
+
9
+ /* From vm_core.h: */
10
+
11
+ /* Frame information: */
12
+ #define VM_FRAME_MAGIC_METHOD 0x11
13
+ #define VM_FRAME_MAGIC_BLOCK 0x21
14
+ #define VM_FRAME_MAGIC_CLASS 0x31
15
+ #define VM_FRAME_MAGIC_TOP 0x41
16
+ #define VM_FRAME_MAGIC_FINISH 0x51
17
+ #define VM_FRAME_MAGIC_CFUNC 0x61
18
+ #define VM_FRAME_MAGIC_PROC 0x71
19
+ #define VM_FRAME_MAGIC_IFUNC 0x81
20
+ #define VM_FRAME_MAGIC_EVAL 0x91
21
+ #define VM_FRAME_MAGIC_LAMBDA 0xa1
22
+ #define VM_FRAME_MAGIC_MASK_BITS 8
23
+ #define VM_FRAME_MAGIC_MASK (~(~0<<VM_FRAME_MAGIC_MASK_BITS))
24
+
25
+ #define VM_FRAME_TYPE(cfp) ((cfp)->flag & VM_FRAME_MAGIC_MASK)
26
+
27
+ #define VM_FRAME_TRACE_RETURN 0x01 /* Call trace hook on return. */
28
+ #define VM_FRAME_TRACE_OFF 0x02 /* Turn of event hook tracing in this frame
29
+ and any frames created from this one. */
30
+
31
+ /* other frame flag */
32
+ #define VM_FRAME_FLAG_PASSED 0x0100
33
+
34
+ #define RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp) (cfp+1)
35
+ #define RUBYVM_CFUNC_FRAME_P(cfp) \
36
+ (VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_CFUNC)
37
+ #define RUBY_VM_NEXT_CONTROL_FRAME(cfp) (cfp-1)
38
+ #define RUBY_VM_END_CONTROL_FRAME(th) \
39
+ ((rb_control_frame_t *)((th)->stack + (th)->stack_size))
40
+ #define RUBY_VM_VALID_CONTROL_FRAME_P(cfp, ecfp) \
41
+ ((void *)(ecfp) > (void *)(cfp))
42
+ #define RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW_P(th, cfp) \
43
+ (!RUBY_VM_VALID_CONTROL_FRAME_P((cfp), RUBY_VM_END_CONTROL_FRAME(th)))
44
+
45
+ #define RUBY_VM_IFUNC_P(ptr) (BUILTIN_TYPE(ptr) == T_NODE)
46
+ #define RUBY_VM_NORMAL_ISEQ_P(ptr) \
47
+ (ptr && !RUBY_VM_IFUNC_P(ptr))
48
+
49
+
50
+ #if 1
51
+ #define GetCoreDataFromValue(obj, type, ptr) do { \
52
+ ptr = (type*)DATA_PTR(obj); \
53
+ } while (0)
54
+ #else
55
+ #define GetCoreDataFromValue(obj, type, ptr) Data_Get_Struct(obj, type, ptr)
56
+ #endif
57
+ #if 1
58
+ #define GetCoreDataFromValue(obj, type, ptr) do { \
59
+ ptr = (type*)DATA_PTR(obj); \
60
+ } while (0)
61
+ #else
62
+ #define GetCoreDataFromValue(obj, type, ptr) Data_Get_Struct(obj, type, ptr)
63
+ #endif
64
+ #define GetISeqPtr(obj, ptr) \
65
+ GetCoreDataFromValue(obj, rb_iseq_t, ptr)
66
+
67
+ /* Opaque types (for now at least) */
68
+ typedef struct iseq_catch_table_entry iseq_catch_table_entry_t;
69
+
70
+ #ifndef NSIG
71
+ # define NSIG (_SIGMAX + 1) /* For QNX */
72
+ #endif
73
+
74
+ #define RUBY_NSIG NSIG
75
+
76
+ typedef struct rb_compile_option_struct {
77
+ int inline_const_cache;
78
+ int peephole_optimization;
79
+ int tailcall_optimization;
80
+ int specialized_instruction;
81
+ int operands_unification;
82
+ int instructions_unification;
83
+ int stack_caching;
84
+ int trace_instruction;
85
+ int save_tree_node;
86
+ int save_compile_opts;
87
+ int debug_level;
88
+ } rb_compile_option_t;
89
+
90
+ /* Instruction sequence */
91
+ typedef struct rb_iseq_struct {
92
+ /***************/
93
+ /* static data */
94
+ /***************/
95
+
96
+ VALUE type; /* instruction sequence type */
97
+ VALUE name; /* String: iseq name */
98
+ VALUE filename; /* file information where this sequence from */
99
+ VALUE filepath; /* real file path or nil */
100
+ VALUE *iseq; /* iseq (insn number and operands) */
101
+ VALUE *iseq_encoded; /* encoded iseq */
102
+ unsigned long iseq_size;
103
+ VALUE mark_ary; /* Array: includes operands which should be GC marked */
104
+ VALUE coverage; /* coverage array */
105
+ unsigned short line_no;
106
+
107
+ /* insn info, must be freed */
108
+ struct iseq_insn_info_entry *insn_info_table;
109
+ size_t insn_info_size;
110
+
111
+ ID *local_table; /* must free */
112
+ int local_table_size;
113
+
114
+ /* method, class frame: sizeof(vars) + 1, block frame: sizeof(vars) */
115
+ int local_size;
116
+
117
+ struct iseq_inline_cache_entry *ic_entries;
118
+ int ic_size;
119
+
120
+ /**
121
+ * argument information
122
+ *
123
+ * def m(a1, a2, ..., aM, # mandatory
124
+ * b1=(...), b2=(...), ..., bN=(...), # optional
125
+ * *c, # rest
126
+ * d1, d2, ..., dO, # post
127
+ * &e) # block
128
+ * =>
129
+ *
130
+ * argc = M
131
+ * arg_rest = M+N+1 // or -1 if no rest arg
132
+ * arg_opts = N
133
+ * arg_opts_tbl = [ (N entries) ]
134
+ * arg_post_len = O // 0 if no post arguments
135
+ * arg_post_start = M+N+2
136
+ * arg_block = M+N + 1 + O + 1 // -1 if no block arg
137
+ * arg_simple = 0 if not simple arguments.
138
+ * = 1 if no opt, rest, post, block.
139
+ * = 2 if ambiguous block parameter ({|a|}).
140
+ * arg_size = argument size.
141
+ */
142
+
143
+ int argc;
144
+ int arg_simple;
145
+ int arg_rest;
146
+ int arg_block;
147
+ int arg_opts;
148
+ int arg_post_len;
149
+ int arg_post_start;
150
+ int arg_size;
151
+ VALUE *arg_opt_table;
152
+
153
+ size_t stack_max; /* for stack overflow check */
154
+
155
+ /* catch table */
156
+ iseq_catch_table_entry_t *catch_table;
157
+ int catch_table_size;
158
+
159
+ /* for child iseq */
160
+ struct rb_iseq_struct *parent_iseq;
161
+ struct rb_iseq_struct *local_iseq;
162
+
163
+ /****************/
164
+ /* dynamic data */
165
+ /****************/
166
+
167
+ VALUE self;
168
+ VALUE orig; /* non-NULL if its data have origin */
169
+
170
+ /* block inlining */
171
+ /*
172
+ * NODE *node;
173
+ * void *special_block_builder;
174
+ * void *cached_special_block_builder;
175
+ * VALUE cached_special_block;
176
+ */
177
+
178
+ /* klass/module nest information stack (cref) */
179
+ NODE *cref_stack;
180
+ VALUE klass;
181
+
182
+ /* misc */
183
+ ID defined_method_id; /* for define_method */
184
+
185
+ /* used at compile time */
186
+ struct iseq_compile_data *compile_data;
187
+ /* Used to set a breakpoint at a VM instruction */
188
+ unsigned char *breakpoints;
189
+
190
+ /* If this instruction sequence came from eval, the string of the
191
+ source as a String. */
192
+ VALUE source;
193
+
194
+ /* If we are saving tree nodes (a compile option), then tree_node
195
+ is the internal parse tree node representation for this
196
+ instruction sequence.
197
+ */
198
+ NODE *tree_node;
199
+ } rb_iseq_t;
200
+
201
+ enum ruby_special_exceptions {
202
+ ruby_error_reenter,
203
+ ruby_error_nomemory,
204
+ ruby_error_sysstack,
205
+ ruby_special_error_count
206
+ };
207
+
208
+ typedef struct rb_vm_struct {
209
+ VALUE self;
210
+
211
+ rb_thread_lock_t global_vm_lock;
212
+
213
+ struct rb_thread_struct *main_thread;
214
+ struct rb_thread_struct *running_thread;
215
+
216
+ st_table *living_threads;
217
+ VALUE thgroup_default;
218
+
219
+ int running;
220
+ int thread_abort_on_exception;
221
+ unsigned long trace_flag;
222
+ volatile int sleeper;
223
+
224
+ /* object management */
225
+ VALUE mark_object_ary;
226
+
227
+ VALUE special_exceptions[ruby_special_error_count];
228
+
229
+ /* load */
230
+ VALUE top_self;
231
+ VALUE load_path;
232
+ VALUE loaded_features;
233
+ struct st_table *loading_table;
234
+
235
+ /* signal */
236
+ struct {
237
+ VALUE cmd;
238
+ int safe;
239
+ } trap_list[RUBY_NSIG];
240
+
241
+ /* hook */
242
+ rb_event_hook_t *event_hooks;
243
+
244
+ int src_encoding_index;
245
+
246
+ VALUE verbose, debug, progname;
247
+ VALUE coverages;
248
+
249
+ struct unlinked_method_entry_list_entry *unlinked_method_entry_list;
250
+
251
+ #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
252
+ struct rb_objspace *objspace;
253
+ #endif
254
+ } rb_vm_t;
255
+
256
+ #include "method_mini.h"
257
+
258
+ typedef struct {
259
+ VALUE *pc; /* cfp[0] */
260
+ VALUE *sp; /* cfp[1] */
261
+ VALUE *bp; /* cfp[2] */
262
+ rb_iseq_t *iseq; /* cfp[3] */
263
+ VALUE flag; /* cfp[4] */
264
+ VALUE self; /* cfp[5] / block[0] */
265
+ VALUE *lfp; /* cfp[6] / block[1] */
266
+ VALUE *dfp; /* cfp[7] / block[2] */
267
+ rb_iseq_t *block_iseq; /* cfp[8] / block[3] */
268
+ VALUE proc; /* cfp[9] / block[4] */
269
+ const rb_method_entry_t *me;/* cfp[10] */
270
+ short int tracing; /* Bits to control per-frame event tracing.
271
+ See VM_FRAME_TRACE_xxx defines.
272
+ */
273
+ } rb_control_frame_t;
274
+
275
+ typedef struct rb_block_struct {
276
+ VALUE self; /* share with method frame if it's only block */
277
+ VALUE *lfp; /* share with method frame if it's only block */
278
+ VALUE *dfp; /* share with method frame if it's only block */
279
+ rb_iseq_t *iseq;
280
+ VALUE proc;
281
+ } rb_block_t;
282
+
283
+ #define GetThreadPtr(obj, ptr) \
284
+ GetCoreDataFromValue(obj, rb_thread_t, ptr)
285
+
286
+ #define GetProcPtr(obj, ptr) \
287
+ GetCoreDataFromValue(obj, rb_proc_t, ptr)
288
+
289
+ typedef struct rb_thread_struct
290
+ {
291
+ VALUE self;
292
+ rb_vm_t *vm;
293
+
294
+ /* execution information */
295
+ VALUE *stack; /* must free, must mark. rb: seems to be nil. */
296
+ unsigned long stack_size; /* Number of stack (or rb_control_frame_t) entries */
297
+ rb_control_frame_t *cfp;
298
+
299
+ int safe_level;
300
+ int raised_flag;
301
+ VALUE last_status; /* $? */
302
+
303
+ /* passing state */
304
+ int state;
305
+
306
+ /* tracer */
307
+ rb_event_hook_t *event_hooks;
308
+ rb_event_flag_t event_flags;
309
+ int tracing; /* 0 if not tracing. If less than 0, skip that many
310
+ C call/return pairs */
311
+ int exec_event_tracing; /* 0 if not in rb_threadptr_evec_event_hooks. */
312
+ int trace_skip_insn_count; /* # of VM instructions to skip */
313
+
314
+ /* misc */
315
+ int method_missing_reason;
316
+ int abort_on_exception;
317
+
318
+ /* for rb_iterate */
319
+ const rb_block_t *passed_block;
320
+
321
+ /* for bmethod */
322
+ const rb_method_entry_t *passed_me;
323
+
324
+ /* for load(true) */
325
+ VALUE top_self;
326
+ VALUE top_wrapper;
327
+
328
+ /* eval env */
329
+ rb_block_t *base_block;
330
+
331
+ VALUE *local_lfp;
332
+ VALUE local_svar;
333
+
334
+ /* Lot's of other stuff ...
335
+ thread control ... */
336
+ } rb_thread_t;
337
+
338
+ typedef struct {
339
+ rb_block_t block;
340
+
341
+ VALUE envval; /* for GC mark */
342
+ VALUE blockprocval;
343
+ int safe_level;
344
+ int is_from_method;
345
+ int is_lambda;
346
+ } rb_proc_t;
347
+
348
+ #define GetEnvPtr(obj, ptr) \
349
+ GetCoreDataFromValue(obj, rb_env_t, ptr)
350
+
351
+ typedef struct {
352
+ VALUE *env;
353
+ int env_size;
354
+ int local_size;
355
+ VALUE prev_envval; /* for GC mark */
356
+ rb_block_t block;
357
+ } rb_env_t;
358
+
359
+ #define GetBindingPtr(obj, ptr) \
360
+ GetCoreDataFromValue(obj, rb_binding_t, ptr)
361
+
362
+ typedef struct {
363
+ VALUE env;
364
+ VALUE filename;
365
+ unsigned short line_no;
366
+ } rb_binding_t;
367
+
368
+ #define GET_THREAD() ruby_current_thread
369
+ extern rb_thread_t *ruby_current_thread;
@@ -0,0 +1,33 @@
1
+ require 'test/unit'
2
+ require_relative '../../ext/parse_tree'
3
+
4
+ def five; 5 end
5
+
6
+ class TestParseTree < Test::Unit::TestCase
7
+ def setup
8
+ @processor = ParseTree19.new(false)
9
+ end
10
+
11
+ def test_parse_tree_for_method
12
+
13
+ def six
14
+ x = 2
15
+ y = 3
16
+ return x * y
17
+ end
18
+
19
+ [
20
+ [:five,
21
+ [:scope, [:args, 0, [:args_aux]], [:lit, 5]]],
22
+
23
+ [:six,
24
+ [:scope, [:args, 0, [:args_aux]],
25
+ [:block, [:lasgn, :x, [:lit, 2]],
26
+ [:block, [:lasgn, :y, [:lit, 3]],
27
+ [:block, [:call, :*, [:lvar, :x], [:array, 1, [:lvar, :y]]]]]]]]
28
+ ].each do |meth, expected|
29
+ actual = @processor.parse_tree_for_method(method(meth), true)
30
+ assert_equal expected, actual
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,162 @@
1
+ require 'test/unit'
2
+ require_relative '../../ext/parse_tree'
3
+
4
+ class TestParseTree < Test::Unit::TestCase
5
+ def setup
6
+ @processor = ParseTree19.new(false)
7
+ end
8
+
9
+ def test_parse_tree_for_str
10
+ # The order of the ops below is the order they appear in
11
+ # add_to_parse_tree.inc/node.c
12
+ # Note: if you ever wanted have a Ruby expression that causes
13
+ # a given parse node to be created, see below.
14
+ [
15
+ # block:
16
+ ['foo; bar', [:scope, [:block, [:vcall, :foo],
17
+ [:block, [:vcall, :bar]]]]],
18
+
19
+ # if:
20
+ ['true if nil', [:scope, [:if, [:nil], [:true]]]],
21
+ ['if nil then true else false end',
22
+ [:scope, [:if, [:nil], [:true], [:false]]]],
23
+
24
+ # Need case, when, opt_n
25
+
26
+ ['5 while false', [:scope, [:while, [:false], [:lit, 5]]]],
27
+ ['4 until true', [:scope, [:until, [:true], [:lit, 4]]]],
28
+
29
+ # iter:
30
+ ['x { 5 }',
31
+ [:scope, [:iter, [:fcall, :x], [:scope, [:lit, 5]]]]],
32
+
33
+ # Need for
34
+
35
+ ['break', [:scope, [:break]]],
36
+ ['break 1', [:scope, [:break, [:lit, 1]]]],
37
+ ['next', [:scope, [:next]]],
38
+ ['next 1', [:scope, [:next, [:lit, 1]]]],
39
+ ['return', [:scope, [:return]]],
40
+ ['return 4', [:scope, [:return, [:lit, 4]]]],
41
+
42
+ ['redo', [:scope, [:redo]]],
43
+ ['retry', [:scope, [:retry]]],
44
+
45
+ # begin
46
+ ['begin; 1 ; end',
47
+ [:scope, [:block, [:begin], [:block, [:lit, 1]]]]],
48
+
49
+ # rescue and resbody
50
+ ['begin; 1 ; rescue; 2; else 3; end',
51
+ [:scope, [:rescue, [:block, [:begin], [:block, [:lit, 1]]],
52
+ [:resbody, [:lit, 2]], [:lit, 3]]]],
53
+
54
+ # ensure
55
+ ['begin; 1 ; ensure; 2; end',
56
+ [:scope, [:ensure, [:block, [:begin], [:block, [:lit, 1]]],
57
+ [:block, [:begin], [:block, [:lit, 2]]]]]],
58
+
59
+ # and
60
+ ['true and nil', [:scope, [:and, [:true], [:nil]]]],
61
+ # or
62
+ ['true or false', [:scope, [:or, [:true], [:false]]]],
63
+
64
+ # lasgn
65
+ ['x = 5', [:scope, [:lasgn, :x, [:lit, 5]]]],
66
+ # dasgn:
67
+ ['x = nil; 1.times { x = 5 }',
68
+ [:scope, [:block, [:lasgn, :x, [:nil]],
69
+ [:block, [:iter, [:call, :times, [:lit, 1]],
70
+ [:scope, [:dasgn, :x, [:lit, 5]]]]]]]],
71
+ # dasgn_cur:
72
+ ['1.times { x = 5 }',
73
+ [:scope, [:iter, [:call, :times, [:lit, 1]],
74
+ [:scope, [:dasgn_curr, :x, [:lit, 5]]]]]],
75
+
76
+ ['@x = 5', [:scope, [:iasgn, :@x, [:lit, 5]]]],
77
+ ['@@x = 5', [:scope, [:cvasgn, :@@x, [:lit, 5]]]],
78
+
79
+ ['$x = 5', [:scope, [:gasgn, :$x, [:lit, 5]]]],
80
+
81
+ ['x &&= 1', [:scope, [:op_asgn_and,
82
+ [:lvar, :x], [:lasgn, :x, [:lit, 1]]]]],
83
+ ['x ||= 1', [:scope, [:op_asgn_or,
84
+ [:lvar, :x], [:lasgn, :x, [:lit, 1]]]]],
85
+
86
+ # op_asgn1
87
+ # 'ary[1] += 2'
88
+
89
+ # call:
90
+ ['x.foo', [:scope, [:call, :foo, [:vcall, :x]]]],
91
+
92
+ # For fcall, see iter above.
93
+
94
+ ['foo', [:scope, [:vcall, :foo]]],
95
+
96
+ ['super', [:scope, [:zsuper]]],
97
+
98
+ # array
99
+ ['[1]', [:scope, [:array, 1, [:lit, 1]]]],
100
+
101
+ # values array 1st item is not predictable.
102
+
103
+ # zarray
104
+ ['[]', [:scope, [:zarray]]],
105
+
106
+ # hash
107
+ ['{}', [:scope, [:hash]]],
108
+
109
+ ['yield', [:scope, [:yield]]],
110
+
111
+ # For lvar, see x ||= 1
112
+
113
+ # dvar:
114
+ ['1.times { x = 1; x }',
115
+ [:scope, [:iter, [:call, :times, [:lit, 1]],
116
+ [:scope, [:block, [:dasgn_curr, :x, [:lit, 1]],
117
+ [:block, [:dvar, :x]]]]]]],
118
+
119
+ ['@x', [:scope, [:ivar, :@x]]],
120
+ ['X', [:scope, [:const, :X]]],
121
+ ['@@X', [:scope, [:cvar, :@@X]]],
122
+ ['$x', [:scope, [:gvar, :$x]]],
123
+
124
+ ["5", [:scope, [:lit, 5]]],
125
+ ["'5'", [:scope, [:str, '5']]],
126
+ ['%x(5)', [:scope, [:xstr, '5']]],
127
+ ['"#{5}"', [:scope, [:dstr, nil, [:evstr, [:lit, 5]]]]],
128
+ ['`#{5}`', [:scope, [:dxstr, nil, [:evstr, [:lit, 5]]]]],
129
+ ['/#{5}/', [:scope, [:dregx, '', [:evstr, [:lit, 5]]]]],
130
+ ['/#{5}/o', [:scope, [:dregx_once, '', [:evstr, [:lit, 5]]]]],
131
+ [':"#{5}"', [:scope, [:dsym, nil, [:evstr, [:lit, 5]]]]],
132
+
133
+ ['alias a b', [:scope, [:alias, [:lit, :a], [:lit, :b]]]],
134
+ ['alias $a $b', [:scope, [:valias, :$a, :$b]]],
135
+
136
+ ['undef foo', [:scope, [:undef, [:lit, :foo]]]],
137
+
138
+ # dot2
139
+ ['1..5.each{ 5 }',
140
+ [:scope, [:dot2, [:lit, 1],
141
+ [:iter, [:call, :each, [:lit, 5]], [:scope, [:lit, 5]]]]]],
142
+ # dot3
143
+ ['1...5.each{ 5 }',
144
+ [:scope, [:dot3, [:lit, 1],
145
+ [:iter, [:call, :each, [:lit, 5]], [:scope, [:lit, 5]]]]]],
146
+
147
+ # Need flip2 and flip3
148
+
149
+ ['self', [:scope, [:self]]],
150
+ ['nil', [:scope, [:nil]]],
151
+ ['true', [:scope, [:true]]],
152
+ ['false', [:scope, [:false]]],
153
+
154
+ ['M::Foo', [:scope, [:colon2, :Foo, [:const, :M]]]],
155
+ ['::Foo', [:scope, [:colon3, :Foo]]],
156
+ ['defined?(5)', [:scope, [:defined, [:lit, 5]]]],
157
+ ].each do |test_str, expected|
158
+ actual = @processor.parse_tree_for_str test_str, '(string)', 1
159
+ assert_equal expected, actual
160
+ end
161
+ end
162
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: parsetree19
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 2
8
+ version: "0.2"
9
+ platform: ruby
10
+ authors:
11
+ - R. Bernstein
12
+ autorequire:
13
+ bindir: bin
14
+ cert_chain: []
15
+
16
+ date: 2010-12-25 00:00:00 -05:00
17
+ default_executable:
18
+ dependencies: []
19
+
20
+ description: "\n\
21
+ rb-parsetree is the C extension part of ParseTree for Ruby 1.9.\n"
22
+ email: rockyb@rubyforge.org
23
+ executables: []
24
+
25
+ extensions:
26
+ - ext/extconf.rb
27
+ extra_rdoc_files:
28
+ - README.md
29
+ - ext/parse_tree.c
30
+ files:
31
+ - README.md
32
+ - Rakefile
33
+ - NEWS
34
+ - ChangeLog
35
+ - include/thread_pthread.h
36
+ - include/node.h
37
+ - include/method_mini.h
38
+ - include/ruby19_externs.h
39
+ - include/vm_core_mini.h
40
+ - ext/parse_tree.c
41
+ - ext/add_to_parse_tree.inc
42
+ - test/unit/test_parse_tree_for_str.rb
43
+ - test/unit/test_parse_tree_for_meth.rb
44
+ - ext/extconf.rb
45
+ has_rdoc: true
46
+ homepage: http://github.com/rocky/rb-parsetree19/tree/master
47
+ licenses: []
48
+
49
+ post_install_message:
50
+ rdoc_options: []
51
+
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ~>
58
+ - !ruby/object:Gem::Version
59
+ segments:
60
+ - 1
61
+ - 9
62
+ - 2frame
63
+ version: 1.9.2frame
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ segments:
70
+ - 0
71
+ version: "0"
72
+ requirements: []
73
+
74
+ rubyforge_project:
75
+ rubygems_version: 1.3.7
76
+ signing_key:
77
+ specification_version: 3
78
+ summary: Frame introspection
79
+ test_files: []
80
+