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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cbc92034ccb2ad50de44ce82fec2d33cd3aff30c
4
- data.tar.gz: 5101ad9a2d5c03520105d9a77baaa1b40db51d44
3
+ metadata.gz: 2cda7718a6f58243f0f865ec0120f5e9971b3cb5
4
+ data.tar.gz: a630561d268b422713f711d7885c921cd003c3a3
5
5
  SHA512:
6
- metadata.gz: 40a073041c986b2131d519ed10cd03d6fac33d57ca2da6e69822842b10f002621e33d712518664f430609bba78709f92a547b410d26169036e246ad9687c12c7
7
- data.tar.gz: 4d63a8b26ed32cd1937a60d38142638b40111d597eadb77a70be1580dd1430eb6df5efd85a8b661cf6621ff9f9cde60066a402301f0b05ac32516186d7c76ca1
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 OpAssign1 < Node
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
- op = @op == :or ? :"||" : :"&&"
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 OpAssign2 < Node
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[:a] += 3, given h.a == 2
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
- op = @op == :or ? :"||" : :"&&"
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
@@ -1,5 +1,5 @@
1
1
  module Rubinius::ToolSets.current::ToolSet
2
2
  module AST
3
- VERSION = "1.1.2"
3
+ VERSION = "1.2.0"
4
4
  end
5
5
  end
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.1.2
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-03-17 00:00:00.000000000 Z
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