partialruby 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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: []