rubinius-ast 1.1.2 → 1.2.0

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