borx 0.0.1.alpha1 → 0.0.1.alpha2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -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.eval(name)
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.eval("#{name} = nil ; lambda{|_x| #{name} = _x}").call(value)
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
@@ -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, block = super
38
+ name, call, args = super
37
39
  inject_binding = true
38
40
  if call[0] == :fcall
39
- args = args[1][1] unless args == ARGS_NEW
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 on_stmts_new
139
- return [:stmts_add, [:stmts_new], [:assign,
140
- [:var_field, [:@ident, "__borx_binding__", [1, 0]]],
141
- [:vcall, [:@ident, "binding", [1, 17]]]]]
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
- if tree == [:args_new]
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
- return [:args_add, push_args(tree[1], *args), tree[2]]
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.alpha1
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-14 00:00:00.000000000 Z
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: []