@@ -285,6 +285,8 @@ def offset(index)
285
285
# list of instructions along with the metadata pertaining to them. It also
286
286
# functions as a builder for the instruction sequence.
287
287
class InstructionSequence
288
+ MAGIC = "YARVInstructionSequence/SimpleDataFormat"
289
+
288
290
# The type of the instruction sequence.
289
291
attr_reader :type
290
292
@@ -363,7 +365,9 @@ def inline_storage_for(name)
363
365
end
364
366
365
367
def length
366
- insns . sum ( &:length )
368
+ insns . inject ( 0 ) do |sum , insn |
369
+ insn . is_a? ( Array ) ? sum + insn . length : sum
370
+ end
367
371
end
368
372
369
373
def each_child
@@ -378,7 +382,7 @@ def to_a
378
382
versions = RUBY_VERSION . split ( "." ) . map ( &:to_i )
379
383
380
384
[
381
- "YARVInstructionSequence/SimpleDataFormat" ,
385
+ MAGIC ,
382
386
versions [ 0 ] ,
383
387
versions [ 1 ] ,
384
388
1 ,
@@ -462,7 +466,13 @@ def initialize(
462
466
# This creates a new label at the current length of the instruction
463
467
# sequence. It is used as the operand for jump instructions.
464
468
def label
465
- :"label_#{ iseq . length } "
469
+ name = :"label_#{ iseq . length } "
470
+ iseq . insns . last == name ? name : event ( name )
471
+ end
472
+
473
+ def event ( name )
474
+ iseq . push ( name )
475
+ name
466
476
end
467
477
468
478
def adjuststack ( number )
@@ -1239,8 +1249,10 @@ def visit_block(node)
1239
1249
current_iseq ,
1240
1250
node
1241
1251
) do
1252
+ builder . event ( :RUBY_EVENT_B_CALL )
1242
1253
visit ( node . block_var )
1243
1254
visit ( node . bodystmt )
1255
+ builder . event ( :RUBY_EVENT_B_RETURN )
1244
1256
builder . leave
1245
1257
end
1246
1258
end
@@ -1429,7 +1441,9 @@ def visit_class(node)
1429
1441
current_iseq ,
1430
1442
node
1431
1443
) do
1444
+ builder . event ( :RUBY_EVENT_CLASS )
1432
1445
visit ( node . bodystmt )
1446
+ builder . event ( :RUBY_EVENT_END )
1433
1447
builder . leave
1434
1448
end
1435
1449
@@ -1500,7 +1514,9 @@ def visit_def(node)
1500
1514
node
1501
1515
) do
1502
1516
visit ( node . params ) if node . params
1517
+ builder . event ( :RUBY_EVENT_CALL )
1503
1518
visit ( node . bodystmt )
1519
+ builder . event ( :RUBY_EVENT_RETURN )
1504
1520
builder . leave
1505
1521
end
1506
1522
@@ -1628,9 +1644,12 @@ def visit_for(node)
1628
1644
1629
1645
local_variable = current_iseq . local_variable ( name )
1630
1646
builder . setlocal ( local_variable . index , local_variable . level )
1647
+
1648
+ builder . event ( :RUBY_EVENT_B_CALL )
1631
1649
builder . nop
1632
1650
1633
1651
visit ( node . statements )
1652
+ builder . event ( :RUBY_EVENT_B_RETURN )
1634
1653
builder . leave
1635
1654
end
1636
1655
@@ -1721,8 +1740,10 @@ def visit_lambda(node)
1721
1740
current_iseq ,
1722
1741
node
1723
1742
) do
1743
+ builder . event ( :RUBY_EVENT_B_CALL )
1724
1744
visit ( node . params )
1725
1745
visit ( node . statements )
1746
+ builder . event ( :RUBY_EVENT_B_RETURN )
1726
1747
builder . leave
1727
1748
end
1728
1749
@@ -1777,7 +1798,9 @@ def visit_module(node)
1777
1798
current_iseq ,
1778
1799
node
1779
1800
) do
1801
+ builder . event ( :RUBY_EVENT_CLASS )
1780
1802
visit ( node . bodystmt )
1803
+ builder . event ( :RUBY_EVENT_END )
1781
1804
builder . leave
1782
1805
end
1783
1806
@@ -2069,7 +2092,9 @@ def visit_sclass(node)
2069
2092
current_iseq ,
2070
2093
node
2071
2094
) do
2095
+ builder . event ( :RUBY_EVENT_CLASS )
2072
2096
visit ( node . bodystmt )
2097
+ builder . event ( :RUBY_EVENT_END )
2073
2098
builder . leave
2074
2099
end
2075
2100
0 commit comments