parsetree19 0.2 → 0.3
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 +21 -0
- data/NEWS +5 -0
- data/README.md +34 -1
- data/Rakefile +43 -94
- data/ext/add_to_parse_tree.inc +14 -0
- data/ext/parse_tree.c +4 -6
- data/include/vm_core_mini.h +8 -8
- metadata +4 -4
data/ChangeLog
CHANGED
@@ -1,3 +1,24 @@
|
|
1
|
+
2011-06-08 r <rocky@gnu.org>
|
2
|
+
|
3
|
+
* ext/add_to_parse_tree.inc: Add NODE_BLOCK and NODE_BLOCK_ARG.
|
4
|
+
|
5
|
+
2011-06-08 r <rocky@gnu.org>
|
6
|
+
|
7
|
+
* ext/parse_tree.c: Guard against dereferencing NULL iseq pointer.
|
8
|
+
|
9
|
+
2010-12-28 r <rocky@gnu.org>
|
10
|
+
|
11
|
+
* .gemspec, Rakefile, ext/parse_tree.c: Add .gemspec. bump version
|
12
|
+
number.
|
13
|
+
|
14
|
+
2010-12-25 rocky <rockyb@rubyforge.org>
|
15
|
+
|
16
|
+
* README.md: Update README.md
|
17
|
+
|
18
|
+
2010-12-25 rocky <rockyb@rubyforge.org>
|
19
|
+
|
20
|
+
* ChangeLog: See above.
|
21
|
+
|
1
22
|
2010-12-25 rocky <rockyb@rubyforge.org>
|
2
23
|
|
3
24
|
* ChangeLog: Update README.md to include usage.
|
data/NEWS
CHANGED
data/README.md
CHANGED
@@ -5,4 +5,37 @@ A C extension to support ParseTree in Ruby 1.9
|
|
5
5
|
## Requirements
|
6
6
|
|
7
7
|
A patched version of Ruby 1.9.2 is needed. In fact the same patched version
|
8
|
-
as needed by rb-threadframe (and thus
|
8
|
+
as needed by rb-threadframe (and thus trepanning).
|
9
|
+
|
10
|
+
Usage:
|
11
|
+
|
12
|
+
require 'parse_tree'
|
13
|
+
processor = ParseTree19.new(false)
|
14
|
+
processor.parse_tree_for_str('x=1; y=2', '(string'), 1)
|
15
|
+
=> [:scope, [:block, [:lasgn, :x, [:lit, 1]], [:block, [:lasgn, :y, [:lit, 2]]]]]
|
16
|
+
def five; 5 end
|
17
|
+
processor.parse_tree_for_method(method(:five), true)
|
18
|
+
=> [:scope, [:args, 0, [:args_aux]], [:lit, 5]]
|
19
|
+
puts processor.parse_tree_for_method(method(:five, false)
|
20
|
+
=> nil
|
21
|
+
###########################################################
|
22
|
+
## Do NOT use this node dump for any purpose other than ##
|
23
|
+
## debug and research. Compatibility is not guaranteed. ##
|
24
|
+
###########################################################
|
25
|
+
|
26
|
+
# @ NODE_SCOPE (line: 6)
|
27
|
+
# +- nd_tbl: (empty)
|
28
|
+
# +- nd_args:
|
29
|
+
# | @ NODE_ARGS (line: 6)
|
30
|
+
# | +- nd_frml: 0
|
31
|
+
# | +- nd_next:
|
32
|
+
# | | @ NODE_ARGS_AUX (line: 6)
|
33
|
+
# | | +- nd_rest: (null)
|
34
|
+
# | | +- nd_body: (null)
|
35
|
+
# | | +- nd_next:
|
36
|
+
# | | (null node)
|
37
|
+
# | +- nd_opt:
|
38
|
+
# | (null node)
|
39
|
+
# +- nd_body:
|
40
|
+
# @ NODE_LIT (line: 6)
|
41
|
+
# +- nd_lit: 5
|
data/Rakefile
CHANGED
@@ -1,30 +1,34 @@
|
|
1
1
|
#!/usr/bin/env rake
|
2
2
|
# -*- Ruby -*-
|
3
3
|
require 'rubygems'
|
4
|
+
|
5
|
+
ROOT_DIR = File.dirname(__FILE__)
|
6
|
+
def gemspec
|
7
|
+
@gemspec ||= eval(File.read('.gemspec'), binding, '.gemspec')
|
8
|
+
end
|
9
|
+
|
4
10
|
require 'rake/gempackagetask'
|
5
|
-
|
6
|
-
|
11
|
+
desc "Build the gem"
|
12
|
+
task :package=>:gem
|
13
|
+
task :gem=>:gemspec do
|
14
|
+
Dir.chdir(ROOT_DIR) do
|
15
|
+
sh "gem build .gemspec"
|
16
|
+
FileUtils.mkdir_p 'pkg'
|
17
|
+
FileUtils.mv "#{gemspec.name}-#{gemspec.version}.gem", 'pkg'
|
18
|
+
end
|
19
|
+
end
|
7
20
|
|
8
|
-
|
21
|
+
desc "Install the gem locally"
|
22
|
+
task :install => :gem do
|
23
|
+
Dir.chdir(ROOT_DIR) do
|
24
|
+
sh %{gem install --local pkg/#{gemspec.name}-#{gemspec.version}}
|
25
|
+
end
|
26
|
+
end
|
9
27
|
|
10
28
|
require 'rbconfig'
|
11
29
|
RUBY_PATH = File.join(Config::CONFIG['bindir'],
|
12
30
|
Config::CONFIG['RUBY_INSTALL_NAME'])
|
13
31
|
|
14
|
-
SO_NAME = 'parsetree19.so'
|
15
|
-
|
16
|
-
PACKAGE_VERSION = open("ext/parse_tree.c") do |f|
|
17
|
-
f.grep(/^#define PARSETREE19_VERSION/).first[/"(.+)"/,1]
|
18
|
-
end
|
19
|
-
|
20
|
-
EXT_FILES = FileList[%w(ext/*.c ext/*.h ext/*.inc)]
|
21
|
-
INCLUDE_FILES = FileList['include/*.h']
|
22
|
-
LIB_FILES = FileList['lib/*.rb']
|
23
|
-
TEST_FILES = FileList['test/*/*.rb']
|
24
|
-
COMMON_FILES = FileList[%w(README.md Rakefile NEWS ChangeLog)]
|
25
|
-
ALL_FILES = COMMON_FILES + INCLUDE_FILES + LIB_FILES + EXT_FILES +
|
26
|
-
TEST_FILES
|
27
|
-
|
28
32
|
desc 'Create the core thread-frame shared library extension'
|
29
33
|
task :ext do
|
30
34
|
Dir.chdir('ext') do
|
@@ -54,13 +58,12 @@ def run_standalone_ruby_file(directory)
|
|
54
58
|
end
|
55
59
|
end
|
56
60
|
|
57
|
-
desc
|
61
|
+
desc 'Create a GNU-style ChangeLog via git2cl'
|
58
62
|
task :ChangeLog do
|
59
|
-
system(
|
63
|
+
system('git log --pretty --numstat --summary | git2cl > ChangeLog')
|
60
64
|
end
|
61
65
|
|
62
|
-
|
63
|
-
|
66
|
+
require 'rake/testtask'
|
64
67
|
desc 'Test units - the smaller tests'
|
65
68
|
Rake::TestTask.new(:'test:unit') do |t|
|
66
69
|
t.libs << './ext'
|
@@ -70,89 +73,35 @@ Rake::TestTask.new(:'test:unit') do |t|
|
|
70
73
|
end
|
71
74
|
task :'test:unit' => [:ext]
|
72
75
|
|
73
|
-
desc 'Test everything - unit tests for now.'
|
74
|
-
task :test do
|
75
|
-
exceptions = ['test:unit'].collect do |task|
|
76
|
-
begin
|
77
|
-
Rake::Task[task].invoke
|
78
|
-
nil
|
79
|
-
rescue => e
|
80
|
-
e
|
81
|
-
end
|
82
|
-
end.compact
|
83
|
-
|
84
|
-
exceptions.each {|e| puts e;puts e.backtrace }
|
85
|
-
raise "Test failures" unless exceptions.empty?
|
86
|
-
end
|
87
|
-
|
88
76
|
desc "Test everything - same as test."
|
89
77
|
|
90
78
|
task :'check' do
|
91
|
-
run_standalone_ruby_file(File.join(%W(#{
|
79
|
+
run_standalone_ruby_file(File.join(%W(#{ROOT_DIR} test unit)))
|
92
80
|
end
|
93
81
|
|
82
|
+
task :default => [:test]
|
83
|
+
task :test => [:'test:unit']
|
84
|
+
|
85
|
+
desc "Generate the gemspec"
|
86
|
+
task :generate do
|
87
|
+
puts gemspec.to_ruby
|
88
|
+
end
|
89
|
+
|
90
|
+
desc "Validate the gemspec"
|
91
|
+
task :gemspec do
|
92
|
+
gemspec.validate
|
93
|
+
end
|
94
|
+
|
95
|
+
|
94
96
|
# --------- RDoc Documentation ------
|
97
|
+
require 'rake/rdoctask'
|
95
98
|
desc 'Generate rdoc documentation'
|
96
99
|
Rake::RDocTask.new('rdoc') do |rdoc|
|
97
|
-
rdoc.rdoc_dir = 'doc
|
98
|
-
rdoc.title =
|
100
|
+
rdoc.rdoc_dir = 'doc'
|
101
|
+
rdoc.title = "ParseTree Documentation"
|
99
102
|
# Show source inline with line numbers
|
100
103
|
rdoc.options << '--inline-source' << '--line-numbers'
|
101
104
|
# Make the readme file the start page for the generated html
|
102
105
|
rdoc.options << '--main' << 'README.md'
|
103
|
-
rdoc.rdoc_files.include(
|
104
|
-
'README.md')
|
105
|
-
end
|
106
|
-
|
107
|
-
# Base GEM Specification
|
108
|
-
spec = Gem::Specification.new do |spec|
|
109
|
-
spec.name = "parsetree19"
|
110
|
-
|
111
|
-
spec.homepage = "http://github.com/rocky/rb-parsetree19/tree/master"
|
112
|
-
spec.summary = "Frame introspection"
|
113
|
-
spec.description = <<-EOF
|
114
|
-
|
115
|
-
rb-parsetree is the C extension part of ParseTree for Ruby 1.9.
|
116
|
-
EOF
|
117
|
-
|
118
|
-
spec.version = PACKAGE_VERSION
|
119
|
-
spec.require_path = 'lib'
|
120
|
-
spec.extensions = ["ext/extconf.rb"]
|
121
|
-
|
122
|
-
spec.author = "R. Bernstein"
|
123
|
-
spec.email = "rockyb@rubyforge.org"
|
124
|
-
spec.platform = Gem::Platform::RUBY
|
125
|
-
spec.files = ALL_FILES.to_a
|
126
|
-
|
127
|
-
spec.required_ruby_version = '~> 1.9.2frame'
|
128
|
-
spec.date = Time.now
|
129
|
-
# spec.rubyforge_project = 'rocky-hacks'
|
130
|
-
|
131
|
-
# rdoc
|
132
|
-
spec.has_rdoc = true
|
133
|
-
spec.extra_rdoc_files = ['README.md'] + FileList['ext/*.c']
|
134
|
-
end
|
135
|
-
|
136
|
-
# Rake task to build the default package
|
137
|
-
Rake::GemPackageTask.new(spec) do |pkg|
|
138
|
-
pkg.need_tar = true
|
139
|
-
end
|
140
|
-
|
141
|
-
def install(spec, *opts)
|
142
|
-
args = ['gem', 'install', "pkg/#{spec.name}-#{spec.version}.gem"] + opts
|
143
|
-
system(*args)
|
106
|
+
rdoc.rdoc_files.include(%w(ext/**/*.c README.md))
|
144
107
|
end
|
145
|
-
|
146
|
-
desc 'Install locally'
|
147
|
-
task :install => :package do
|
148
|
-
Dir.chdir(File::dirname(__FILE__)) do
|
149
|
-
# ri and rdoc take lots of time
|
150
|
-
install(spec, '--no-ri', '--no-rdoc')
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
task :install_full => :package do
|
155
|
-
Dir.chdir(File::dirname(__FILE__)) do
|
156
|
-
install(spec)
|
157
|
-
end
|
158
|
-
end
|
data/ext/add_to_parse_tree.inc
CHANGED
@@ -899,6 +899,20 @@ add_to_parse_tree(VALUE self, VALUE ary, NODE *node, ID *locals)
|
|
899
899
|
F_NODE(nd_body, "body");
|
900
900
|
break;
|
901
901
|
|
902
|
+
case NODE_MEMO:
|
903
|
+
ANN("NODE MEMO");
|
904
|
+
ANN("format: filename, safe_level, 0");
|
905
|
+
rb_aray_push(current, node->u1.value);
|
906
|
+
rb_aray_push(current, node->u2.value);
|
907
|
+
rb_aray_push(current, node->u3.value);
|
908
|
+
break;
|
909
|
+
|
910
|
+
case NODE_BLOCK_ARG:
|
911
|
+
ANN("NODE BLOCK ARG");
|
912
|
+
ANN("format: v 0, local_cnt(v)");
|
913
|
+
F_NODE(nd_head, "v");
|
914
|
+
break;
|
915
|
+
|
902
916
|
default:
|
903
917
|
rb_bug("dump_node: unknown node: %s", ruby_node_name(nd_type(node)));
|
904
918
|
}
|
data/ext/parse_tree.c
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/* What release we got? */
|
2
|
-
#define PARSETREE19_VERSION "0.
|
2
|
+
#define PARSETREE19_VERSION "0.3"
|
3
3
|
#include "../include/vm_core_mini.h" /* Pulls in ruby.h and node.h */
|
4
4
|
#include "../include/ruby19_externs.h"
|
5
5
|
|
@@ -49,7 +49,7 @@ parse_tree_for_iseq_internal(VALUE self, rb_iseq_t *iseq, VALUE tree)
|
|
49
49
|
{
|
50
50
|
VALUE result = rb_ary_new();
|
51
51
|
|
52
|
-
if (iseq->tree_node) {
|
52
|
+
if (iseq && iseq->tree_node) {
|
53
53
|
if (Qfalse == tree)
|
54
54
|
result = rb_parser_dump_tree(iseq->tree_node, 0);
|
55
55
|
else
|
@@ -63,10 +63,9 @@ static VALUE
|
|
63
63
|
parse_tree_for_iseq(VALUE self, VALUE iseqval, VALUE tree)
|
64
64
|
{
|
65
65
|
rb_iseq_t *iseq;
|
66
|
-
VALUE result = rb_ary_new();
|
67
66
|
|
68
67
|
GetISeqPtr(iseqval, iseq);
|
69
|
-
parse_tree_for_iseq_internal(self, iseq, tree);
|
68
|
+
return parse_tree_for_iseq_internal(self, iseq, tree);
|
70
69
|
}
|
71
70
|
|
72
71
|
/* Defined in Ruby 1.9 proc.c */
|
@@ -76,7 +75,7 @@ static VALUE
|
|
76
75
|
parse_tree_for_method(VALUE self, VALUE method, VALUE tree)
|
77
76
|
{
|
78
77
|
rb_iseq_t *iseq = rb_method_get_iseq(method);
|
79
|
-
parse_tree_for_iseq_internal(self, iseq, tree);
|
78
|
+
return parse_tree_for_iseq_internal(self, iseq, tree);
|
80
79
|
}
|
81
80
|
|
82
81
|
static VALUE
|
@@ -84,7 +83,6 @@ parse_tree_common(VALUE self, VALUE source, VALUE filename, VALUE line,
|
|
84
83
|
VALUE tree)
|
85
84
|
{
|
86
85
|
VALUE tmp;
|
87
|
-
VALUE result = rb_ary_new();
|
88
86
|
NODE *node = NULL;
|
89
87
|
|
90
88
|
#ifdef FIXED
|
data/include/vm_core_mini.h
CHANGED
@@ -94,13 +94,13 @@ typedef struct rb_iseq_struct {
|
|
94
94
|
/***************/
|
95
95
|
|
96
96
|
VALUE type; /* instruction sequence type */
|
97
|
-
VALUE name;
|
97
|
+
VALUE name; /* String: iseq name */
|
98
98
|
VALUE filename; /* file information where this sequence from */
|
99
99
|
VALUE filepath; /* real file path or nil */
|
100
100
|
VALUE *iseq; /* iseq (insn number and operands) */
|
101
101
|
VALUE *iseq_encoded; /* encoded iseq */
|
102
102
|
unsigned long iseq_size;
|
103
|
-
VALUE mark_ary;
|
103
|
+
VALUE mark_ary; /* Array: includes operands which should be GC marked */
|
104
104
|
VALUE coverage; /* coverage array */
|
105
105
|
unsigned short line_no;
|
106
106
|
|
@@ -108,7 +108,7 @@ typedef struct rb_iseq_struct {
|
|
108
108
|
struct iseq_insn_info_entry *insn_info_table;
|
109
109
|
size_t insn_info_size;
|
110
110
|
|
111
|
-
ID *local_table;
|
111
|
+
ID *local_table; /* must free */
|
112
112
|
int local_table_size;
|
113
113
|
|
114
114
|
/* method, class frame: sizeof(vars) + 1, block frame: sizeof(vars) */
|
@@ -165,7 +165,7 @@ typedef struct rb_iseq_struct {
|
|
165
165
|
/****************/
|
166
166
|
|
167
167
|
VALUE self;
|
168
|
-
VALUE orig;
|
168
|
+
VALUE orig; /* non-NULL if its data have origin */
|
169
169
|
|
170
170
|
/* block inlining */
|
171
171
|
/*
|
@@ -189,7 +189,7 @@ typedef struct rb_iseq_struct {
|
|
189
189
|
|
190
190
|
/* If this instruction sequence came from eval, the string of the
|
191
191
|
source as a String. */
|
192
|
-
VALUE
|
192
|
+
VALUE eval_source;
|
193
193
|
|
194
194
|
/* If we are saving tree nodes (a compile option), then tree_node
|
195
195
|
is the internal parse tree node representation for this
|
@@ -234,8 +234,8 @@ typedef struct rb_vm_struct {
|
|
234
234
|
|
235
235
|
/* signal */
|
236
236
|
struct {
|
237
|
-
|
238
|
-
|
237
|
+
VALUE cmd;
|
238
|
+
int safe;
|
239
239
|
} trap_list[RUBY_NSIG];
|
240
240
|
|
241
241
|
/* hook */
|
@@ -308,8 +308,8 @@ typedef struct rb_thread_struct
|
|
308
308
|
rb_event_flag_t event_flags;
|
309
309
|
int tracing; /* 0 if not tracing. If less than 0, skip that many
|
310
310
|
C call/return pairs */
|
311
|
+
|
311
312
|
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
313
|
|
314
314
|
/* misc */
|
315
315
|
int method_missing_reason;
|
metadata
CHANGED
@@ -4,8 +4,8 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
version: "0.
|
7
|
+
- 3
|
8
|
+
version: "0.3"
|
9
9
|
platform: ruby
|
10
10
|
authors:
|
11
11
|
- R. Bernstein
|
@@ -13,12 +13,12 @@ autorequire:
|
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
15
|
|
16
|
-
date:
|
16
|
+
date: 2011-06-12 00:00:00 -04:00
|
17
17
|
default_executable:
|
18
18
|
dependencies: []
|
19
19
|
|
20
20
|
description: "\n\
|
21
|
-
rb-parsetree is the C extension part of ParseTree for Ruby 1.9.\n"
|
21
|
+
rb-parsetree is the C extension part of ParseTree for Ruby 1.9. A patched version of Ruby 1.9.2 is required.\n"
|
22
22
|
email: rockyb@rubyforge.org
|
23
23
|
executables: []
|
24
24
|
|