partialruby 0.1.0 → 0.2.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.
Files changed (4) hide show
  1. data/CHANGELOG +2 -0
  2. data/Rakefile +2 -1
  3. data/lib/partialruby.rb +5 -372
  4. metadata +20 -4
data/CHANGELOG CHANGED
@@ -1,3 +1,5 @@
1
+ 0.2.0 Refactor to use Ruby2Ruby for emulation logic
2
+
1
3
  0.1.0 First release
2
4
 
3
5
  Spec and Basic AST emulation using ruby
data/Rakefile CHANGED
@@ -6,13 +6,14 @@ require 'rake/gempackagetask'
6
6
 
7
7
  spec = Gem::Specification.new do |s|
8
8
  s.name = 'partialruby'
9
- s.version = '0.1.0'
9
+ s.version = '0.2.0'
10
10
  s.author = 'Dario Seminara'
11
11
  s.email = 'robertodarioseminara@gmail.com'
12
12
  s.platform = Gem::Platform::RUBY
13
13
  s.summary = 'Ruby partial interpreter written in pure-ruby '
14
14
  s.homepage = "http://github.com/tario/partialruby"
15
15
  s.add_dependency "ruby_parser", ">= 2.0.6"
16
+ s.add_dependency "ruby2ruby", ">= 1.2.5"
16
17
  s.has_rdoc = true
17
18
  s.extra_rdoc_files = [ 'README' ]
18
19
  s.rdoc_options << '--main' << 'README'
data/lib/partialruby.rb CHANGED
@@ -20,6 +20,7 @@ along with partialruby. if not, see <http://www.gnu.org/licenses/>.
20
20
  =end
21
21
  require "rubygems"
22
22
  require "ruby_parser"
23
+ require "ruby2ruby"
23
24
 
24
25
  module PartialRuby
25
26
 
@@ -86,382 +87,14 @@ module PartialRuby
86
87
  end
87
88
 
88
89
  class PureRubyContext < Context
