rubinius-ast 2.1.3 → 2.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/constants.rb +3 -2
- data/lib/rubinius/ast/control_flow.rb +7 -4
- data/lib/rubinius/ast/data.rb +1 -1
- data/lib/rubinius/ast/definitions.rb +375 -241
- data/lib/rubinius/ast/encoding.rb +3 -2
- data/lib/rubinius/ast/exceptions.rb +1 -1
- data/lib/rubinius/ast/file.rb +1 -1
- data/lib/rubinius/ast/grapher.rb +1 -1
- data/lib/rubinius/ast/literals.rb +69 -9
- data/lib/rubinius/ast/node.rb +5 -1
- data/lib/rubinius/ast/operators.rb +83 -17
- data/lib/rubinius/ast/self.rb +1 -1
- data/lib/rubinius/ast/sends.rb +84 -90
- data/lib/rubinius/ast/transforms.rb +1 -1
- data/lib/rubinius/ast/values.rb +123 -11
- data/lib/rubinius/ast/variables.rb +154 -195
- data/lib/rubinius/ast/version.rb +2 -2
- data/rubinius-ast.gemspec +1 -2
- metadata +9 -8
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- encoding: us-ascii -*-
|
2
2
|
|
3
|
-
module
|
3
|
+
module CodeTools
|
4
4
|
module AST
|
5
5
|
class Encoding < Node
|
6
6
|
attr_accessor :name
|
@@ -13,7 +13,8 @@ module Rubinius::ToolSets.current::ToolSet
|
|
13
13
|
def bytecode(g)
|
14
14
|
pos(g)
|
15
15
|
|
16
|
-
g.
|
16
|
+
g.push_rubinius
|
17
|
+
g.find_const :Runtime
|
17
18
|
g.push_literal @name
|
18
19
|
g.send :get_encoding, 1
|
19
20
|
end
|
data/lib/rubinius/ast/file.rb
CHANGED
data/lib/rubinius/ast/grapher.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- encoding: us-ascii -*-
|
2
2
|
|
3
|
-
module
|
3
|
+
module CodeTools
|
4
4
|
module AST
|
5
5
|
class ArrayLiteral < Node
|
6
6
|
attr_accessor :body
|
@@ -132,14 +132,58 @@ module Rubinius::ToolSets.current::ToolSet
|
|
132
132
|
g.send :new_from_literal, 1
|
133
133
|
|
134
134
|
while i < count
|
135
|
-
|
136
|
-
|
135
|
+
key = @array[i]
|
136
|
+
value = @array[i + 1]
|
137
|
+
|
138
|
+
if key
|
139
|
+
g.dup
|
140
|
+
key.bytecode(g)
|
141
|
+
value.bytecode(g)
|
142
|
+
g.send :[]=, 2
|
143
|
+
g.pop
|
144
|
+
else
|
145
|
+
case value
|
146
|
+
when HashLiteral
|
147
|
+
value.merge_entries_bytecode(g)
|
148
|
+
else
|
149
|
+
g.push_rubinius
|
150
|
+
g.find_const :Runtime
|
151
|
+
g.swap
|
152
|
+
value.bytecode(g)
|
153
|
+
g.send :splat_hash_value, 2
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
i += 2
|
158
|
+
end
|
159
|
+
end
|
137
160
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
161
|
+
def merge_entries_bytecode(g)
|
162
|
+
count = @array.size
|
163
|
+
i = 0
|
164
|
+
|
165
|
+
while i < count
|
166
|
+
key = @array[i]
|
167
|
+
value = @array[i + 1]
|
168
|
+
if key
|
169
|
+
g.push_rubinius
|
170
|
+
g.find_const :Runtime
|
171
|
+
g.swap
|
172
|
+
key.bytecode(g)
|
173
|
+
value.bytecode(g)
|
174
|
+
g.send :splat_hash_entry, 3
|
175
|
+
else
|
176
|
+
case value
|
177
|
+
when HashLiteral
|
178
|
+
value.merge_entries_bytecode(g)
|
179
|
+
else
|
180
|
+
g.push_rubinius
|
181
|
+
g.find_const :Runtime
|
182
|
+
g.swap
|
183
|
+
value.bytecode(g)
|
184
|
+
g.send :splat_hash_value, 2
|
185
|
+
end
|
186
|
+
end
|
143
187
|
|
144
188
|
i += 2
|
145
189
|
end
|
@@ -150,7 +194,7 @@ module Rubinius::ToolSets.current::ToolSet
|
|
150
194
|
end
|
151
195
|
|
152
196
|
def to_sexp
|
153
|
-
@array.inject([:hash]) { |s, x| s << x.to_sexp }
|
197
|
+
@array.inject([:hash]) { |s, x| s << (x ? x.to_sexp : [:hash_splat]) }
|
154
198
|
end
|
155
199
|
end
|
156
200
|
|
@@ -233,6 +277,22 @@ module Rubinius::ToolSets.current::ToolSet
|
|
233
277
|
end
|
234
278
|
end
|
235
279
|
|
280
|
+
class RationalLiteral < NumberLiteral
|
281
|
+
def bytecode(g)
|
282
|
+
pos(g)
|
283
|
+
|
284
|
+
g.push_literal @value
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
class ImaginaryLiteral < NumberLiteral
|
289
|
+
def bytecode(g)
|
290
|
+
pos(g)
|
291
|
+
|
292
|
+
g.push_literal @value
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
236
296
|
class Range < Node
|
237
297
|
attr_accessor :start, :finish
|
238
298
|
|
data/lib/rubinius/ast/node.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- encoding: us-ascii -*-
|
2
2
|
|
3
|
-
module
|
3
|
+
module CodeTools
|
4
4
|
module AST
|
5
5
|
class Node
|
6
6
|
attr_accessor :line
|
@@ -64,6 +64,8 @@ module Rubinius::ToolSets.current::ToolSet
|
|
64
64
|
blk.total_args = arguments.total_args
|
65
65
|
blk.splat_index = arguments.splat_index
|
66
66
|
blk.block_index = arguments.block_index
|
67
|
+
blk.arity = arguments.arity
|
68
|
+
blk.keywords = arguments.keywords.entries if arguments.keywords
|
67
69
|
|
68
70
|
blk
|
69
71
|
end
|
@@ -79,6 +81,8 @@ module Rubinius::ToolSets.current::ToolSet
|
|
79
81
|
meth.total_args = arguments.total_args
|
80
82
|
meth.splat_index = arguments.splat_index
|
81
83
|
meth.block_index = arguments.block_index
|
84
|
+
meth.arity = arguments.arity
|
85
|
+
meth.keywords = arguments.keywords.entries if arguments.keywords
|
82
86
|
end
|
83
87
|
|
84
88
|
meth
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- encoding: us-ascii -*-
|
2
2
|
|
3
|
-
module
|
3
|
+
module CodeTools
|
4
4
|
module AST
|
5
5
|
class And < Node
|
6
6
|
attr_accessor :left, :right
|
@@ -102,7 +102,7 @@ module Rubinius::ToolSets.current::ToolSet
|
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
105
|
-
class
|
105
|
+
class OpAssignElement < Node
|
106
106
|
attr_accessor :receiver, :op, :arguments, :value
|
107
107
|
|
108
108
|
def initialize(line, receiver, arguments, op, value)
|
@@ -110,7 +110,7 @@ module Rubinius::ToolSets.current::ToolSet
|
|
110
110
|
@receiver = receiver
|
111
111
|
@op = op
|
112
112
|
arguments = nil if arguments.is_a?(EmptyArray)
|
113
|
-
@arguments =
|
113
|
+
@arguments = Arguments.new line, arguments
|
114
114
|
@value = value
|
115
115
|
end
|
116
116
|
|
@@ -146,6 +146,7 @@ module Rubinius::ToolSets.current::ToolSet
|
|
146
146
|
if @op == :or or @op == :and
|
147
147
|
fnd = g.new_label
|
148
148
|
fin = g.new_label
|
149
|
+
assign = g.new_label
|
149
150
|
|
150
151
|
# We dup the value from [] to leave it as the value of the
|
151
152
|
# expression
|
@@ -162,8 +163,25 @@ module Rubinius::ToolSets.current::ToolSet
|
|
162
163
|
|
163
164
|
# The receiver and arguments are still on the stack
|
164
165
|
|
166
|
+
old_break = g.break
|
167
|
+
new_break = g.new_label
|
168
|
+
g.break = new_break
|
169
|
+
|
165
170
|
@value.bytecode(g)
|
166
171
|
|
172
|
+
g.goto assign
|
173
|
+
|
174
|
+
new_break.set!
|
175
|
+
if old_break
|
176
|
+
g.pop_many recv_stack + 1
|
177
|
+
g.push :nil
|
178
|
+
g.goto old_break
|
179
|
+
end
|
180
|
+
|
181
|
+
g.break = old_break
|
182
|
+
|
183
|
+
assign.set!
|
184
|
+
|
167
185
|
# retain the rhs as the expression value
|
168
186
|
g.dup
|
169
187
|
g.move_down recv_stack + 1
|
@@ -188,11 +206,30 @@ module Rubinius::ToolSets.current::ToolSet
|
|
188
206
|
|
189
207
|
fin.set!
|
190
208
|
else
|
209
|
+
assign = g.new_label
|
210
|
+
|
211
|
+
old_break = g.break
|
212
|
+
new_break = g.new_label
|
213
|
+
g.break = new_break
|
214
|
+
|
191
215
|
# @op is something like + or -
|
192
216
|
# We pull in @value to the stack
|
193
217
|
@value.bytecode(g)
|
194
218
|
# X: 3 TOS
|
195
219
|
|
220
|
+
g.goto assign
|
221
|
+
|
222
|
+
new_break.set!
|
223
|
+
if old_break
|
224
|
+
g.pop_many recv_stack + 2
|
225
|
+
g.push :nil
|
226
|
+
g.goto old_break
|
227
|
+
end
|
228
|
+
|
229
|
+
g.break = old_break
|
230
|
+
|
231
|
+
assign.set!
|
232
|
+
|
196
233
|
# ... then call it as an argument to @or, called on the return
|
197
234
|
# from [].
|
198
235
|
# X: 2 + 3
|
@@ -233,7 +270,7 @@ module Rubinius::ToolSets.current::ToolSet
|
|
233
270
|
end
|
234
271
|
end
|
235
272
|
|
236
|
-
class
|
273
|
+
class OpAssignAttribute < Node
|
237
274
|
attr_accessor :receiver, :name, :assign, :op, :value
|
238
275
|
|
239
276
|
def initialize(line, receiver, name, op, value)
|
@@ -248,7 +285,7 @@ module Rubinius::ToolSets.current::ToolSet
|
|
248
285
|
def bytecode(g)
|
249
286
|
pos(g)
|
250
287
|
|
251
|
-
# X: h
|
288
|
+
# X: h.a += 3, given h.a == 2
|
252
289
|
@receiver.bytecode(g)
|
253
290
|
# X: TOS = h
|
254
291
|
g.dup
|
@@ -258,6 +295,7 @@ module Rubinius::ToolSets.current::ToolSet
|
|
258
295
|
if @op == :or or @op == :and
|
259
296
|
fnd = g.new_label
|
260
297
|
fin = g.new_label
|
298
|
+
assign = g.new_label
|
261
299
|
|
262
300
|
g.dup
|
263
301
|
if @op == :or
|
@@ -268,8 +306,26 @@ module Rubinius::ToolSets.current::ToolSet
|
|
268
306
|
|
269
307
|
# Remove the copy of 2 and push @value on the stack
|
270
308
|
g.pop
|
309
|
+
|
310
|
+
old_break = g.break
|
311
|
+
new_break = g.new_label
|
312
|
+
g.break = new_break
|
313
|
+
|
271
314
|
@value.bytecode(g)
|
272
315
|
|
316
|
+
g.goto assign
|
317
|
+
|
318
|
+
new_break.set!
|
319
|
+
if old_break
|
320
|
+
g.pop_many 2
|
321
|
+
g.push :nil
|
322
|
+
g.goto old_break
|
323
|
+
end
|
324
|
+
|
325
|
+
g.break = old_break
|
326
|
+
|
327
|
+
assign.set!
|
328
|
+
|
273
329
|
# Retain the this value to use as the expression value
|
274
330
|
g.dup
|
275
331
|
g.move_down 2
|
@@ -288,7 +344,27 @@ module Rubinius::ToolSets.current::ToolSet
|
|
288
344
|
|
289
345
|
fin.set!
|
290
346
|
else
|
347
|
+
assign = g.new_label
|
348
|
+
|
349
|
+
old_break = g.break
|
350
|
+
new_break = g.new_label
|
351
|
+
g.break = new_break
|
352
|
+
|
291
353
|
@value.bytecode(g)
|
354
|
+
|
355
|
+
g.goto assign
|
356
|
+
|
357
|
+
new_break.set!
|
358
|
+
if old_break
|
359
|
+
g.pop_many 3
|
360
|
+
g.push :nil
|
361
|
+
g.goto old_break
|
362
|
+
end
|
363
|
+
|
364
|
+
g.break = old_break
|
365
|
+
|
366
|
+
assign.set!
|
367
|
+
|
292
368
|
# X: TOS = 3
|
293
369
|
# X: 2 + 3
|
294
370
|
g.send @op, 1
|
@@ -356,7 +432,9 @@ module Rubinius::ToolSets.current::ToolSet
|
|
356
432
|
def bytecode(g)
|
357
433
|
pos(g)
|
358
434
|
|
435
|
+
g.state.push_op_asgn
|
359
436
|
@left.or_bytecode(g) do
|
437
|
+
g.state.pop_op_asgn
|
360
438
|
@right.bytecode(g)
|
361
439
|
end
|
362
440
|
end
|
@@ -365,17 +443,5 @@ module Rubinius::ToolSets.current::ToolSet
|
|
365
443
|
:op_asgn_or
|
366
444
|
end
|
367
445
|
end
|
368
|
-
|
369
|
-
class OpAssignOr19 < OpAssignOr
|
370
|
-
def bytecode(g)
|
371
|
-
pos(g)
|
372
|
-
|
373
|
-
g.state.push_op_asgn
|
374
|
-
@left.or_bytecode(g) do
|
375
|
-
g.state.pop_op_asgn
|
376
|
-
@right.bytecode(g)
|
377
|
-
end
|
378
|
-
end
|
379
|
-
end
|
380
446
|
end
|
381
447
|
end
|
data/lib/rubinius/ast/self.rb
CHANGED
data/lib/rubinius/ast/sends.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- encoding: us-ascii -*-
|
2
2
|
|
3
|
-
module
|
3
|
+
module CodeTools
|
4
4
|
module AST
|
5
5
|
class Send < Node
|
6
6
|
attr_accessor :receiver, :name, :privately, :block, :variable, :vcall_style
|
@@ -131,7 +131,7 @@ module Rubinius::ToolSets.current::ToolSet
|
|
131
131
|
def initialize(line, receiver, name, arguments, privately=false)
|
132
132
|
super line, receiver, name, privately
|
133
133
|
@block = nil
|
134
|
-
@arguments =
|
134
|
+
@arguments = Arguments.new line, arguments
|
135
135
|
end
|
136
136
|
|
137
137
|
def bytecode(g)
|
@@ -167,7 +167,7 @@ module Rubinius::ToolSets.current::ToolSet
|
|
167
167
|
|
168
168
|
@name = :"#{name}="
|
169
169
|
|
170
|
-
@arguments =
|
170
|
+
@arguments = Arguments.new line, arguments
|
171
171
|
end
|
172
172
|
|
173
173
|
def bytecode(g)
|
@@ -209,9 +209,9 @@ module Rubinius::ToolSets.current::ToolSet
|
|
209
209
|
|
210
210
|
case arguments
|
211
211
|
when PushArgs
|
212
|
-
@arguments =
|
212
|
+
@arguments = PushArguments.new line, arguments
|
213
213
|
else
|
214
|
-
@arguments =
|
214
|
+
@arguments = Arguments.new line, arguments
|
215
215
|
end
|
216
216
|
end
|
217
217
|
|
@@ -228,13 +228,24 @@ module Rubinius::ToolSets.current::ToolSet
|
|
228
228
|
|
229
229
|
@receiver.bytecode(g)
|
230
230
|
@arguments.bytecode(g)
|
231
|
+
|
231
232
|
g.dup
|
232
233
|
|
233
234
|
if @arguments.splat?
|
234
|
-
|
235
|
-
|
235
|
+
case @arguments
|
236
|
+
when PushArguments
|
237
|
+
g.move_down @arguments.size + 2
|
238
|
+
g.swap
|
239
|
+
flag = true
|
240
|
+
when Arguments
|
241
|
+
# TODO: Optimize bytecode for x[a, *b, c, d] = e
|
242
|
+
g.send :last, 0, true
|
243
|
+
g.move_down @arguments.size + 2
|
244
|
+
flag = false
|
245
|
+
end
|
246
|
+
|
236
247
|
g.push :nil
|
237
|
-
g.send_with_splat @name, @arguments.size, @privately,
|
248
|
+
g.send_with_splat @name, @arguments.size, @privately, flag
|
238
249
|
else
|
239
250
|
g.move_down @arguments.size + 1
|
240
251
|
g.send @name, @arguments.size, @privately
|
@@ -261,7 +272,8 @@ module Rubinius::ToolSets.current::ToolSet
|
|
261
272
|
g.push_state ClosedScope.new(@line)
|
262
273
|
g.state.push_name :BEGIN
|
263
274
|
|
264
|
-
g.
|
275
|
+
g.push_rubinius
|
276
|
+
g.find_const :Runtime
|
265
277
|
@block.bytecode(g)
|
266
278
|
g.send_with_block :pre_exe, 0, false
|
267
279
|
|
@@ -285,10 +297,13 @@ module Rubinius::ToolSets.current::ToolSet
|
|
285
297
|
end
|
286
298
|
end
|
287
299
|
|
288
|
-
class
|
289
|
-
|
290
|
-
|
291
|
-
|
300
|
+
class PushArguments < Node
|
301
|
+
attr_accessor :arguments
|
302
|
+
|
303
|
+
def initialize(line, node)
|
304
|
+
@line = line
|
305
|
+
@arguments = node.arguments
|
306
|
+
@value = node.value
|
292
307
|
end
|
293
308
|
|
294
309
|
def size
|
@@ -305,7 +320,7 @@ module Rubinius::ToolSets.current::ToolSet
|
|
305
320
|
end
|
306
321
|
|
307
322
|
def to_sexp
|
308
|
-
[@arguments.to_sexp, @value.to_sexp]
|
323
|
+
[:argspush, @arguments.to_sexp, @value.to_sexp]
|
309
324
|
end
|
310
325
|
end
|
311
326
|
|
@@ -357,6 +372,8 @@ module Rubinius::ToolSets.current::ToolSet
|
|
357
372
|
end
|
358
373
|
|
359
374
|
class CollectSplat < Node
|
375
|
+
attr_accessor :splat, :array, :last
|
376
|
+
|
360
377
|
def initialize(line, *parts)
|
361
378
|
@line = line
|
362
379
|
@splat = parts.shift
|
@@ -366,7 +383,6 @@ module Rubinius::ToolSets.current::ToolSet
|
|
366
383
|
|
367
384
|
def bytecode(g)
|
368
385
|
@splat.bytecode(g)
|
369
|
-
g.cast_array
|
370
386
|
|
371
387
|
@array.each do |x|
|
372
388
|
x.bytecode(g)
|
@@ -380,13 +396,12 @@ module Rubinius::ToolSets.current::ToolSet
|
|
380
396
|
done = g.new_label
|
381
397
|
|
382
398
|
@last.bytecode(g)
|
383
|
-
g.dup
|
384
399
|
|
385
|
-
g.
|
386
|
-
|
387
|
-
g.
|
388
|
-
g.
|
389
|
-
g.
|
400
|
+
g.dup
|
401
|
+
g.push_cpath_top
|
402
|
+
g.find_const :Hash
|
403
|
+
g.swap
|
404
|
+
g.kind_of
|
390
405
|
g.gif not_hash
|
391
406
|
|
392
407
|
g.make_array 1
|
@@ -404,7 +419,7 @@ module Rubinius::ToolSets.current::ToolSet
|
|
404
419
|
end
|
405
420
|
end
|
406
421
|
|
407
|
-
class
|
422
|
+
class Arguments < Node
|
408
423
|
attr_accessor :array, :splat
|
409
424
|
|
410
425
|
def initialize(line, arguments=nil)
|
@@ -491,13 +506,18 @@ module Rubinius::ToolSets.current::ToolSet
|
|
491
506
|
|
492
507
|
def initialize(line, arguments, body)
|
493
508
|
@line = line
|
494
|
-
@arguments =
|
509
|
+
@arguments = arguments || Parameters.new(line)
|
495
510
|
@body = body || NilLiteral.new(line)
|
511
|
+
|
512
|
+
if @body.kind_of?(Block) and @body.locals
|
513
|
+
@locals = @body.locals.body.map { |x| x.value }
|
514
|
+
else
|
515
|
+
@locals = nil
|
516
|
+
end
|
496
517
|
end
|
497
518
|
|
498
|
-
# 1.8 doesn't support declared Iter locals
|
499
519
|
def block_local?(name)
|
500
|
-
|
520
|
+
@locals.include?(name) if @locals
|
501
521
|
end
|
502
522
|
|
503
523
|
def module?
|
@@ -600,31 +620,17 @@ module Rubinius::ToolSets.current::ToolSet
|
|
600
620
|
end
|
601
621
|
|
602
622
|
def to_sexp
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
class Iter19 < Iter
|
608
|
-
def initialize(line, arguments, body)
|
609
|
-
@line = line
|
610
|
-
@arguments = arguments || IterArguments.new(line, nil)
|
611
|
-
@body = body || NilLiteral.new(line)
|
612
|
-
|
613
|
-
if @body.kind_of?(Block) and @body.locals
|
614
|
-
@locals = @body.locals.body.map { |x| x.value }
|
615
|
-
else
|
616
|
-
@locals = nil
|
623
|
+
body_sexp = @body.to_sexp
|
624
|
+
if @locals
|
625
|
+
body_sexp[1] = @locals.map { |x| [:lvar, x] }
|
617
626
|
end
|
618
|
-
|
619
|
-
|
620
|
-
def block_local?(name)
|
621
|
-
@locals.include?(name) if @locals
|
627
|
+
[sexp_name, @arguments.to_sexp, body_sexp]
|
622
628
|
end
|
623
629
|
end
|
624
630
|
|
625
631
|
class IterArguments < Node
|
626
632
|
attr_accessor :prelude, :arity, :optional, :arguments, :splat_index, :block_index
|
627
|
-
attr_accessor :required_args
|
633
|
+
attr_accessor :required_args, :keywords
|
628
634
|
|
629
635
|
def initialize(line, arguments)
|
630
636
|
@line = line
|
@@ -780,6 +786,14 @@ module Rubinius::ToolSets.current::ToolSet
|
|
780
786
|
end
|
781
787
|
|
782
788
|
class For < Iter
|
789
|
+
def initialize(line, arguments, body)
|
790
|
+
@line = line
|
791
|
+
@arguments = ForParameters.new line, arguments
|
792
|
+
@body = body || NilLiteral.new(line)
|
793
|
+
|
794
|
+
new_local :"$for_args"
|
795
|
+
end
|
796
|
+
|
783
797
|
def nest_scope(scope)
|
784
798
|
scope.parent = self
|
785
799
|
end
|
@@ -814,25 +828,36 @@ module Rubinius::ToolSets.current::ToolSet
|
|
814
828
|
end
|
815
829
|
end
|
816
830
|
|
817
|
-
class
|
818
|
-
|
831
|
+
class ForParameters < Node
|
832
|
+
attr_accessor :assignments, :required_args, :splat_index,
|
833
|
+
:post_args, :keywords, :block_index
|
819
834
|
|
820
|
-
def initialize(line,
|
835
|
+
def initialize(line, assignments)
|
821
836
|
@line = line
|
822
|
-
@
|
837
|
+
@assignments = assignments
|
838
|
+
@splat_index = assignments.kind_of?(MultipleAssignment) ? 0 : nil
|
839
|
+
@required_args = @splat_index ? 0 : 1
|
840
|
+
@post_args = 0
|
841
|
+
@keywords = nil
|
842
|
+
@block_index = nil
|
843
|
+
end
|
823
844
|
|
824
|
-
|
825
|
-
|
826
|
-
|
827
|
-
|
828
|
-
|
829
|
-
|
845
|
+
alias_method :total_args, :required_args
|
846
|
+
alias_method :arity, :required_args
|
847
|
+
|
848
|
+
def map_arguments(scope)
|
849
|
+
case @assignments
|
850
|
+
when LocalVariable
|
851
|
+
scope.assign_local_reference @assignments
|
830
852
|
end
|
831
853
|
end
|
832
854
|
|
833
855
|
def bytecode(g)
|
834
|
-
|
835
|
-
|
856
|
+
map_arguments(g.state.scope)
|
857
|
+
|
858
|
+
if @splat_index
|
859
|
+
g.push_rubinius
|
860
|
+
g.find_const :Runtime
|
836
861
|
g.push_local 0
|
837
862
|
g.send :unwrap_block_arg, 1
|
838
863
|
else
|
@@ -840,39 +865,8 @@ module Rubinius::ToolSets.current::ToolSet
|
|
840
865
|
end
|
841
866
|
|
842
867
|
g.state.push_masgn
|
843
|
-
@
|
868
|
+
@assignments.bytecode(g)
|
844
869
|
g.state.pop_masgn
|
845
|
-
g.pop
|
846
|
-
end
|
847
|
-
|
848
|
-
def required_args
|
849
|
-
@args
|
850
|
-
end
|
851
|
-
|
852
|
-
def total_args
|
853
|
-
@args
|
854
|
-
end
|
855
|
-
|
856
|
-
def post_args
|
857
|
-
0
|
858
|
-
end
|
859
|
-
|
860
|
-
def splat_index
|
861
|
-
@splat
|
862
|
-
end
|
863
|
-
|
864
|
-
def to_sexp
|
865
|
-
@arguments.to_sexp
|
866
|
-
end
|
867
|
-
end
|
868
|
-
|
869
|
-
class For19 < For
|
870
|
-
def initialize(line, arguments, body)
|
871
|
-
@line = line
|
872
|
-
@arguments = For19Arguments.new line, arguments
|
873
|
-
@body = body || NilLiteral.new(line)
|
874
|
-
|
875
|
-
new_local :"$for_args"
|
876
870
|
end
|
877
871
|
end
|
878
872
|
|
@@ -907,7 +901,7 @@ module Rubinius::ToolSets.current::ToolSet
|
|
907
901
|
@line = line
|
908
902
|
@block = nil
|
909
903
|
@name = nil
|
910
|
-
@arguments =
|
904
|
+
@arguments = Arguments.new line, arguments
|
911
905
|
end
|
912
906
|
|
913
907
|
def block_bytecode(g)
|
@@ -967,7 +961,7 @@ module Rubinius::ToolSets.current::ToolSet
|
|
967
961
|
arguments = ArrayLiteral.new line, [arguments]
|
968
962
|
end
|
969
963
|
|
970
|
-
@arguments =
|
964
|
+
@arguments = Arguments.new line, arguments
|
971
965
|
@argument_count = @arguments.size
|
972
966
|
@yield_splat = false
|
973
967
|
|