live_ast 0.2.3 → 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/CHANGES.rdoc +13 -0
- data/MANIFEST +1 -3
- data/README.rdoc +47 -49
- data/Rakefile +7 -8
- data/devel/jumpstart.rb +101 -192
- data/lib/live_ast/base.rb +6 -1
- data/lib/live_ast/linker.rb +1 -1
- data/lib/live_ast/to_ruby.rb +1 -12
- data/lib/live_ast/version.rb +1 -1
- data/test/ast_eval_feature_test.rb +1 -1
- data/test/ast_load_feature_test.rb +1 -1
- data/test/backtrace_test.rb +1 -1
- data/test/covert_define_method_test.rb +2 -2
- data/test/def_test.rb +1 -1
- data/test/define_method_test.rb +1 -1
- data/test/define_singleton_method_test.rb +1 -1
- data/test/encoding_test.rb +3 -3
- data/test/error_test.rb +4 -4
- data/test/eval_test.rb +1 -1
- data/test/flush_cache_test.rb +4 -4
- data/test/lambda_test.rb +1 -1
- data/test/load_path_test.rb +3 -3
- data/test/load_test.rb +2 -2
- data/test/{shared/main.rb → main.rb} +26 -16
- data/test/noninvasive_test.rb +1 -1
- data/test/readme_test.rb +10 -8
- data/test/recursive_eval_test.rb +1 -1
- data/test/redefine_method_test.rb +1 -1
- data/test/reload_test.rb +1 -1
- data/test/stdlib_test.rb +1 -1
- data/test/thread_test.rb +1 -1
- data/test/to_ast_feature_test.rb +1 -1
- data/test/to_ruby_feature_test.rb +1 -1
- data/test/to_ruby_test.rb +4 -2
- metadata +8 -95
- data/lib/live_ast/parser.rb +0 -48
- data/test/shared/ast_generators.rb +0 -124
data/test/flush_cache_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'main'
|
2
2
|
|
3
3
|
# test for flushing side-effects: unsort this TestCase from other
|
4
4
|
# TestCases.
|
@@ -39,7 +39,7 @@ define_unsorted_test_case "FlushCacheTest", RegularTest do
|
|
39
39
|
|
40
40
|
LiveAST.flush_cache
|
41
41
|
|
42
|
-
|
42
|
+
assert_raises LiveAST::FlushedError do
|
43
43
|
klass.instance_method(:g).to_ast
|
44
44
|
end
|
45
45
|
end
|
@@ -59,7 +59,7 @@ define_unsorted_test_case "FlushCacheTest", RegularTest do
|
|
59
59
|
assert_equal f_ast.object_id,
|
60
60
|
klass.instance_method(:f).to_ast.object_id
|
61
61
|
|
62
|
-
|
62
|
+
assert_raises LiveAST::FlushedError do
|
63
63
|
klass.instance_method(:g).to_ast
|
64
64
|
end
|
65
65
|
end
|
@@ -91,7 +91,7 @@ define_unsorted_test_case "FlushCacheTest", RegularTest do
|
|
91
91
|
|
92
92
|
assert_equal a_ast.object_id, a.to_ast.object_id
|
93
93
|
|
94
|
-
|
94
|
+
assert_raises LiveAST::FlushedError do
|
95
95
|
b.to_ast
|
96
96
|
end
|
97
97
|
end
|
data/test/lambda_test.rb
CHANGED
data/test/load_path_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'main'
|
2
2
|
|
3
3
|
class AAA_LoadPathTest < BaseTest
|
4
4
|
include FileUtils
|
@@ -58,10 +58,10 @@ class AAA_LoadPathTest < BaseTest
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def compare_load_errors(file)
|
61
|
-
orig =
|
61
|
+
orig = assert_raises LoadError do
|
62
62
|
load file
|
63
63
|
end
|
64
|
-
live =
|
64
|
+
live = assert_raises LoadError do
|
65
65
|
LiveAST.load file
|
66
66
|
end
|
67
67
|
assert_equal orig.message, live.message
|
data/test/load_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'main'
|
2
2
|
|
3
3
|
class AAA_LoadFileTest < BaseTest
|
4
4
|
class << self
|
@@ -20,7 +20,7 @@ class AAA_LoadFileTest < BaseTest
|
|
20
20
|
assert_equal true, ret
|
21
21
|
assert_equal :code_a, AAA_LoadFileTest.flag
|
22
22
|
|
23
|
-
|
23
|
+
assert_raises NameError do
|
24
24
|
eval("x", TOPLEVEL_BINDING)
|
25
25
|
end
|
26
26
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
$LOAD_PATH.unshift File.dirname(__FILE__) + '
|
1
|
+
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
2
2
|
|
3
3
|
# require first for stdlib_test
|
4
4
|
require 'pp'
|
@@ -7,10 +7,9 @@ require 'fileutils'
|
|
7
7
|
|
8
8
|
require 'minitest/unit'
|
9
9
|
require 'minitest/mock'
|
10
|
-
require 'minitest/autorun'
|
11
|
-
require 'live_ast/base'
|
10
|
+
require 'minitest/autorun' unless defined? Rake
|
12
11
|
|
13
|
-
|
12
|
+
require 'live_ast/base'
|
14
13
|
|
15
14
|
def define_unsorted_test_case(name, superclass, &block)
|
16
15
|
klass = Class.new superclass, &block
|
@@ -48,23 +47,36 @@ class JLMiniTest < MiniTest::Unit::TestCase
|
|
48
47
|
end
|
49
48
|
end
|
50
49
|
|
51
|
-
alias_method :assert_raise, :assert_raises
|
52
|
-
alias_method :assert_not_equal, :refute_equal
|
53
|
-
alias_method :assert_not_nil, :refute_nil
|
54
|
-
|
55
50
|
def assert_nothing_raised
|
56
51
|
assert_equal 3, 3
|
57
52
|
yield
|
58
53
|
rescue => ex
|
59
54
|
raise MiniTest::Assertion,
|
60
|
-
|
55
|
+
exception_details(ex, "Expected nothing raised, but got:")
|
61
56
|
end
|
57
|
+
|
58
|
+
%w[
|
59
|
+
empty
|
60
|
+
equal
|
61
|
+
in_delta
|
62
|
+
in_epsilon
|
63
|
+
includes
|
64
|
+
instance_of
|
65
|
+
kind_of
|
66
|
+
match
|
67
|
+
nil
|
68
|
+
operator
|
69
|
+
respond_to
|
70
|
+
same
|
71
|
+
].each { |name|
|
72
|
+
alias_method "assert_not_#{name}", "refute_#{name}"
|
73
|
+
}
|
62
74
|
end
|
63
75
|
|
64
76
|
class BaseTest < JLMiniTest
|
65
|
-
include
|
77
|
+
include LiveAST.parser::TestForms
|
66
78
|
|
67
|
-
DATA_DIR = File.expand_path(File.dirname(__FILE__) + "
|
79
|
+
DATA_DIR = File.expand_path(File.dirname(__FILE__) + "/data")
|
68
80
|
|
69
81
|
def self.stdlib_has_source?
|
70
82
|
case RUBY_ENGINE
|
@@ -78,14 +90,12 @@ class BaseTest < JLMiniTest
|
|
78
90
|
path = DATA_DIR + "/" + basename
|
79
91
|
FileUtils.mkdir DATA_DIR unless File.directory? DATA_DIR
|
80
92
|
|
93
|
+
FileUtils.rm_f path
|
81
94
|
begin
|
82
|
-
FileUtils.rm_f path
|
83
95
|
yield path
|
84
96
|
ensure
|
85
|
-
|
86
|
-
|
87
|
-
FileUtils.rmdir DATA_DIR rescue nil
|
88
|
-
end
|
97
|
+
FileUtils.rm_f path
|
98
|
+
FileUtils.rmdir DATA_DIR rescue nil
|
89
99
|
end
|
90
100
|
end
|
91
101
|
|
data/test/noninvasive_test.rb
CHANGED
data/test/readme_test.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'main'
|
2
2
|
require_relative '../devel/jumpstart'
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
if LiveAST.parser.respond_to?(:unified?) and LiveAST.parser.unified?
|
5
|
+
sections = [
|
6
|
+
"Synopsis",
|
7
|
+
"Loading Source",
|
8
|
+
"Noninvasive Interface",
|
9
|
+
"+to_ruby+",
|
10
|
+
]
|
10
11
|
|
11
|
-
Jumpstart.doc_to_test("README.rdoc", *sections)
|
12
|
+
Jumpstart.doc_to_test("README.rdoc", *sections)
|
13
|
+
end
|
data/test/recursive_eval_test.rb
CHANGED
data/test/reload_test.rb
CHANGED
data/test/stdlib_test.rb
CHANGED
data/test/thread_test.rb
CHANGED
data/test/to_ast_feature_test.rb
CHANGED
data/test/to_ruby_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require_relative '
|
1
|
+
require_relative 'main'
|
2
2
|
|
3
3
|
class AAC_ToRubyTest < RegularTest
|
4
4
|
def setup
|
@@ -83,4 +83,6 @@ class AAC_ToRubyTest < RegularTest
|
|
83
83
|
end.instance_method(:f).to_ruby
|
84
84
|
assert_equal src, dst
|
85
85
|
end
|
86
|
-
end
|
86
|
+
end if (un = LiveAST.parser::Unparser rescue nil) &&
|
87
|
+
un.respond_to?(:ruby2ruby?) &&
|
88
|
+
un.ruby2ruby?
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: live_ast
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.5.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- James M. Lawrence
|
@@ -10,18 +10,18 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-02-
|
13
|
+
date: 2011-02-24 00:00:00 -05:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
|
-
name:
|
17
|
+
name: live_ast_ruby_parser
|
18
18
|
prerelease: false
|
19
19
|
requirement: &id001 !ruby/object:Gem::Requirement
|
20
20
|
none: false
|
21
21
|
requirements:
|
22
|
-
- - "
|
22
|
+
- - ">="
|
23
23
|
- !ruby/object:Gem::Version
|
24
|
-
version:
|
24
|
+
version: "0"
|
25
25
|
type: :runtime
|
26
26
|
version_requirements: *id001
|
27
27
|
description: LiveAST enables a program to find the ASTs of objects created by dynamically generated code.
|
@@ -46,7 +46,6 @@ files:
|
|
46
46
|
- lib/live_ast/evaler.rb
|
47
47
|
- lib/live_ast/linker.rb
|
48
48
|
- lib/live_ast/loader.rb
|
49
|
-
- lib/live_ast/parser.rb
|
50
49
|
- lib/live_ast/reader.rb
|
51
50
|
- lib/live_ast/replace_load.rb
|
52
51
|
- lib/live_ast/replace_raise.rb
|
@@ -79,13 +78,12 @@ files:
|
|
79
78
|
- test/lambda_test.rb
|
80
79
|
- test/load_path_test.rb
|
81
80
|
- test/load_test.rb
|
81
|
+
- test/main.rb
|
82
82
|
- test/noninvasive_test.rb
|
83
83
|
- test/readme_test.rb
|
84
84
|
- test/recursive_eval_test.rb
|
85
85
|
- test/redefine_method_test.rb
|
86
86
|
- test/reload_test.rb
|
87
|
-
- test/shared/ast_generators.rb
|
88
|
-
- test/shared/main.rb
|
89
87
|
- test/stdlib_test.rb
|
90
88
|
- test/thread_test.rb
|
91
89
|
- test/to_ast_feature_test.rb
|
@@ -103,14 +101,6 @@ rdoc_options:
|
|
103
101
|
- --title
|
104
102
|
- "LiveAST: Live Abstract Syntax Trees"
|
105
103
|
- --exclude
|
106
|
-
- CHANGES.rdoc
|
107
|
-
- --exclude
|
108
|
-
- Rakefile
|
109
|
-
- --exclude
|
110
|
-
- devel/jumpstart.rb
|
111
|
-
- --exclude
|
112
|
-
- lib/live_ast.rb
|
113
|
-
- --exclude
|
114
104
|
- lib/live_ast/ast_load.rb
|
115
105
|
- --exclude
|
116
106
|
- lib/live_ast/error.rb
|
@@ -121,91 +111,14 @@ rdoc_options:
|
|
121
111
|
- --exclude
|
122
112
|
- lib/live_ast/loader.rb
|
123
113
|
- --exclude
|
124
|
-
- lib/live_ast/parser.rb
|
125
|
-
- --exclude
|
126
114
|
- lib/live_ast/reader.rb
|
127
115
|
- --exclude
|
128
116
|
- lib/live_ast/replace_load.rb
|
129
117
|
- --exclude
|
130
118
|
- lib/live_ast/replace_raise.rb
|
131
119
|
- --exclude
|
132
|
-
-
|
133
|
-
-
|
134
|
-
- test/ast_load_feature_test.rb
|
135
|
-
- --exclude
|
136
|
-
- test/backtrace_test.rb
|
137
|
-
- --exclude
|
138
|
-
- test/covert_define_method_test.rb
|
139
|
-
- --exclude
|
140
|
-
- test/def_test.rb
|
141
|
-
- --exclude
|
142
|
-
- test/define_method_test.rb
|
143
|
-
- --exclude
|
144
|
-
- test/define_singleton_method_test.rb
|
145
|
-
- --exclude
|
146
|
-
- test/encoding_test.rb
|
147
|
-
- --exclude
|
148
|
-
- test/encoding_test/bad.rb
|
149
|
-
- --exclude
|
150
|
-
- test/encoding_test/cp932.rb
|
151
|
-
- --exclude
|
152
|
-
- test/encoding_test/default.rb
|
153
|
-
- --exclude
|
154
|
-
- test/encoding_test/eucjp.rb
|
155
|
-
- --exclude
|
156
|
-
- test/encoding_test/koi8.rb
|
157
|
-
- --exclude
|
158
|
-
- test/encoding_test/koi8_shebang.rb
|
159
|
-
- --exclude
|
160
|
-
- test/encoding_test/koi8_with_utf8bom.rb
|
161
|
-
- --exclude
|
162
|
-
- test/encoding_test/usascii.rb
|
163
|
-
- --exclude
|
164
|
-
- test/encoding_test/usascii_with_utf8bom.rb
|
165
|
-
- --exclude
|
166
|
-
- test/encoding_test/utf8.rb
|
167
|
-
- --exclude
|
168
|
-
- test/encoding_test/utf8bom.rb
|
169
|
-
- --exclude
|
170
|
-
- test/encoding_test/utf8bom_only.rb
|
171
|
-
- --exclude
|
172
|
-
- test/error_test.rb
|
173
|
-
- --exclude
|
174
|
-
- test/eval_test.rb
|
175
|
-
- --exclude
|
176
|
-
- test/flush_cache_test.rb
|
177
|
-
- --exclude
|
178
|
-
- test/lambda_test.rb
|
179
|
-
- --exclude
|
180
|
-
- test/load_path_test.rb
|
181
|
-
- --exclude
|
182
|
-
- test/load_test.rb
|
183
|
-
- --exclude
|
184
|
-
- test/noninvasive_test.rb
|
185
|
-
- --exclude
|
186
|
-
- test/readme_test.rb
|
187
|
-
- --exclude
|
188
|
-
- test/recursive_eval_test.rb
|
189
|
-
- --exclude
|
190
|
-
- test/redefine_method_test.rb
|
191
|
-
- --exclude
|
192
|
-
- test/reload_test.rb
|
193
|
-
- --exclude
|
194
|
-
- test/shared/ast_generators.rb
|
195
|
-
- --exclude
|
196
|
-
- test/shared/main.rb
|
197
|
-
- --exclude
|
198
|
-
- test/stdlib_test.rb
|
199
|
-
- --exclude
|
200
|
-
- test/thread_test.rb
|
201
|
-
- --exclude
|
202
|
-
- test/to_ast_feature_test.rb
|
203
|
-
- --exclude
|
204
|
-
- test/to_ruby_feature_test.rb
|
205
|
-
- --exclude
|
206
|
-
- test/to_ruby_test.rb
|
207
|
-
- --exclude
|
208
|
-
- MANIFEST
|
120
|
+
- lib/live_ast.rb
|
121
|
+
- -a
|
209
122
|
require_paths:
|
210
123
|
- lib
|
211
124
|
required_ruby_version: !ruby/object:Gem::Requirement
|
data/lib/live_ast/parser.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
require 'ruby_parser'
|
2
|
-
require 'sexp_processor'
|
3
|
-
|
4
|
-
module LiveAST
|
5
|
-
class Parser < SexpProcessor
|
6
|
-
def parse(source)
|
7
|
-
@defs = {}
|
8
|
-
process RubyParser.new.parse(source)
|
9
|
-
@defs
|
10
|
-
end
|
11
|
-
|
12
|
-
def process_defn(sexp)
|
13
|
-
result = Sexp.new
|
14
|
-
result << sexp.shift
|
15
|
-
result << sexp.shift
|
16
|
-
result << process(sexp.shift)
|
17
|
-
result << process(sexp.shift)
|
18
|
-
|
19
|
-
store_sexp(result, sexp.line)
|
20
|
-
s()
|
21
|
-
end
|
22
|
-
|
23
|
-
def process_iter(sexp)
|
24
|
-
line = sexp[1].line
|
25
|
-
|
26
|
-
result = Sexp.new
|
27
|
-
result << sexp.shift
|
28
|
-
result << process(sexp.shift)
|
29
|
-
result << process(sexp.shift)
|
30
|
-
result << process(sexp.shift)
|
31
|
-
|
32
|
-
#
|
33
|
-
# ruby_parser bug: a method without args attached to a
|
34
|
-
# multi-line block reports the wrong line. workaround.
|
35
|
-
#
|
36
|
-
if result[1][3].size == 1
|
37
|
-
line = sexp.line
|
38
|
-
end
|
39
|
-
|
40
|
-
store_sexp(result, line)
|
41
|
-
s()
|
42
|
-
end
|
43
|
-
|
44
|
-
def store_sexp(sexp, line)
|
45
|
-
@defs[line] = @defs.has_key?(line) ? :multiple : sexp
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,124 +0,0 @@
|
|
1
|
-
module ASTGenerators
|
2
|
-
#
|
3
|
-
# no_arg_def(:f, "A#f") returns the ast of
|
4
|
-
#
|
5
|
-
# def f
|
6
|
-
# "A#f"
|
7
|
-
# end
|
8
|
-
#
|
9
|
-
def no_arg_def(name, ret)
|
10
|
-
s(:defn, name, s(:args), s(:scope, s(:block, s(:str, ret))))
|
11
|
-
end
|
12
|
-
|
13
|
-
#
|
14
|
-
# no_arg_def_return(no_arg_def(:f, "A#f")) == "A#f"
|
15
|
-
#
|
16
|
-
def no_arg_def_return(ast)
|
17
|
-
ast[3][1][1][1]
|
18
|
-
end
|
19
|
-
|
20
|
-
#
|
21
|
-
# binop_def(:f, :+) returns the ast of
|
22
|
-
#
|
23
|
-
# def f(x, y)
|
24
|
-
# x + y
|
25
|
-
# end
|
26
|
-
#
|
27
|
-
def binop_def(name, op)
|
28
|
-
s(:defn,
|
29
|
-
name,
|
30
|
-
s(:args, :x, :y),
|
31
|
-
s(:scope,
|
32
|
-
s(:block, s(:call, s(:lvar, :x), op, s(:arglist, s(:lvar, :y))))))
|
33
|
-
end
|
34
|
-
|
35
|
-
#
|
36
|
-
# binop_define_method(:f, :*) returns the ast of
|
37
|
-
#
|
38
|
-
# define_method :f do |x, y|
|
39
|
-
# x * y
|
40
|
-
# end
|
41
|
-
#
|
42
|
-
def binop_define_method(name, op)
|
43
|
-
s(:iter,
|
44
|
-
s(:call, nil, :define_method, s(:arglist, s(:lit, name))),
|
45
|
-
s(:masgn, s(:array, s(:lasgn, :x), s(:lasgn, :y))),
|
46
|
-
s(:call, s(:lvar, :x), op, s(:arglist, s(:lvar, :y))))
|
47
|
-
end
|
48
|
-
|
49
|
-
#
|
50
|
-
# binop_covert_define_method(:f, :-, :my_def) returns the ast of
|
51
|
-
#
|
52
|
-
# my_def :f do |x, y|
|
53
|
-
# x - y
|
54
|
-
# end
|
55
|
-
#
|
56
|
-
def binop_covert_define_method(name, op, covert_name)
|
57
|
-
s(:iter,
|
58
|
-
s(:call, nil, covert_name, s(:arglist, s(:lit, name))),
|
59
|
-
s(:masgn, s(:array, s(:lasgn, :x), s(:lasgn, :y))),
|
60
|
-
s(:call, s(:lvar, :x), op, s(:arglist, s(:lvar, :y))))
|
61
|
-
end
|
62
|
-
|
63
|
-
#
|
64
|
-
# binop_define_method_with_var(:method_name, :/) returns the ast of
|
65
|
-
#
|
66
|
-
# define_method method_name do |x, y|
|
67
|
-
# x / y
|
68
|
-
# end
|
69
|
-
#
|
70
|
-
def binop_define_method_with_var(name, op)
|
71
|
-
s(:iter,
|
72
|
-
s(:call, nil, :define_method, s(:arglist, s(:lvar, name))),
|
73
|
-
s(:masgn, s(:array, s(:lasgn, :x), s(:lasgn, :y))),
|
74
|
-
s(:call, s(:lvar, :x), op, s(:arglist, s(:lvar, :y))))
|
75
|
-
end
|
76
|
-
|
77
|
-
#
|
78
|
-
# binop_define_singleton_method(:f, :+, :a) returns the ast of
|
79
|
-
#
|
80
|
-
# a.define_singleton_method :f do |x, y|
|
81
|
-
# x + y
|
82
|
-
# end
|
83
|
-
#
|
84
|
-
def binop_define_singleton_method(name, op, receiver)
|
85
|
-
s(:iter,
|
86
|
-
s(:call, s(:lvar, receiver), :define_singleton_method,
|
87
|
-
s(:arglist, s(:lit, name))),
|
88
|
-
s(:masgn, s(:array, s(:lasgn, :x), s(:lasgn, :y))),
|
89
|
-
s(:call, s(:lvar, :x), op, s(:arglist, s(:lvar, :y))))
|
90
|
-
end
|
91
|
-
|
92
|
-
#
|
93
|
-
# no_arg_block(:foo, "bar") returns the ast of
|
94
|
-
#
|
95
|
-
# foo { "bar" }
|
96
|
-
#
|
97
|
-
def no_arg_block(name, ret)
|
98
|
-
s(:iter, s(:call, nil, name, s(:arglist)), nil, s(:str, ret))
|
99
|
-
end
|
100
|
-
|
101
|
-
#
|
102
|
-
# binop_block(:foo, :+) returns the ast of
|
103
|
-
#
|
104
|
-
# foo { |x, y| x + y }
|
105
|
-
#
|
106
|
-
def binop_block(name, op, receiver = nil, args = [])
|
107
|
-
s(:iter,
|
108
|
-
s(:call, receiver, name, s(:arglist, *args)),
|
109
|
-
s(:masgn, s(:array, s(:lasgn, :x), s(:lasgn, :y))),
|
110
|
-
s(:call, s(:lvar, :x), op, s(:arglist, s(:lvar, :y))))
|
111
|
-
end
|
112
|
-
|
113
|
-
#
|
114
|
-
# binop_proc_new(:*) returns the ast of
|
115
|
-
#
|
116
|
-
# Proc.new { |x, y| x * y }
|
117
|
-
#
|
118
|
-
def binop_proc_new(op)
|
119
|
-
s(:iter,
|
120
|
-
s(:call, s(:const, :Proc), :new, s(:arglist)),
|
121
|
-
s(:masgn, s(:array, s(:lasgn, :x), s(:lasgn, :y))),
|
122
|
-
s(:call, s(:lvar, :x), op, s(:arglist, s(:lvar, :y))))
|
123
|
-
end
|
124
|
-
end
|