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.
@@ -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: []