nodewrap 0.5.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/COPYING +59 -0
- data/LEGAL +6 -0
- data/LGPL +515 -0
- data/LICENSE +6 -0
- data/README +31 -0
- data/TODO +9 -0
- data/example/README +5 -0
- data/example/simple_client.rb +12 -0
- data/example/simple_server.rb +11 -0
- data/example/triangle_client.rb +7 -0
- data/example/triangle_server.rb +24 -0
- data/ext/MANIFEST +11 -0
- data/ext/builtins.h +25 -0
- data/ext/cached/ruby-1.6.3/COPYING +340 -0
- data/ext/cached/ruby-1.6.3/README +3 -0
- data/ext/cached/ruby-1.6.3/classpath.c +3 -0
- data/ext/cached/ruby-1.6.3/classpath.h +8 -0
- data/ext/cached/ruby-1.6.3/evalinfo.h +62 -0
- data/ext/cached/ruby-1.6.3/global_entry.h +15 -0
- data/ext/cached/ruby-1.6.3/insns_info.c +40 -0
- data/ext/cached/ruby-1.6.3/insns_info.h +19 -0
- data/ext/cached/ruby-1.6.3/node_type_descrip.c +150 -0
- data/ext/cached/ruby-1.6.3/nodeinfo.c +3182 -0
- data/ext/cached/ruby-1.6.3/nodeinfo.h +66 -0
- data/ext/cached/ruby-1.6.4/COPYING +340 -0
- data/ext/cached/ruby-1.6.4/README +3 -0
- data/ext/cached/ruby-1.6.4/classpath.c +3 -0
- data/ext/cached/ruby-1.6.4/classpath.h +8 -0
- data/ext/cached/ruby-1.6.4/evalinfo.h +62 -0
- data/ext/cached/ruby-1.6.4/global_entry.h +15 -0
- data/ext/cached/ruby-1.6.4/insns_info.c +40 -0
- data/ext/cached/ruby-1.6.4/insns_info.h +19 -0
- data/ext/cached/ruby-1.6.4/node_type_descrip.c +150 -0
- data/ext/cached/ruby-1.6.4/nodeinfo.c +3182 -0
- data/ext/cached/ruby-1.6.4/nodeinfo.h +66 -0
- data/ext/cached/ruby-1.6.5/COPYING +56 -0
- data/ext/cached/ruby-1.6.5/GPL +340 -0
- data/ext/cached/ruby-1.6.5/LEGAL +325 -0
- data/ext/cached/ruby-1.6.5/LGPL +504 -0
- data/ext/cached/ruby-1.6.5/README +3 -0
- data/ext/cached/ruby-1.6.5/classpath.c +3 -0
- data/ext/cached/ruby-1.6.5/classpath.h +8 -0
- data/ext/cached/ruby-1.6.5/evalinfo.h +63 -0
- data/ext/cached/ruby-1.6.5/global_entry.h +15 -0
- data/ext/cached/ruby-1.6.5/insns_info.c +40 -0
- data/ext/cached/ruby-1.6.5/insns_info.h +19 -0
- data/ext/cached/ruby-1.6.5/node_type_descrip.c +150 -0
- data/ext/cached/ruby-1.6.5/nodeinfo.c +3182 -0
- data/ext/cached/ruby-1.6.5/nodeinfo.h +66 -0
- data/ext/cached/ruby-1.6.7/COPYING +56 -0
- data/ext/cached/ruby-1.6.7/GPL +340 -0
- data/ext/cached/ruby-1.6.7/LEGAL +308 -0
- data/ext/cached/ruby-1.6.7/LGPL +504 -0
- data/ext/cached/ruby-1.6.7/README +3 -0
- data/ext/cached/ruby-1.6.7/classpath.c +3 -0
- data/ext/cached/ruby-1.6.7/classpath.h +8 -0
- data/ext/cached/ruby-1.6.7/evalinfo.h +63 -0
- data/ext/cached/ruby-1.6.7/global_entry.h +15 -0
- data/ext/cached/ruby-1.6.7/insns_info.c +40 -0
- data/ext/cached/ruby-1.6.7/insns_info.h +19 -0
- data/ext/cached/ruby-1.6.7/node_type_descrip.c +150 -0
- data/ext/cached/ruby-1.6.7/nodeinfo.c +3182 -0
- data/ext/cached/ruby-1.6.7/nodeinfo.h +66 -0
- data/ext/cached/ruby-1.6.8/COPYING +56 -0
- data/ext/cached/ruby-1.6.8/GPL +340 -0
- data/ext/cached/ruby-1.6.8/LEGAL +308 -0
- data/ext/cached/ruby-1.6.8/LGPL +504 -0
- data/ext/cached/ruby-1.6.8/README +3 -0
- data/ext/cached/ruby-1.6.8/classpath.c +3 -0
- data/ext/cached/ruby-1.6.8/classpath.h +8 -0
- data/ext/cached/ruby-1.6.8/evalinfo.h +63 -0
- data/ext/cached/ruby-1.6.8/global_entry.h +15 -0
- data/ext/cached/ruby-1.6.8/insns_info.c +40 -0
- data/ext/cached/ruby-1.6.8/insns_info.h +19 -0
- data/ext/cached/ruby-1.6.8/node_type_descrip.c +150 -0
- data/ext/cached/ruby-1.6.8/nodeinfo.c +3182 -0
- data/ext/cached/ruby-1.6.8/nodeinfo.h +66 -0
- data/ext/cached/ruby-1.8.0/COPYING +56 -0
- data/ext/cached/ruby-1.8.0/GPL +340 -0
- data/ext/cached/ruby-1.8.0/LEGAL +371 -0
- data/ext/cached/ruby-1.8.0/LGPL +504 -0
- data/ext/cached/ruby-1.8.0/README +3 -0
- data/ext/cached/ruby-1.8.0/classpath.c +27 -0
- data/ext/cached/ruby-1.8.0/classpath.h +14 -0
- data/ext/cached/ruby-1.8.0/evalinfo.h +65 -0
- data/ext/cached/ruby-1.8.0/global_entry.h +10 -0
- data/ext/cached/ruby-1.8.0/insns_info.c +40 -0
- data/ext/cached/ruby-1.8.0/insns_info.h +19 -0
- data/ext/cached/ruby-1.8.0/node_type_descrip.c +150 -0
- data/ext/cached/ruby-1.8.0/nodeinfo.c +3199 -0
- data/ext/cached/ruby-1.8.0/nodeinfo.h +66 -0
- data/ext/cached/ruby-1.8.1/COPYING +56 -0
- data/ext/cached/ruby-1.8.1/GPL +340 -0
- data/ext/cached/ruby-1.8.1/LEGAL +371 -0
- data/ext/cached/ruby-1.8.1/LGPL +504 -0
- data/ext/cached/ruby-1.8.1/README +3 -0
- data/ext/cached/ruby-1.8.1/classpath.c +27 -0
- data/ext/cached/ruby-1.8.1/classpath.h +14 -0
- data/ext/cached/ruby-1.8.1/evalinfo.h +59 -0
- data/ext/cached/ruby-1.8.1/global_entry.h +10 -0
- data/ext/cached/ruby-1.8.1/insns_info.c +40 -0
- data/ext/cached/ruby-1.8.1/insns_info.h +19 -0
- data/ext/cached/ruby-1.8.1/node_type_descrip.c +150 -0
- data/ext/cached/ruby-1.8.1/nodeinfo.c +3199 -0
- data/ext/cached/ruby-1.8.1/nodeinfo.h +66 -0
- data/ext/cached/ruby-1.8.2/COPYING +56 -0
- data/ext/cached/ruby-1.8.2/GPL +340 -0
- data/ext/cached/ruby-1.8.2/LEGAL +371 -0
- data/ext/cached/ruby-1.8.2/LGPL +504 -0
- data/ext/cached/ruby-1.8.2/README +3 -0
- data/ext/cached/ruby-1.8.2/classpath.c +45 -0
- data/ext/cached/ruby-1.8.2/classpath.h +17 -0
- data/ext/cached/ruby-1.8.2/evalinfo.h +60 -0
- data/ext/cached/ruby-1.8.2/global_entry.h +10 -0
- data/ext/cached/ruby-1.8.2/insns_info.c +40 -0
- data/ext/cached/ruby-1.8.2/insns_info.h +19 -0
- data/ext/cached/ruby-1.8.2/node_type_descrip.c +150 -0
- data/ext/cached/ruby-1.8.2/nodeinfo.c +3199 -0
- data/ext/cached/ruby-1.8.2/nodeinfo.h +66 -0
- data/ext/cached/ruby-1.8.3/COPYING +56 -0
- data/ext/cached/ruby-1.8.3/GPL +340 -0
- data/ext/cached/ruby-1.8.3/LEGAL +370 -0
- data/ext/cached/ruby-1.8.3/LGPL +504 -0
- data/ext/cached/ruby-1.8.3/README +3 -0
- data/ext/cached/ruby-1.8.3/classpath.c +45 -0
- data/ext/cached/ruby-1.8.3/classpath.h +17 -0
- data/ext/cached/ruby-1.8.3/evalinfo.h +61 -0
- data/ext/cached/ruby-1.8.3/global_entry.h +10 -0
- data/ext/cached/ruby-1.8.3/insns_info.c +40 -0
- data/ext/cached/ruby-1.8.3/insns_info.h +19 -0
- data/ext/cached/ruby-1.8.3/node_type_descrip.c +150 -0
- data/ext/cached/ruby-1.8.3/nodeinfo.c +3199 -0
- data/ext/cached/ruby-1.8.3/nodeinfo.h +66 -0
- data/ext/cached/ruby-1.8.4/COPYING +56 -0
- data/ext/cached/ruby-1.8.4/GPL +340 -0
- data/ext/cached/ruby-1.8.4/LEGAL +370 -0
- data/ext/cached/ruby-1.8.4/LGPL +504 -0
- data/ext/cached/ruby-1.8.4/README +3 -0
- data/ext/cached/ruby-1.8.4/classpath.c +45 -0
- data/ext/cached/ruby-1.8.4/classpath.h +17 -0
- data/ext/cached/ruby-1.8.4/evalinfo.h +61 -0
- data/ext/cached/ruby-1.8.4/global_entry.h +10 -0
- data/ext/cached/ruby-1.8.4/insns_info.c +40 -0
- data/ext/cached/ruby-1.8.4/insns_info.h +19 -0
- data/ext/cached/ruby-1.8.4/node_type_descrip.c +150 -0
- data/ext/cached/ruby-1.8.4/nodeinfo.c +3199 -0
- data/ext/cached/ruby-1.8.4/nodeinfo.h +66 -0
- data/ext/cached/ruby-1.8.5/COPYING +56 -0
- data/ext/cached/ruby-1.8.5/GPL +340 -0
- data/ext/cached/ruby-1.8.5/LEGAL +370 -0
- data/ext/cached/ruby-1.8.5/LGPL +504 -0
- data/ext/cached/ruby-1.8.5/README +3 -0
- data/ext/cached/ruby-1.8.5/classpath.c +45 -0
- data/ext/cached/ruby-1.8.5/classpath.h +17 -0
- data/ext/cached/ruby-1.8.5/evalinfo.h +61 -0
- data/ext/cached/ruby-1.8.5/global_entry.h +10 -0
- data/ext/cached/ruby-1.8.5/insns_info.c +40 -0
- data/ext/cached/ruby-1.8.5/insns_info.h +19 -0
- data/ext/cached/ruby-1.8.5/node_type_descrip.c +150 -0
- data/ext/cached/ruby-1.8.5/nodeinfo.c +3187 -0
- data/ext/cached/ruby-1.8.5/nodeinfo.h +64 -0
- data/ext/cached/ruby-1.8.6/COPYING +56 -0
- data/ext/cached/ruby-1.8.6/GPL +340 -0
- data/ext/cached/ruby-1.8.6/LEGAL +370 -0
- data/ext/cached/ruby-1.8.6/LGPL +504 -0
- data/ext/cached/ruby-1.8.6/README +3 -0
- data/ext/cached/ruby-1.8.6/classpath.c +45 -0
- data/ext/cached/ruby-1.8.6/classpath.h +17 -0
- data/ext/cached/ruby-1.8.6/evalinfo.h +61 -0
- data/ext/cached/ruby-1.8.6/global_entry.h +10 -0
- data/ext/cached/ruby-1.8.6/insns_info.c +40 -0
- data/ext/cached/ruby-1.8.6/insns_info.h +19 -0
- data/ext/cached/ruby-1.8.6/node_type_descrip.c +150 -0
- data/ext/cached/ruby-1.8.6/nodeinfo.c +3187 -0
- data/ext/cached/ruby-1.8.6/nodeinfo.h +64 -0
- data/ext/classpath.c +42 -0
- data/ext/classpath.c.rpp +28 -0
- data/ext/classpath.h +17 -0
- data/ext/classpath.h.rpp +35 -0
- data/ext/evalinfo.h +21 -0
- data/ext/evalinfo.h.rpp +49 -0
- data/ext/extconf.rb +68 -0
- data/ext/generate.rb +201 -0
- data/ext/generate_cached.rb +49 -0
- data/ext/global_entry.h +10 -0
- data/ext/global_entry.h.rpp +25 -0
- data/ext/insns_info.c +6079 -0
- data/ext/insns_info.c.rpp +210 -0
- data/ext/insns_info.h +819 -0
- data/ext/insns_info.h.rpp +50 -0
- data/ext/node_type_descrip.c +148 -0
- data/ext/node_type_descrip.c.rpp +72 -0
- data/ext/node_type_descrip.h +17 -0
- data/ext/node_type_descrip.rb +169 -0
- data/ext/nodeinfo.c +3164 -0
- data/ext/nodeinfo.c.rpp +519 -0
- data/ext/nodeinfo.h +67 -0
- data/ext/nodeinfo.h.rpp +27 -0
- data/ext/nodewrap.c +2576 -0
- data/ext/nodewrap.h +20 -0
- data/ext/read_node_h.rb +19 -0
- data/ext/ruby_source_dir.rb +15 -0
- data/ext/ruby_version.h +12 -0
- data/ext/ruby_version_code.rb +16 -0
- data/ext/rubypp.rb +97 -0
- data/ext/test.rb +15 -0
- data/generate_rdoc.rb +33 -0
- data/install.rb +1022 -0
- data/lib/as_code.rb +347 -0
- data/lib/as_expression.rb +657 -0
- data/lib/bytedecoder.rb +848 -0
- data/lib/classtree.rb +54 -0
- data/lib/methodsig.rb +266 -0
- data/lib/node_to_a.rb +34 -0
- data/lib/nodepp.rb +71 -0
- data/lib/nwdebug.rb +18 -0
- data/lib/nwdump.rb +53 -0
- data/lib/nwobfusc.rb +57 -0
- data/lib/procsig.rb +182 -0
- data/lib/test.rb +8 -0
- data/metaconfig +10 -0
- data/post-config.rb +53 -0
- data/post-setup.rb +9 -0
- data/pre-config.rb +1 -0
- data/run_tests.rb +48 -0
- data/test/expression_samples.rb +158 -0
- data/test/node_samples.rb +122 -0
- data/test/test.rb +39 -0
- data/test/test2.rb +7 -0
- data/test/test3.rb +5 -0
- data/test/test4.rb +5 -0
- data/test/test_as_code.rb +249 -0
- data/test/test_as_expression.rb +222 -0
- data/test/test_methodsig.rb +189 -0
- data/test/test_nodewrap.rb +369 -0
- metadata +286 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'test/unit/ui/console/testrunner'
|
|
3
|
+
|
|
4
|
+
dir = File.dirname(__FILE__)
|
|
5
|
+
$:.unshift(dir) if not $:.include?(dir)
|
|
6
|
+
$:.unshift("#{dir}/../lib") if not $:.include?("#{dir}/../lib")
|
|
7
|
+
$:.unshift("#{dir}/../ext") if not $:.include?("#{dir}/../ext")
|
|
8
|
+
|
|
9
|
+
require 'nodewrap'
|
|
10
|
+
require 'methodsig'
|
|
11
|
+
|
|
12
|
+
$stdout.sync = true
|
|
13
|
+
$stderr.sync = true
|
|
14
|
+
|
|
15
|
+
class TC_Methodsig < Test::Unit::TestCase
|
|
16
|
+
def no_args_no_parens
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def test_no_args_no_parens
|
|
20
|
+
name = :no_args_no_parens
|
|
21
|
+
sig = method(name).signature
|
|
22
|
+
assert_equal self.class, sig.origin_class
|
|
23
|
+
assert_equal name.to_s, sig.name
|
|
24
|
+
assert_equal [], sig.arg_names
|
|
25
|
+
assert_equal Hash.new, sig.arg_info
|
|
26
|
+
assert_equal "#{self.class.name}##{name}()", sig.to_s
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def no_args_with_parens()
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_no_args_with_parens
|
|
33
|
+
name = :no_args_with_parens
|
|
34
|
+
sig = method(name).signature
|
|
35
|
+
assert_equal self.class, sig.origin_class
|
|
36
|
+
assert_equal name.to_s, sig.name
|
|
37
|
+
assert_equal [], sig.arg_names
|
|
38
|
+
assert_equal Hash.new, sig.arg_info
|
|
39
|
+
assert_equal "#{self.class.name}##{name}()", sig.to_s
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def one_arg(a)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def test_one_arg
|
|
46
|
+
name = :one_arg
|
|
47
|
+
sig = method(name).signature
|
|
48
|
+
assert_equal self.class, sig.origin_class
|
|
49
|
+
assert_equal name.to_s, sig.name
|
|
50
|
+
assert_equal [:a], sig.arg_names
|
|
51
|
+
assert_equal Hash[:a=>"a"], sig.arg_info
|
|
52
|
+
assert_equal "#{self.class.name}##{name}(a)", sig.to_s
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def two_args(a, b)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def test_two_args
|
|
59
|
+
name = :two_args
|
|
60
|
+
sig = method(name).signature
|
|
61
|
+
assert_equal self.class, sig.origin_class
|
|
62
|
+
assert_equal name.to_s, sig.name
|
|
63
|
+
assert_equal [:a, :b], sig.arg_names
|
|
64
|
+
assert_equal Hash[:a=>"a", :b=>"b"], sig.arg_info
|
|
65
|
+
assert_equal "#{self.class.name}##{name}(a, b)", sig.to_s
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def three_args(a, b, c)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def test_three_args
|
|
72
|
+
name = :three_args
|
|
73
|
+
sig = method(name).signature
|
|
74
|
+
assert_equal self.class, sig.origin_class
|
|
75
|
+
assert_equal name.to_s, sig.name
|
|
76
|
+
assert_equal [:a, :b, :c], sig.arg_names
|
|
77
|
+
assert_equal Hash[:a=>"a", :b=>"b", :c=>"c"], sig.arg_info
|
|
78
|
+
assert_equal "#{self.class.name}##{name}(a, b, c)", sig.to_s
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def block_arg(&b)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def test_block_arg
|
|
85
|
+
name = :block_arg
|
|
86
|
+
sig = method(name).signature
|
|
87
|
+
assert_equal self.class, sig.origin_class
|
|
88
|
+
assert_equal name.to_s, sig.name
|
|
89
|
+
assert_equal [:b], sig.arg_names
|
|
90
|
+
assert_equal Hash[:b=>"&b"], sig.arg_info
|
|
91
|
+
assert_equal "#{self.class.name}##{name}(&b)", sig.to_s
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def rest_arg(*r)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def test_rest_arg
|
|
98
|
+
name = :rest_arg
|
|
99
|
+
sig = method(name).signature
|
|
100
|
+
assert_equal self.class, sig.origin_class
|
|
101
|
+
assert_equal name.to_s, sig.name
|
|
102
|
+
assert_equal [:r], sig.arg_names
|
|
103
|
+
assert_equal Hash[:r=>"*r"], sig.arg_info
|
|
104
|
+
assert_equal "#{self.class.name}##{name}(*r)", sig.to_s
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def block_and_rest_arg(*r, &b)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def test_block_and_rest_arg
|
|
111
|
+
name = :block_and_rest_arg
|
|
112
|
+
sig = method(name).signature
|
|
113
|
+
assert_equal self.class, sig.origin_class
|
|
114
|
+
assert_equal name.to_s, sig.name
|
|
115
|
+
assert_equal [:r, :b], sig.arg_names
|
|
116
|
+
assert_equal Hash[:r=>"*r", :b=>"&b"], sig.arg_info
|
|
117
|
+
assert_equal "#{self.class.name}##{name}(*r, &b)", sig.to_s
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def default_arg(a = 1)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def test_default_arg
|
|
124
|
+
name = :default_arg
|
|
125
|
+
sig = method(name).signature
|
|
126
|
+
assert_equal self.class, sig.origin_class
|
|
127
|
+
assert_equal name.to_s, sig.name
|
|
128
|
+
assert_equal [:a], sig.arg_names
|
|
129
|
+
assert_equal Hash[:a=>"a=1"], sig.arg_info
|
|
130
|
+
assert_equal "#{self.class.name}##{name}(a=1)", sig.to_s
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def default_and_nondefault_arg(a, b = 42)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def test_default_and_nondefault_arg
|
|
137
|
+
name = :default_and_nondefault_arg
|
|
138
|
+
sig = method(name).signature
|
|
139
|
+
assert_equal self.class, sig.origin_class
|
|
140
|
+
assert_equal name.to_s, sig.name
|
|
141
|
+
assert_equal [:a, :b], sig.arg_names
|
|
142
|
+
assert_equal Hash[:a=>"a", :b=>"b=42"], sig.arg_info
|
|
143
|
+
assert_equal "#{self.class.name}##{name}(a, b=42)", sig.to_s
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def default_and_rest(a = 42, *r)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def test_default_and_rest
|
|
150
|
+
name = :default_and_rest
|
|
151
|
+
sig = method(name).signature
|
|
152
|
+
assert_equal self.class, sig.origin_class
|
|
153
|
+
assert_equal name.to_s, sig.name
|
|
154
|
+
assert_equal [:a, :r], sig.arg_names
|
|
155
|
+
assert_equal Hash[:a=>"a=42", :r=>"*r"], sig.arg_info
|
|
156
|
+
assert_equal "#{self.class.name}##{name}(a=42, *r)", sig.to_s
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def default_and_rest_and_block(a = 42, *r, &b)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def test_default_and_rest_and_block
|
|
163
|
+
name = :default_and_rest_and_block
|
|
164
|
+
sig = method(name).signature
|
|
165
|
+
assert_equal self.class, sig.origin_class
|
|
166
|
+
assert_equal name.to_s, sig.name
|
|
167
|
+
assert_equal [:a, :r, :b], sig.arg_names
|
|
168
|
+
assert_equal Hash[:a=>"a=42", :r=>"*r", :b=>"&b"], sig.arg_info
|
|
169
|
+
assert_equal "#{self.class.name}##{name}(a=42, *r, &b)", sig.to_s
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def nondefault_and_default_and_rest_and_block(a, b = 42, *r, &block)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def test_nondefault_and_default_and_rest_and_block
|
|
176
|
+
name = :nondefault_and_default_and_rest_and_block
|
|
177
|
+
sig = method(name).signature
|
|
178
|
+
assert_equal self.class, sig.origin_class
|
|
179
|
+
assert_equal name.to_s, sig.name
|
|
180
|
+
assert_equal [:a, :b, :r, :block], sig.arg_names
|
|
181
|
+
assert_equal Hash[:a=>"a", :b=>"b=42", :r=>"*r", :block=>"&block"], sig.arg_info
|
|
182
|
+
assert_equal "#{self.class.name}##{name}(a, b=42, *r, &block)", sig.to_s
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
if __FILE__ == $0 then
|
|
187
|
+
exit Test::Unit::AutoRunner.run
|
|
188
|
+
end
|
|
189
|
+
|
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'test/unit/ui/console/testrunner'
|
|
3
|
+
|
|
4
|
+
dir = File.dirname(__FILE__)
|
|
5
|
+
$:.unshift(dir) if not $:.include?(dir)
|
|
6
|
+
$:.unshift("#{dir}/../lib") if not $:.include?("#{dir}/../lib")
|
|
7
|
+
$:.unshift("#{dir}/../ext") if not $:.include?("#{dir}/../ext")
|
|
8
|
+
|
|
9
|
+
require 'nodewrap'
|
|
10
|
+
require 'pp'
|
|
11
|
+
require 'nodepp'
|
|
12
|
+
|
|
13
|
+
require "node_samples"
|
|
14
|
+
|
|
15
|
+
$stdout.sync = true
|
|
16
|
+
$stderr.sync = true
|
|
17
|
+
|
|
18
|
+
# Instance methods defined in Class get returned by
|
|
19
|
+
# rb_class_instance_methods, though they are not in the class's method
|
|
20
|
+
# table. Having this here ensures that we don't accidentally try to
|
|
21
|
+
# dump methods that aren't in the class we are trying to dump.
|
|
22
|
+
class Class
|
|
23
|
+
def xyzzy
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
class TC_Nodewrap < Test::Unit::TestCase
|
|
28
|
+
module Foo
|
|
29
|
+
def foo(n=1)
|
|
30
|
+
# A fancy way to return 42
|
|
31
|
+
if false then
|
|
32
|
+
answer = 0
|
|
33
|
+
else
|
|
34
|
+
answer = 0
|
|
35
|
+
(1..42).each do |i|
|
|
36
|
+
answer += (i / i)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
return n * answer
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
include Foo
|
|
44
|
+
|
|
45
|
+
Tmp_Foo = nil
|
|
46
|
+
|
|
47
|
+
# For the cvar proc test
|
|
48
|
+
@@a = 42
|
|
49
|
+
|
|
50
|
+
def initialize(test_method_name)
|
|
51
|
+
# TODO: This seems to be the only way to get tests defined with #
|
|
52
|
+
# define_method to run on 1.8.1 and earlier.
|
|
53
|
+
@method_name = test_method_name
|
|
54
|
+
@test_passed = true
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def test_node_eval
|
|
58
|
+
node = Node.compile_string('1 + 1')
|
|
59
|
+
assert_equal 2, node.eval(self)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
if not Object.const_defined?(:VM) then
|
|
63
|
+
define_method(:test_proc_body) do
|
|
64
|
+
p = proc { 1 + 1 }
|
|
65
|
+
assert_equal p.call, p.body.eval(self)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def test_method_node
|
|
70
|
+
m = method(:foo)
|
|
71
|
+
n = m.body
|
|
72
|
+
if Object.const_defined?(:VM) and
|
|
73
|
+
VM.const_defined?(:InstructionSequence) then
|
|
74
|
+
# YARV
|
|
75
|
+
assert_equal Node::METHOD, n.class
|
|
76
|
+
else
|
|
77
|
+
# pre-YARV
|
|
78
|
+
assert_equal Node::SCOPE, n.class
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def test_add_method
|
|
83
|
+
m = method(:foo)
|
|
84
|
+
n = m.body
|
|
85
|
+
klass = Class.new
|
|
86
|
+
klass.instance_eval do
|
|
87
|
+
add_method(:foo, n, Noex::PUBLIC)
|
|
88
|
+
end
|
|
89
|
+
obj = klass.new
|
|
90
|
+
assert_equal 42, obj.foo
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def test_marshal_node
|
|
94
|
+
m = method(:foo)
|
|
95
|
+
n = m.body
|
|
96
|
+
d = Marshal.dump(n)
|
|
97
|
+
n2 = Marshal.load(d)
|
|
98
|
+
assert_equal n.nd_file, n2.nd_file
|
|
99
|
+
assert_equal n.nd_type, n2.nd_type
|
|
100
|
+
assert_equal n.flags, n2.flags
|
|
101
|
+
klass = Class.new;
|
|
102
|
+
klass.instance_eval do
|
|
103
|
+
add_method(:foo, n2, Noex::PUBLIC)
|
|
104
|
+
end
|
|
105
|
+
obj = klass.new
|
|
106
|
+
assert_equal 42, obj.foo
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def test_marshal_proc
|
|
110
|
+
p = proc { 1 + 1 }
|
|
111
|
+
d = Marshal.dump(p)
|
|
112
|
+
u = Marshal.load(d)
|
|
113
|
+
p2 = u.bind(binding)
|
|
114
|
+
assert_equal(p.call, p2.call)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
class MarshalMethodHelper
|
|
118
|
+
include Foo
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def test_marshal_method
|
|
122
|
+
o = MarshalMethodHelper.new
|
|
123
|
+
m = o.method(:foo)
|
|
124
|
+
d = Marshal.dump(m)
|
|
125
|
+
m2 = Marshal.load(d)
|
|
126
|
+
assert_equal m.call, m2.call
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def test_marshal_unbound_method
|
|
130
|
+
o = MarshalMethodHelper.new
|
|
131
|
+
u = o.method(:foo).unbind
|
|
132
|
+
d = Marshal.dump(u)
|
|
133
|
+
u2 = Marshal.load(d)
|
|
134
|
+
m = u.bind(o)
|
|
135
|
+
m2 = u.bind(o)
|
|
136
|
+
assert_equal m.call, m2.call
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def test_ruby_eval_tree
|
|
140
|
+
assert Node === $ruby_eval_tree
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def test_ruby_eval_tree_begin
|
|
144
|
+
assert_equal nil, $ruby_eval_tree_begin
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def test_proc_unbind
|
|
148
|
+
p = proc { 1 + 1 }
|
|
149
|
+
u = p.unbind
|
|
150
|
+
p2 = u.bind(binding)
|
|
151
|
+
assert_equal(p.call, p2.call)
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
class TestClassBase
|
|
155
|
+
# for testing super()
|
|
156
|
+
def foo
|
|
157
|
+
return 42
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
class TestClass < TestClassBase
|
|
162
|
+
include Foo
|
|
163
|
+
FOO = 1
|
|
164
|
+
@foo = 2
|
|
165
|
+
@@foo = 3
|
|
166
|
+
class << self
|
|
167
|
+
FOO = 4
|
|
168
|
+
@foo = 5
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# for testing cvar
|
|
172
|
+
# (can't be in base class due to change in 1.9 of class var lookup)
|
|
173
|
+
@@a = 42
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
@@test_class = TestClass
|
|
177
|
+
|
|
178
|
+
def setup
|
|
179
|
+
self.class.instance_eval do
|
|
180
|
+
remove_const :TestClass if defined?(TestClass)
|
|
181
|
+
const_set :TestClass, @@test_class
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def test_marshal_class
|
|
186
|
+
begin
|
|
187
|
+
assert_equal 5, TestClass.singleton_class.instance_eval('@foo')
|
|
188
|
+
assert_equal 2, TestClass.instance_eval('@foo')
|
|
189
|
+
|
|
190
|
+
d = Marshal.dump(TestClass)
|
|
191
|
+
|
|
192
|
+
# Thread critical should have been reset by the class restorer
|
|
193
|
+
if not defined?(VM) then
|
|
194
|
+
assert_equal false, Thread.critical
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# Make sure the class instance variables are still set
|
|
198
|
+
assert_equal 5, TestClass.singleton_class.instance_eval('@foo')
|
|
199
|
+
assert_equal 2, TestClass.instance_eval('@foo')
|
|
200
|
+
|
|
201
|
+
self.class.instance_eval { remove_const :TestClass }
|
|
202
|
+
|
|
203
|
+
Marshal.load(d)
|
|
204
|
+
c = TestClass
|
|
205
|
+
assert_equal Class, c.class
|
|
206
|
+
a = c.ancestors
|
|
207
|
+
assert a.include?(Object)
|
|
208
|
+
assert a.include?(Kernel)
|
|
209
|
+
assert a.include?(Foo)
|
|
210
|
+
assert a.include?(c)
|
|
211
|
+
|
|
212
|
+
# Constant lookup
|
|
213
|
+
assert_equal 1, c::FOO
|
|
214
|
+
|
|
215
|
+
# Constant lookup in singleton class
|
|
216
|
+
result = class << c
|
|
217
|
+
FOO
|
|
218
|
+
end
|
|
219
|
+
assert_equal 4, result
|
|
220
|
+
|
|
221
|
+
# Class instance variable lookup
|
|
222
|
+
result = c.instance_eval do
|
|
223
|
+
@foo
|
|
224
|
+
end
|
|
225
|
+
assert_equal 2, result
|
|
226
|
+
|
|
227
|
+
# Singleton class instance variable lookup
|
|
228
|
+
result = class << c
|
|
229
|
+
@foo
|
|
230
|
+
end
|
|
231
|
+
assert_equal 5, result
|
|
232
|
+
|
|
233
|
+
# Class variable lookup
|
|
234
|
+
# This is a little bit messy, but it was the only way I could figure
|
|
235
|
+
# to get at @@foo
|
|
236
|
+
self.class.instance_eval do
|
|
237
|
+
remove_const :Tmp_Foo
|
|
238
|
+
const_set :Tmp_Foo, c
|
|
239
|
+
end
|
|
240
|
+
eval "class Tmp_Foo; $at_at_foo = @@foo; end"
|
|
241
|
+
result = $at_at_foo
|
|
242
|
+
assert_equal 3, result
|
|
243
|
+
|
|
244
|
+
# Test method call
|
|
245
|
+
f = c.new
|
|
246
|
+
assert_equal 42, f.foo()
|
|
247
|
+
assert_equal 42*42, f.foo(42)
|
|
248
|
+
|
|
249
|
+
# Thread critical should have been reset by the class restorer
|
|
250
|
+
if not defined?(VM) then
|
|
251
|
+
assert_equal false, Thread.critical
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
# Also make sure the class instance variables are still set
|
|
255
|
+
assert_equal 5, TestClass.singleton_class.instance_eval('@foo')
|
|
256
|
+
assert_equal 2, TestClass.instance_eval('@foo')
|
|
257
|
+
|
|
258
|
+
ensure
|
|
259
|
+
if not defined?(VM) then
|
|
260
|
+
Thread.critical = false
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
extend Test::Unit::Assertions
|
|
266
|
+
|
|
267
|
+
Method_Node_Samples.each do |node_name, sample_code|
|
|
268
|
+
p = proc {
|
|
269
|
+
c = TestClass.dup
|
|
270
|
+
c.class_eval <<-END_DEF
|
|
271
|
+
def foo
|
|
272
|
+
#{sample_code}
|
|
273
|
+
end
|
|
274
|
+
END_DEF
|
|
275
|
+
TC_Nodewrap.const_set("TestClass__#{node_name}", c)
|
|
276
|
+
|
|
277
|
+
o = c.new
|
|
278
|
+
m = o.method(:foo)
|
|
279
|
+
n = m.body
|
|
280
|
+
# puts "dumping first method"
|
|
281
|
+
# pp o.method(:foo).body
|
|
282
|
+
d = Marshal.dump(n)
|
|
283
|
+
n2 = Marshal.load(d)
|
|
284
|
+
|
|
285
|
+
klass2 = Class.new(TestClassBase)
|
|
286
|
+
klass2.class_eval do
|
|
287
|
+
# for testing cvar
|
|
288
|
+
# (can't be in base class due to change in 1.9 of class var lookup)
|
|
289
|
+
@@a = 42
|
|
290
|
+
add_method(:foo, n2, Noex::PUBLIC)
|
|
291
|
+
end
|
|
292
|
+
obj1 = o
|
|
293
|
+
obj2 = klass2.new
|
|
294
|
+
|
|
295
|
+
orig_result = nil
|
|
296
|
+
orig_exc = nil
|
|
297
|
+
begin
|
|
298
|
+
orig_result = o.foo() { 17 }
|
|
299
|
+
rescue Exception => exc
|
|
300
|
+
orig_exc = exc
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
# puts "getting obj2 method"
|
|
304
|
+
# m = obj2.method(:foo)
|
|
305
|
+
# puts "getting obj2 method body"
|
|
306
|
+
# b = m.body
|
|
307
|
+
# puts "getting type"
|
|
308
|
+
# p b.class
|
|
309
|
+
# p b.members
|
|
310
|
+
# p b.rval
|
|
311
|
+
# p b.next
|
|
312
|
+
# p b.tbl
|
|
313
|
+
# puts "dumping second method"
|
|
314
|
+
# pp obj2.method(:foo).body
|
|
315
|
+
dup_result = nil
|
|
316
|
+
dup_exc = nil
|
|
317
|
+
begin
|
|
318
|
+
dup_result = obj2.foo() { 17 }
|
|
319
|
+
rescue Exception => exc
|
|
320
|
+
dup_exc = exc
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
assert_equal orig_exc, dup_exc
|
|
324
|
+
assert_equal orig_result, dup_result
|
|
325
|
+
}
|
|
326
|
+
define_method "test_dump_method_#{node_name}", p
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
Proc_Node_Samples.each do |node_name, sample_code|
|
|
330
|
+
p = proc {
|
|
331
|
+
p_orig = eval <<-END_DEF
|
|
332
|
+
proc {
|
|
333
|
+
#{sample_code}
|
|
334
|
+
}
|
|
335
|
+
END_DEF
|
|
336
|
+
|
|
337
|
+
#puts "dumping"
|
|
338
|
+
d = Marshal.dump(p_orig)
|
|
339
|
+
#puts "loading"
|
|
340
|
+
u = Marshal.load(d)
|
|
341
|
+
p_new = u.bind(binding)
|
|
342
|
+
|
|
343
|
+
orig_result = nil
|
|
344
|
+
orig_exc = nil
|
|
345
|
+
begin
|
|
346
|
+
orig_result = p_orig.call
|
|
347
|
+
rescue Exception => exc
|
|
348
|
+
orig_exc = exc
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
dup_result = nil
|
|
352
|
+
dup_exc = nil
|
|
353
|
+
begin
|
|
354
|
+
dup_result = p_new.call
|
|
355
|
+
rescue Exception => exc
|
|
356
|
+
dup_exc = exc
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
assert_equal orig_exc, dup_exc
|
|
360
|
+
assert_equal orig_result, dup_result
|
|
361
|
+
}
|
|
362
|
+
define_method "test_dump_proc_#{node_name}", p
|
|
363
|
+
end
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
if __FILE__ == $0 then
|
|
367
|
+
exit Test::Unit::AutoRunner.run
|
|
368
|
+
end
|
|
369
|
+
|