rubinius-ast 1.1.2 → 1.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.
- checksums.yaml +4 -4
- data/lib/rubinius/ast/operators.rb +98 -17
- data/lib/rubinius/ast/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2cda7718a6f58243f0f865ec0120f5e9971b3cb5
|
4
|
+
data.tar.gz: a630561d268b422713f711d7885c921cd003c3a3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d188bcf3227a86c2ddffd829a4d4078a774a326ed85e6d4df19296d25983e9a4c7bd8feeabcd42725f9c171b09d573e6f3b7a32252e56e0e23f89e9eb13a769
|
7
|
+
data.tar.gz: 8a7afeb5cbec85d572c3613a5d3a1b1d5a8e0a6d5ea657c96da90952a6fe452ab120bfc1a4d8bd70fa55636c2b87f53c55ae20b1c36aa09dc2ff33707ae64baa
|
@@ -129,7 +129,7 @@ module Rubinius::ToolSets.current::ToolSet
|
|
129
129
|
end
|
130
130
|
end
|
131
131
|
|
132
|
-
class
|
132
|
+
class OpAssignElement < Node
|
133
133
|
attr_accessor :receiver, :op, :arguments, :value
|
134
134
|
|
135
135
|
def initialize(line, receiver, arguments, op, value)
|
@@ -173,6 +173,7 @@ module Rubinius::ToolSets.current::ToolSet
|
|
173
173
|
if @op == :or or @op == :and
|
174
174
|
fnd = g.new_label
|
175
175
|
fin = g.new_label
|
176
|
+
assign = g.new_label
|
176
177
|
|
177
178
|
# We dup the value from [] to leave it as the value of the
|
178
179
|
# expression
|
@@ -189,8 +190,25 @@ module Rubinius::ToolSets.current::ToolSet
|
|
189
190
|
|
190
191
|
# The receiver and arguments are still on the stack
|
191
192
|
|
193
|
+
old_break = g.break
|
194
|
+
new_break = g.new_label
|
195
|
+
g.break = new_break
|
196
|
+
|
192
197
|
@value.bytecode(g)
|
193
198
|
|
199
|
+
g.goto assign
|
200
|
+
|
201
|
+
new_break.set!
|
202
|
+
if old_break
|
203
|
+
g.pop_many recv_stack + 1
|
204
|
+
g.push :nil
|
205
|
+
g.goto old_break
|
206
|
+
end
|
207
|
+
|
208
|
+
g.break = old_break
|
209
|
+
|
210
|
+
assign.set!
|
211
|
+
|
194
212
|
# retain the rhs as the expression value
|
195
213
|
g.dup
|
196
214
|
g.move_down recv_stack + 1
|
@@ -215,11 +233,31 @@ module Rubinius::ToolSets.current::ToolSet
|
|
215
233
|
|
216
234
|
fin.set!
|
217
235
|
else
|
236
|
+
fin = g.new_label
|
237
|
+
assign = g.new_label
|
238
|
+
|
239
|
+
old_break = g.break
|
240
|
+
new_break = g.new_label
|
241
|
+
g.break = new_break
|
242
|
+
|
218
243
|
# @op is something like + or -
|
219
244
|
# We pull in @value to the stack
|
220
245
|
@value.bytecode(g)
|
221
246
|
# X: 3 TOS
|
222
247
|
|
248
|
+
g.goto assign
|
249
|
+
|
250
|
+
new_break.set!
|
251
|
+
if old_break
|
252
|
+
g.pop_many recv_stack + 2
|
253
|
+
g.push :nil
|
254
|
+
g.goto old_break
|
255
|
+
end
|
256
|
+
|
257
|
+
g.break = old_break
|
258
|
+
|
259
|
+
assign.set!
|
260
|
+
|
223
261
|
# ... then call it as an argument to @or, called on the return
|
224
262
|
# from [].
|
225
263
|
# X: 2 + 3
|
@@ -242,18 +280,27 @@ module Rubinius::ToolSets.current::ToolSet
|
|
242
280
|
else
|
243
281
|
g.send :[]=, @arguments.size + 1
|
244
282
|
end
|
283
|
+
|
284
|
+
fin.set!
|
245
285
|
g.pop
|
246
286
|
end
|
247
287
|
end
|
248
288
|
|
249
289
|
def to_sexp
|
250
290
|
arguments = [:arglist] + @arguments.to_sexp
|
251
|
-
|
291
|
+
case @op
|
292
|
+
when :or
|
293
|
+
op = :"||"
|
294
|
+
when :and
|
295
|
+
op = :"&&"
|
296
|
+
else
|
297
|
+
op = @op
|
298
|
+
end
|
252
299
|
[:op_asgn1, @receiver.to_sexp, arguments, op, @value.to_sexp]
|
253
300
|
end
|
254
301
|
end
|
255
302
|
|
256
|
-
class
|
303
|
+
class OpAssignAttribute < Node
|
257
304
|
attr_accessor :receiver, :name, :assign, :op, :value
|
258
305
|
|
259
306
|
def initialize(line, receiver, name, op, value)
|
@@ -268,7 +315,7 @@ module Rubinius::ToolSets.current::ToolSet
|
|
268
315
|
def bytecode(g)
|
269
316
|
pos(g)
|
270
317
|
|
271
|
-
# X: h
|
318
|
+
# X: h.a += 3, given h.a == 2
|
272
319
|
@receiver.bytecode(g)
|
273
320
|
# X: TOS = h
|
274
321
|
g.dup
|
@@ -278,6 +325,7 @@ module Rubinius::ToolSets.current::ToolSet
|
|
278
325
|
if @op == :or or @op == :and
|
279
326
|
fnd = g.new_label
|
280
327
|
fin = g.new_label
|
328
|
+
assign = g.new_label
|
281
329
|
|
282
330
|
g.dup
|
283
331
|
if @op == :or
|
@@ -288,8 +336,26 @@ module Rubinius::ToolSets.current::ToolSet
|
|
288
336
|
|
289
337
|
# Remove the copy of 2 and push @value on the stack
|
290
338
|
g.pop
|
339
|
+
|
340
|
+
old_break = g.break
|
341
|
+
new_break = g.new_label
|
342
|
+
g.break = new_break
|
343
|
+
|
291
344
|
@value.bytecode(g)
|
292
345
|
|
346
|
+
g.goto assign
|
347
|
+
|
348
|
+
new_break.set!
|
349
|
+
if old_break
|
350
|
+
g.pop_many 2
|
351
|
+
g.push :nil
|
352
|
+
g.goto old_break
|
353
|
+
end
|
354
|
+
|
355
|
+
g.break = old_break
|
356
|
+
|
357
|
+
assign.set!
|
358
|
+
|
293
359
|
# Retain the this value to use as the expression value
|
294
360
|
g.dup
|
295
361
|
g.move_down 2
|
@@ -308,7 +374,27 @@ module Rubinius::ToolSets.current::ToolSet
|
|
308
374
|
|
309
375
|
fin.set!
|
310
376
|
else
|
377
|
+
assign = g.new_label
|
378
|
+
|
379
|
+
old_break = g.break
|
380
|
+
new_break = g.new_label
|
381
|
+
g.break = new_break
|
382
|
+
|
311
383
|
@value.bytecode(g)
|
384
|
+
|
385
|
+
g.goto assign
|
386
|
+
|
387
|
+
new_break.set!
|
388
|
+
if old_break
|
389
|
+
g.pop_many 3
|
390
|
+
g.push :nil
|
391
|
+
g.goto old_break
|
392
|
+
end
|
393
|
+
|
394
|
+
g.break = old_break
|
395
|
+
|
396
|
+
assign.set!
|
397
|
+
|
312
398
|
# X: TOS = 3
|
313
399
|
# X: 2 + 3
|
314
400
|
g.send @op, 1
|
@@ -326,7 +412,14 @@ module Rubinius::ToolSets.current::ToolSet
|
|
326
412
|
end
|
327
413
|
|
328
414
|
def to_sexp
|
329
|
-
|
415
|
+
case @op
|
416
|
+
when :or
|
417
|
+
op = :"||"
|
418
|
+
when :and
|
419
|
+
op = :"&&"
|
420
|
+
else
|
421
|
+
op = @op
|
422
|
+
end
|
330
423
|
[:op_asgn2, @receiver.to_sexp, :"#{@name}=", op, @value.to_sexp]
|
331
424
|
end
|
332
425
|
end
|
@@ -378,17 +471,5 @@ module Rubinius::ToolSets.current::ToolSet
|
|
378
471
|
:op_asgn_or
|
379
472
|
end
|
380
473
|
end
|
381
|
-
|
382
|
-
class OpAssignOr19 < OpAssignOr
|
383
|
-
def bytecode(g)
|
384
|
-
pos(g)
|
385
|
-
|
386
|
-
g.state.push_op_asgn
|
387
|
-
@left.or_bytecode(g) do
|
388
|
-
g.state.pop_op_asgn
|
389
|
-
@right.bytecode(g)
|
390
|
-
end
|
391
|
-
end
|
392
|
-
end
|
393
474
|
end
|
394
475
|
end
|
data/lib/rubinius/ast/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubinius-ast
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Shirai
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-06-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -17,13 +17,13 @@ dependencies:
|
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.3'
|
20
|
+
type: :development
|
20
21
|
requirement: !ruby/object:Gem::Requirement
|
21
22
|
requirements:
|
22
23
|
- - "~>"
|
23
24
|
- !ruby/object:Gem::Version
|
24
25
|
version: '1.3'
|
25
26
|
prerelease: false
|
26
|
-
type: :development
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -31,13 +31,13 @@ dependencies:
|
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '10.0'
|
34
|
+
type: :development
|
34
35
|
requirement: !ruby/object:Gem::Requirement
|
35
36
|
requirements:
|
36
37
|
- - "~>"
|
37
38
|
- !ruby/object:Gem::Version
|
38
39
|
version: '10.0'
|
39
40
|
prerelease: false
|
40
|
-
type: :development
|
41
41
|
description: An Abstract Syntax Tree for Ruby.
|
42
42
|
email:
|
43
43
|
- brixen@gmail.com
|