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.
- data/CHANGELOG +2 -0
- data/Rakefile +2 -1
- data/lib/partialruby.rb +5 -372
- metadata +20 -4
data/CHANGELOG
CHANGED
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.
|
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
|
-
|
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
|
430
|
-
|
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:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 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-
|
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: []
|