borx 0.0.1.alpha1 → 0.0.1.alpha2
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/lib/borx/binding.rb +78 -0
- data/lib/borx/environment.rb +5 -3
- data/lib/borx/rewriter.rb +83 -8
- metadata +3 -2
data/lib/borx/binding.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
|
2
|
+
class Borx::Binding
|
3
|
+
|
4
|
+
def initialize(parent)
|
5
|
+
@variables = {}
|
6
|
+
@parent = parent
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_variable(name)
|
10
|
+
return @variables.fetch(name){ @parent.get_variable(name) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def set_variable(name, value)
|
14
|
+
if variable?(name)
|
15
|
+
if @variables.key?(name)
|
16
|
+
@variables[name] = value
|
17
|
+
else
|
18
|
+
@parent.set_variable(name, value)
|
19
|
+
end
|
20
|
+
else
|
21
|
+
@variables[name] = value
|
22
|
+
end
|
23
|
+
return value
|
24
|
+
end
|
25
|
+
|
26
|
+
def variable?(name)
|
27
|
+
return @variables.key?(name) || @parent.variable?(name)
|
28
|
+
end
|
29
|
+
|
30
|
+
def set_variable!(name, value)
|
31
|
+
@variables[name] = value
|
32
|
+
end
|
33
|
+
|
34
|
+
def block(*args, &block)
|
35
|
+
Block.new(self, args, block)
|
36
|
+
end
|
37
|
+
|
38
|
+
class Block
|
39
|
+
def initialize(parent, names, block)
|
40
|
+
@parent = parent
|
41
|
+
@block = block
|
42
|
+
@names = names
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_proc
|
46
|
+
return method(:call).to_proc
|
47
|
+
end
|
48
|
+
|
49
|
+
def call(*args, &block)
|
50
|
+
b = Borx::Binding.new(@parent)
|
51
|
+
@names.zip(args){|name, value| b.set_variable!(name, value) }
|
52
|
+
@block.call(b)
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
class Adapter < self
|
58
|
+
|
59
|
+
def initialize(real_binding)
|
60
|
+
@binding = real_binding
|
61
|
+
end
|
62
|
+
|
63
|
+
def get_variable(name)
|
64
|
+
return @binding.eval(name)
|
65
|
+
end
|
66
|
+
|
67
|
+
def set_variable(name, value)
|
68
|
+
@binding.eval("#{name} = nil ; lambda{|_v| #{name} = _v}").call(value)
|
69
|
+
return value
|
70
|
+
end
|
71
|
+
|
72
|
+
def variable?(name)
|
73
|
+
return @binding.eval("local_variables.any?{|v| v.to_s == #{name.inspect}}")
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
data/lib/borx/environment.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'borx/binding'
|
2
|
+
|
1
3
|
base = Class.new do
|
2
4
|
|
3
5
|
def get_constant(binding, name, house = nil)
|
@@ -29,7 +31,7 @@ class Borx::Environment < base
|
|
29
31
|
module GetVariable
|
30
32
|
|
31
33
|
def get_variable(binding, name)
|
32
|
-
binding.
|
34
|
+
binding.get_variable(name)
|
33
35
|
end
|
34
36
|
|
35
37
|
end
|
@@ -37,7 +39,7 @@ class Borx::Environment < base
|
|
37
39
|
module SetVariable
|
38
40
|
|
39
41
|
def set_variable(binding, name, value)
|
40
|
-
binding.
|
42
|
+
binding.set_variable(name,value)
|
41
43
|
end
|
42
44
|
|
43
45
|
end
|
@@ -98,7 +100,7 @@ class Borx::Environment < base
|
|
98
100
|
|
99
101
|
private
|
100
102
|
def eval_code(code, binding, file = '(eval)', line = 0)
|
101
|
-
old_borx, setter = binding.eval('__borx__ ||= nil ; [__borx__, lambda{|v| __borx__ = v}]')
|
103
|
+
old_borx, setter = binding.eval('__borx__ ||= nil ; __borx_binding__ = Borx::Binding::Adapter.new(binding) ; [__borx__, lambda{|v| __borx__ = v}]')
|
102
104
|
setter.call(self)
|
103
105
|
binding.eval(code.code, file, line)
|
104
106
|
ensure
|
data/lib/borx/rewriter.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
begin
|
2
2
|
require 'ripper'
|
3
3
|
rescue NotFound
|
4
|
+
# :nocov:
|
4
5
|
raise NotFound, "Ripper extension not found. Please add it to your bundle."
|
6
|
+
# :nocov:
|
5
7
|
end
|
6
8
|
require 'sorcerer'
|
7
9
|
require 'borx/code'
|
@@ -33,10 +35,10 @@ private
|
|
33
35
|
end
|
34
36
|
|
35
37
|
def on_method_add_arg(*x)
|
36
|
-
name, call, args
|
38
|
+
name, call, args = super
|
37
39
|
inject_binding = true
|
38
40
|
if call[0] == :fcall
|
39
|
-
args = args[1]
|
41
|
+
args = args[1] unless args == ARGS_NEW
|
40
42
|
brgs = push_args(args,[:var_ref, [:@kw, "self", [0, 0]]],ident_to_string(call[1]))
|
41
43
|
return call_borx('call_private_method', brgs)
|
42
44
|
elsif call[0] == :method_add_arg
|
@@ -135,10 +137,78 @@ private
|
|
135
137
|
return call_borx('execute', [:args_add, [:args_new], xstring_to_string(x)])
|
136
138
|
end
|
137
139
|
|
138
|
-
def
|
139
|
-
return
|
140
|
-
|
141
|
-
|
140
|
+
def on_binary(left, op, right)
|
141
|
+
return call_borx('call_method', [:args_add,
|
142
|
+
[:args_add,
|
143
|
+
[:args_add,
|
144
|
+
[:args_new],
|
145
|
+
left],
|
146
|
+
[:string_literal,
|
147
|
+
[:string_add,[:string_content],
|
148
|
+
[:@tstring_content, op.to_s, [0,0]]]]],
|
149
|
+
right])
|
150
|
+
end
|
151
|
+
|
152
|
+
def on_method_add_block(args, block)
|
153
|
+
name, args, block = super
|
154
|
+
new_vars = [:args_new]
|
155
|
+
if block[1]
|
156
|
+
block[1][1][1].each do |arg|
|
157
|
+
next unless arg
|
158
|
+
new_vars = [:args_add, new_vars, ident_to_string(arg)]
|
159
|
+
end
|
160
|
+
end
|
161
|
+
new_block = [:method_add_block,
|
162
|
+
[:method_add_arg,
|
163
|
+
[:call,
|
164
|
+
[:var_ref, [:@ident, "__borx_binding__", [0, 0]]],
|
165
|
+
:".",
|
166
|
+
[:@ident, "block", [0, 0]]],
|
167
|
+
[:arg_paren,
|
168
|
+
[:args_add_block,
|
169
|
+
new_vars,
|
170
|
+
false]]],
|
171
|
+
[:brace_block,
|
172
|
+
[:block_var,
|
173
|
+
[:params, [[:@ident, "__borx_binding__", [1, 20]]], nil, nil, nil, nil, nil, nil],
|
174
|
+
false],
|
175
|
+
block[2]]
|
176
|
+
]
|
177
|
+
|
178
|
+
return put_args_add_block(args,new_block)
|
179
|
+
end
|
180
|
+
|
181
|
+
def on_args_add_block(args, block)
|
182
|
+
name, args, block = super
|
183
|
+
new_block = false
|
184
|
+
if block
|
185
|
+
# new_block =
|
186
|
+
new_block = [:method_add_arg,
|
187
|
+
[:call,
|
188
|
+
[:var_ref, [:@ident, "__borx_binding__", [0, 0]]],
|
189
|
+
:".",
|
190
|
+
[:@ident, "block", [0, 0]]],
|
191
|
+
[:arg_paren,
|
192
|
+
[:args_add_block,
|
193
|
+
[:args_new],
|
194
|
+
block]]]
|
195
|
+
end
|
196
|
+
return [name, args, new_block]
|
197
|
+
end
|
198
|
+
|
199
|
+
def put_args_add_block(args, block)
|
200
|
+
case(args[0])
|
201
|
+
when :args_add_block
|
202
|
+
return [:args_add_block, args[1], block]
|
203
|
+
when :method_add_arg
|
204
|
+
return [:method_add_arg, args[1], put_args_add_block(args[2],block)]
|
205
|
+
when :arg_paren
|
206
|
+
return [:arg_paren, put_args_add_block(args[1],block)]
|
207
|
+
else
|
208
|
+
# :nocov:
|
209
|
+
raise "Unknown args type #{args[0]}. This is a bug. Please report it"
|
210
|
+
# :nocov:
|
211
|
+
end
|
142
212
|
end
|
143
213
|
|
144
214
|
def xstring_to_string(x)
|
@@ -179,14 +249,19 @@ private
|
|
179
249
|
end
|
180
250
|
|
181
251
|
def push_args(tree, *args)
|
182
|
-
|
252
|
+
case(tree[0])
|
253
|
+
when :args_new then
|
183
254
|
if args.any?
|
184
255
|
return [:args_add, push_args(tree, *args[0..-2]), args.last]
|
185
256
|
else
|
186
257
|
return tree
|
187
258
|
end
|
259
|
+
when :args_add_block, :args_add
|
260
|
+
return [tree[0], push_args(tree[1],*args), tree[2]]
|
188
261
|
else
|
189
|
-
|
262
|
+
# :nocov:
|
263
|
+
raise "Unknown args type #{tree[0]}. This is a bug. Please report it."
|
264
|
+
# :nocov:
|
190
265
|
end
|
191
266
|
end
|
192
267
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: borx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.1.
|
4
|
+
version: 0.0.1.alpha2
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sorcerer
|
@@ -70,6 +70,7 @@ files:
|
|
70
70
|
- lib/borx/environment.rb
|
71
71
|
- lib/borx/code.rb
|
72
72
|
- lib/borx/rewriter.rb
|
73
|
+
- lib/borx/binding.rb
|
73
74
|
- lib/borx.rb
|
74
75
|
homepage: https://github.com/hannesg/borx
|
75
76
|
licenses: []
|