89
-
90
- # def handle_node_scope(tree, frame)
91
- # run(tree[1], frame)
92
- # end
93
-
94
- def ruby_emul_nil(tree)
95
- "(nil)"
96
- end
97
-
98
- def ruby_emul_scope(tree)
99
- emul tree[1]
100
- end
101
-
102
- def ruby_emul_block(tree)
103
- last = nil
104
-
105
- code = ""
106
- tree[1..-1].each do |subtree|
107
- code << emul(subtree) << "\n"
108
- end
109
-
110
- code
111
- end
112
-
113
- def ruby_emul_hash(tree)
114
- pairs = Array.new
115
- (0..((tree.size - 1) / 2)-1).each do |i|
116
- pairs << [ tree[i*2+1], tree[i*2+2] ]
117
- end
118
-
119
- "{" + pairs.map{|pair| "(#{emul pair.first})=>(#{emul pair.last} )" }.join(",") + "}"
120
- end
121
-
122
- # def handle_node_block(tree, frame)
123
- # last = nil
124
- # tree[1..-1].each do |subtree|
125
- # last = run(subtree, frame)
126
- # end
127
-
128
- # last
129
- #end
130
-
131
- def ruby_emul_lasgn(tree)
132
- varname = tree[1]
133
- "#{varname} = ( #{emul(tree[2])} );"
134
- end
135
-
136
- def ruby_emul_lvar(tree)
137
- varname = tree[1]
138
- varname.to_s
139
- end
140
-
141
- def ruby_emul_const(tree)
142
- tree[1].to_s
143
- end
144
-
145
- def ruby_emul_colon3(tree)
146
- "::" + tree[1].to_s
147
- end
148
-
149
- def ruby_emul_colon2(tree)
150
- "#{emul tree[1]}::#{tree[2]}"
151
- end
152
-
153
- def ruby_emul_class(tree)
154
- classtree = tree[1]
155
- subtree = tree[3]
156
-
157
- classname = ""
158
- if classtree.instance_of? Symbol then
159
- classname = classtree
160
- else
161
- classname = emul classtree
162
- end
163
-
164
- return ("
165
- class #{classname}
166
- #{emul subtree}
167
- end
168
- ")
169
- end
170
-
171
- def ruby_emul_defs(tree)
172
- methodname = tree[2]
173
- args = tree[3]
174
- "def (#{emul tree[1]}).#{methodname}(#{args[1..-1].map(&:to_s).join(",")})
175
- #{emul tree[4]}
176
- end
177
- "
178
- end
179
-
180
- def ruby_emul_defn(tree)
181
- method_name = tree[1]
182
- args = tree[2]
183
- impl = tree[3][1]
184
-
185
- "def #{method_name}(#{args[1..-1].map(&:to_s).join(",")})
186
- #{emul impl}
187
- end
188
- "
189
- end
190
-
191
- def ruby_emul_lit(tree)
192
- obj = tree[1]
193
- if obj.instance_of? Symbol or obj.instance_of? Fixnum or obj == nil or obj == true or obj == false
194
- "(#{obj.inspect})"
195
- else
196
- "(#{object_ref tree[1]})"
197
- end
198
- end
199
-
200
- def ruby_emul_str(tree)
201
- "(#{tree[1].inspect})"
202
- end
203
-
204
- def ruby_emul_cdecl(tree)
205
-
206
- if tree[1].instance_of? Sexp
207
- "(#{emul tree[1]} = #{emul tree[2]})"
208
- else
209
- "(#{tree[1]} = #{emul tree[2]})"
210
- end
211
- end
212
-
213
- def ruby_emul_dstr(tree)
214
- firststr = tree[1]
215
- retstr = firststr
216
- tree[2..-1].each do |subtree|
217
-
218
- subtreetype = subtree[0]
219
-
220
- if subtreetype == :evstr
221
- retstr << "\#{(#{emul subtree[1]})}"
222
- else
223
- retstr << "\#{(#{emul subtree})}"
224
- end
225
- end
226
-
227
- '"' + retstr + '"'
228
- end
229
-
230
- def ruby_emul_array(tree)
231
- "[" + tree[1..-1].map{ |subtree| "(" + emul(subtree) + ")" }.join(",") + "]"
232
- end
233
-
234
- def ruby_emul_self(tree)
235
- "(self)"
236
- end
237
-
238
- def ruby_emul_true(tree)
239
- "true"
240
- end
241
-
242
- def ruby_emul_false(tree)
243
- "false"
244
- end
245
-
246
- def ruby_emul_if(tree)
247
- "if (#{emul tree[1]}); (#{emul tree[2]}) else (#{emul tree[3]}) end"
248
- end
249
-
250
- def ruby_emul_while(tree)
251
- "while (#{emul tree[1]}); (#{emul tree[2]}); end "
252
- end
253
-
254
- def process_args(tree)
255
- nodetype = tree[0]
256
- if nodetype == :lasgn
257
- tree.last.to_s
258
- elsif nodetype == :masgn
259
- tree[1][1..-1].map {|subtree|
260
- process_args(subtree)
261
- }.join(",")
262
- elsif nodetype == :splat
263
- "*" + process_args(tree.last)
264
- end
265
-
266
- end
267
-
268
- def ruby_emul_iter(tree)
269
- callnode = tree[1]
270
- innernode = tree[3]
271
-
272
- arguments = tree[2]
273
- argumentsstr = ""
274
-
275
- if arguments
276
- argumentsstr = "|" + process_args(arguments) + "|"
277
- end
278
- "#{emul callnode} { #{argumentsstr} #{emul innernode} }"
279
- end
280
-
281
- def ruby_emul_until(tree)
282
- "until (#{emul tree[1]}); (#{emul tree[2]}); end "
283
- end
284
-
285
- def ruby_emul_case(tree)
286
- str = "case #{emul tree[1]}; "
287
-
288
- tree[2..-2].each do |subtree|
289
- matches = subtree[1][1..-1].map{|subsubtree| "(" + emul(subsubtree) + ")" }.join(",")
290
-
291
- str << "when #{matches}; #{emul subtree[2]};"
292
- end
293
-
294
- if tree[-1]
295
- str << "else; #{emul tree[-1]}; "
296
- end
297
-
298
- str << "end; "
299
- str
300
- end
301
-
302
- def ruby_emul_splat(tree)
303
- "*(#{emul(tree[1])})"
304
- end
305
-
306
- def ruby_emul_ensure(tree)
307
- "begin;
308
- #{emul tree[1]}
309
- ensure;
310
- #{emul tree[2] }
311
- end;
312
- "
313
- end
314
-
315
- def ruby_emul_ivar(tree)
316
- "(" + tree[1].to_s + ")"
317
- end
318
-
319
- def ruby_emul_iasgn(tree)
320
- "(#{tree[1].to_s} = (#{emul tree[2]}))"
321
- end
322
-
323
- def ruby_emul_gvar(tree)
324
- "(" + tree[1].to_s + ")"
325
- end
326
-
327
- def ruby_emul_gasgn(tree)
328
- "(#{tree[1].to_s} = (#{emul tree[2]}))"
329
- end
330
-
331
- def ruby_emul_xstr(tree)
332
- "`#{tree[1].gsub("`","")}`"
333
- end
334
-
335
- def ruby_emul_dxstr(tree)
336
- firststr = tree[1]
337
- retstr = firststr
338
- tree[2..-1].each do |subtree|
339
-
340
- subtreetype = subtree[0]
341
-
342
- if subtreetype == :evstr
343
- retstr << "\#{(#{emul subtree[1]})}"
344
- else
345
- retstr << "\#{(#{emul subtree})}"
346
- end
347
- end
348
-
349
- '`' + retstr + '`'
350
- end
351
-
352
- def ruby_emul_yield(tree)
353
-
354
- strargs = tree[1..-1].map{ |subtree|
355
- if subtree[0] == :splat
356
- "*(" + emul(subtree[1]) + ")"
357
- else
358
- "(" + emul(subtree) + ")"
359
- end
360
- }.join(",")
361
-
362
- "(yield(#{strargs}))"
363
- end
364
-
365
- def ruby_emul_module(tree)
366
-
367
- if tree[1].instance_of? Symbol
368
- modulename = tree[1].to_s
369
- else
370
- modulename = emul tree[1]
371
- end
372
-
373
- "module #{modulename}
374
- #{emul tree[2]}
375
- end
376
- "
377
- end
378
-
379
- def ruby_emul_rescue(tree)
380
-
381
- resbody = tree[2][2]
382
-
383
- strresbody = ""
384
- if resbody
385
- strresbody = emul resbody
386
- else
387
- strresbody = ""
388
- end
389
-
390
- exceptionarray = tree[2][1][1..-1]
391
-
392
- exceptionstrarray = []
393
-
394
- i = 0
395
- while i < exceptionarray.size
396
- if exceptionarray[i+1]
397
- if exceptionarray[i+1][0] == :lasgn
398
- exceptionstrarray << "(" + (emul(exceptionarray[i]) + ") => " + exceptionarray[i+1][1].to_s)
399
- i = i + 1
400
- else
401
- exceptionstrarray << "(" + (emul(exceptionarray[i])) + ")"
402
- end
403
- else
404
- exceptionstrarray << "(" + (emul(exceptionarray[i])) + ")"
405
- end
406
- i = i + 1
407
- end
408
-
409
- "begin;
410
- #{emul tree[1]}
411
- rescue #{exceptionstrarray.join(",")};
412
- #{strresbody}
413
- end;
414
- "
415
- end
416
-
417
- def ruby_emul_return(tree)
418
- "; return #{emul tree[1]}; "
419
- end
420
-
421
- def ruby_emul_and(tree)
422
- "(#{emul tree[1]}) and (#{emul tree[2]})"
423
- end
424
-
425
- def ruby_emul_or(tree)
426
- "(#{emul tree[1]}) or (#{emul tree[2]})"
90
+ def emul(tree)
91
+ Ruby2Ruby.new.process(tree)
427
92
  end
428
93
 
429
- def ruby_emul_not(tree)
430
- "not (#{emul tree[1]})"
94
+ def ruby_emul(tree)
95
+ Ruby2Ruby.new.process(tree)
431
96
  end
432
97
 
433
- def ruby_emul_call(tree)
434
- object_tree = tree[1]
435
- method_name = tree[2]
436
-
437
- arglisttree = tree[3]
438
- arglist = arglisttree[1..-1]
439
-
440
- argsstr = arglist.
441
- map{|subtree|
442
- if subtree[0] == :splat
443
- emul(subtree)
444
- else
445
- "(" + emul(subtree) + ")"
446
- end
447
- }.
448
- join(",")
449
-
450
- if (object_tree)
451
- if arglist.count == 0
452
- "(#{emul(object_tree)}).#{method_name}"
453
- else
454
- "(#{emul(object_tree)}).#{method_name}(#{argsstr})"
455
- end
456
- else
457
- if arglist.count == 0
458
- "#{method_name}"
459
- else
460
- "#{method_name}(#{argsstr})"
461
- end
462
- end
463
-
464
- end
465
98
  end
466
99
 
467
100
  #X.new.foo
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: partialruby
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 1
8
+ - 2
9
9
  - 0
10
- version: 0.1.0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Dario Seminara
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-04-03 00:00:00 -03:00
18
+ date: 2011-04-28 00:00:00 -03:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -34,6 +34,22 @@ dependencies:
34
34
  version: 2.0.6
35
35
  type: :runtime
36
36
  version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: ruby2ruby
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 21
46
+ segments:
47
+ - 1
48
+ - 2
49
+ - 5
50
+ version: 1.2.5
51
+ type: :runtime
52
+ version_requirements: *id002
37
53
  description:
38
54
  email: robertodarioseminara@gmail.com
39
55
  executables: []