syntax_tree 5.1.0 → 5.3.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.
@@ -91,6 +91,14 @@ module SyntaxTree
91
91
  [:adjuststack, number]
92
92
  end
93
93
 
94
+ def deconstruct_keys(_keys)
95
+ { number: number }
96
+ end
97
+
98
+ def ==(other)
99
+ other.is_a?(AdjustStack) && other.number == number
100
+ end
101
+
94
102
  def length
95
103
  2
96
104
  end
@@ -139,6 +147,14 @@ module SyntaxTree
139
147
  [:anytostring]
140
148
  end
141
149
 
150
+ def deconstruct_keys(_keys)
151
+ {}
152
+ end
153
+
154
+ def ==(other)
155
+ other.is_a?(AnyToString)
156
+ end
157
+
142
158
  def length
143
159
  1
144
160
  end
@@ -197,6 +213,14 @@ module SyntaxTree
197
213
  [:branchif, label.name]
198
214
  end
199
215
 
216
+ def deconstruct_keys(_keys)
217
+ { label: label }
218
+ end
219
+
220
+ def ==(other)
221
+ other.is_a?(BranchIf) && other.label == label
222
+ end
223
+
200
224
  def length
201
225
  2
202
226
  end
@@ -250,6 +274,14 @@ module SyntaxTree
250
274
  [:branchnil, label.name]
251
275
  end
252
276
 
277
+ def deconstruct_keys(_keys)
278
+ { label: label }
279
+ end
280
+
281
+ def ==(other)
282
+ other.is_a?(BranchNil) && other.label == label
283
+ end
284
+
253
285
  def length
254
286
  2
255
287
  end
@@ -302,6 +334,14 @@ module SyntaxTree
302
334
  [:branchunless, label.name]
303
335
  end
304
336
 
337
+ def deconstruct_keys(_keys)
338
+ { label: label }
339
+ end
340
+
341
+ def ==(other)
342
+ other.is_a?(BranchUnless) && other.label == label
343
+ end
344
+
305
345
  def length
306
346
  2
307
347
  end
@@ -365,6 +405,16 @@ module SyntaxTree
365
405
  ]
366
406
  end
367
407
 
408
+ def deconstruct_keys(_keys)
409
+ { keyword_bits_index: keyword_bits_index, keyword_index: keyword_index }
410
+ end
411
+
412
+ def ==(other)
413
+ other.is_a?(CheckKeyword) &&
414
+ other.keyword_bits_index == keyword_bits_index &&
415
+ other.keyword_index == keyword_index
416
+ end
417
+
368
418
  def length
369
419
  3
370
420
  end
@@ -399,9 +449,11 @@ module SyntaxTree
399
449
  # ~~~
400
450
  #
401
451
  class CheckMatch
402
- TYPE_WHEN = 1
403
- TYPE_CASE = 2
404
- TYPE_RESCUE = 3
452
+ VM_CHECKMATCH_TYPE_WHEN = 1
453
+ VM_CHECKMATCH_TYPE_CASE = 2
454
+ VM_CHECKMATCH_TYPE_RESCUE = 3
455
+ VM_CHECKMATCH_TYPE_MASK = 0x03
456
+ VM_CHECKMATCH_ARRAY = 0x04
405
457
 
406
458
  attr_reader :type
407
459
 
@@ -417,6 +469,14 @@ module SyntaxTree
417
469
  [:checkmatch, type]
418
470
  end
419
471
 
472
+ def deconstruct_keys(_keys)
473
+ { type: type }
474
+ end
475
+
476
+ def ==(other)
477
+ other.is_a?(CheckMatch) && other.type == type
478
+ end
479
+
420
480
  def length
421
481
  2
422
482
  end
@@ -434,7 +494,32 @@ module SyntaxTree
434
494
  end
435
495
 
436
496
  def call(vm)
437
- raise NotImplementedError, "checkmatch"
497
+ target, pattern = vm.pop(2)
498
+
499
+ vm.push(
500
+ if type & VM_CHECKMATCH_ARRAY > 0
501
+ pattern.any? { |item| check?(item, target) }
502
+ else
503
+ check?(pattern, target)
504
+ end
505
+ )
506
+ end
507
+
508
+ private
509
+
510
+ def check?(pattern, target)
511
+ case type & VM_CHECKMATCH_TYPE_MASK
512
+ when VM_CHECKMATCH_TYPE_WHEN
513
+ pattern
514
+ when VM_CHECKMATCH_TYPE_CASE
515
+ pattern === target
516
+ when VM_CHECKMATCH_TYPE_RESCUE
517
+ unless pattern.is_a?(Module)
518
+ raise TypeError, "class or module required for rescue clause"
519
+ end
520
+
521
+ pattern === target
522
+ end
438
523
  end
439
524
  end
440
525
 
@@ -534,6 +619,14 @@ module SyntaxTree
534
619
  [:checktype, type]
535
620
  end
536
621
 
622
+ def deconstruct_keys(_keys)
623
+ { type: type }
624
+ end
625
+
626
+ def ==(other)
627
+ other.is_a?(CheckType) && other.type == type
628
+ end
629
+
537
630
  def length
538
631
  2
539
632
  end
@@ -629,6 +722,14 @@ module SyntaxTree
629
722
  [:concatarray]
630
723
  end
631
724
 
725
+ def deconstruct_keys(_keys)
726
+ {}
727
+ end
728
+
729
+ def ==(other)
730
+ other.is_a?(ConcatArray)
731
+ end
732
+
632
733
  def length
633
734
  1
634
735
  end
@@ -681,6 +782,14 @@ module SyntaxTree
681
782
  [:concatstrings, number]
682
783
  end
683
784
 
785
+ def deconstruct_keys(_keys)
786
+ { number: number }
787
+ end
788
+
789
+ def ==(other)
790
+ other.is_a?(ConcatStrings) && other.number == number
791
+ end
792
+
684
793
  def length
685
794
  2
686
795
  end
@@ -744,6 +853,15 @@ module SyntaxTree
744
853
  [:defineclass, name, class_iseq.to_a, flags]
745
854
  end
746
855
 
856
+ def deconstruct_keys(_keys)
857
+ { name: name, class_iseq: class_iseq, flags: flags }
858
+ end
859
+
860
+ def ==(other)
861
+ other.is_a?(DefineClass) && other.name == name &&
862
+ other.class_iseq == class_iseq && other.flags == flags
863
+ end
864
+
747
865
  def length
748
866
  4
749
867
  end
@@ -762,12 +880,26 @@ module SyntaxTree
762
880
 
763
881
  def call(vm)
764
882
  object, superclass = vm.pop(2)
765
- iseq = class_iseq
766
883
 
767
- clazz = Class.new(superclass || Object)
768
- vm.push(vm.run_class_frame(iseq, clazz))
884
+ if name == :singletonclass
885
+ vm.push(vm.run_class_frame(class_iseq, object.singleton_class))
886
+ elsif object.const_defined?(name)
887
+ vm.push(vm.run_class_frame(class_iseq, object.const_get(name)))
888
+ elsif flags & TYPE_MODULE > 0
889
+ clazz = Module.new
890
+ object.const_set(name, clazz)
891
+ vm.push(vm.run_class_frame(class_iseq, clazz))
892
+ else
893
+ clazz =
894
+ if flags & FLAG_HAS_SUPERCLASS > 0
895
+ Class.new(superclass)
896
+ else
897
+ Class.new
898
+ end
769
899
 
770
- object.const_set(name, clazz)
900
+ object.const_set(name, clazz)
901
+ vm.push(vm.run_class_frame(class_iseq, clazz))
902
+ end
771
903
  end
772
904
  end
773
905
 
@@ -858,6 +990,15 @@ module SyntaxTree
858
990
  [:defined, type, name, message]
859
991
  end
860
992
 
993
+ def deconstruct_keys(_keys)
994
+ { type: type, name: name, message: message }
995
+ end
996
+
997
+ def ==(other)
998
+ other.is_a?(Defined) && other.type == type && other.name == name &&
999
+ other.message == message
1000
+ end
1001
+
861
1002
  def length
862
1003
  4
863
1004
  end
@@ -882,17 +1023,19 @@ module SyntaxTree
882
1023
  when TYPE_NIL, TYPE_SELF, TYPE_TRUE, TYPE_FALSE, TYPE_ASGN, TYPE_EXPR
883
1024
  message
884
1025
  when TYPE_IVAR
885
- message if vm._self.instance_variable_defined?(name)
1026
+ message if vm.frame._self.instance_variable_defined?(name)
886
1027
  when TYPE_LVAR
887
1028
  raise NotImplementedError, "defined TYPE_LVAR"
888
1029
  when TYPE_GVAR
889
1030
  message if global_variables.include?(name)
890
1031
  when TYPE_CVAR
891
- clazz = vm._self
1032
+ clazz = vm.frame._self
892
1033
  clazz = clazz.singleton_class unless clazz.is_a?(Module)
893
1034
  message if clazz.class_variable_defined?(name)
894
1035
  when TYPE_CONST
895
- raise NotImplementedError, "defined TYPE_CONST"
1036
+ clazz = vm.frame._self
1037
+ clazz = clazz.singleton_class unless clazz.is_a?(Module)
1038
+ message if clazz.const_defined?(name)
896
1039
  when TYPE_METHOD
897
1040
  raise NotImplementedError, "defined TYPE_METHOD"
898
1041
  when TYPE_YIELD
@@ -904,7 +1047,9 @@ module SyntaxTree
904
1047
  when TYPE_FUNC
905
1048
  message if object.respond_to?(name, true)
906
1049
  when TYPE_CONST_FROM
907
- raise NotImplementedError, "defined TYPE_CONST_FROM"
1050
+ defined =
1051
+ vm.frame.nesting.any? { |scope| scope.const_defined?(name, true) }
1052
+ message if defined
908
1053
  end
909
1054
 
910
1055
  vm.push(result)
@@ -944,6 +1089,15 @@ module SyntaxTree
944
1089
  [:definemethod, method_name, method_iseq.to_a]
945
1090
  end
946
1091
 
1092
+ def deconstruct_keys(_keys)
1093
+ { method_name: method_name, method_iseq: method_iseq }
1094
+ end
1095
+
1096
+ def ==(other)
1097
+ other.is_a?(DefineMethod) && other.method_name == method_name &&
1098
+ other.method_iseq == method_iseq
1099
+ end
1100
+
947
1101
  def length
948
1102
  3
949
1103
  end
@@ -962,12 +1116,22 @@ module SyntaxTree
962
1116
 
963
1117
  def call(vm)
964
1118
  name = method_name
1119
+ nesting = vm.frame.nesting
965
1120
  iseq = method_iseq
966
1121
 
967
1122
  vm
1123
+ .frame
968
1124
  ._self
969
1125
  .__send__(:define_method, name) do |*args, **kwargs, &block|
970
- vm.run_method_frame(name, iseq, self, *args, **kwargs, &block)
1126
+ vm.run_method_frame(
1127
+ name,
1128
+ nesting,
1129
+ iseq,
1130
+ self,
1131
+ *args,
1132
+ **kwargs,
1133
+ &block
1134
+ )
971
1135
  end
972
1136
  end
973
1137
  end
@@ -1006,6 +1170,15 @@ module SyntaxTree
1006
1170
  [:definesmethod, method_name, method_iseq.to_a]
1007
1171
  end
1008
1172
 
1173
+ def deconstruct_keys(_keys)
1174
+ { method_name: method_name, method_iseq: method_iseq }
1175
+ end
1176
+
1177
+ def ==(other)
1178
+ other.is_a?(DefineSMethod) && other.method_name == method_name &&
1179
+ other.method_iseq == method_iseq
1180
+ end
1181
+
1009
1182
  def length
1010
1183
  3
1011
1184
  end
@@ -1024,12 +1197,22 @@ module SyntaxTree
1024
1197
 
1025
1198
  def call(vm)
1026
1199
  name = method_name
1200
+ nesting = vm.frame.nesting
1027
1201
  iseq = method_iseq
1028
1202
 
1029
1203
  vm
1204
+ .frame
1030
1205
  ._self
1031
1206
  .__send__(:define_singleton_method, name) do |*args, **kwargs, &block|
1032
- vm.run_method_frame(name, iseq, self, *args, **kwargs, &block)
1207
+ vm.run_method_frame(
1208
+ name,
1209
+ nesting,
1210
+ iseq,
1211
+ self,
1212
+ *args,
1213
+ **kwargs,
1214
+ &block
1215
+ )
1033
1216
  end
1034
1217
  end
1035
1218
  end
@@ -1053,6 +1236,14 @@ module SyntaxTree
1053
1236
  [:dup]
1054
1237
  end
1055
1238
 
1239
+ def deconstruct_keys(_keys)
1240
+ {}
1241
+ end
1242
+
1243
+ def ==(other)
1244
+ other.is_a?(Dup)
1245
+ end
1246
+
1056
1247
  def length
1057
1248
  1
1058
1249
  end
@@ -1099,6 +1290,14 @@ module SyntaxTree
1099
1290
  [:duparray, object]
1100
1291
  end
1101
1292
 
1293
+ def deconstruct_keys(_keys)
1294
+ { object: object }
1295
+ end
1296
+
1297
+ def ==(other)
1298
+ other.is_a?(DupArray) && other.object == object
1299
+ end
1300
+
1102
1301
  def length
1103
1302
  2
1104
1303
  end
@@ -1145,6 +1344,14 @@ module SyntaxTree
1145
1344
  [:duphash, object]
1146
1345
  end
1147
1346
 
1347
+ def deconstruct_keys(_keys)
1348
+ { object: object }
1349
+ end
1350
+
1351
+ def ==(other)
1352
+ other.is_a?(DupHash) && other.object == object
1353
+ end
1354
+
1148
1355
  def length
1149
1356
  2
1150
1357
  end
@@ -1191,6 +1398,14 @@ module SyntaxTree
1191
1398
  [:dupn, number]
1192
1399
  end
1193
1400
 
1401
+ def deconstruct_keys(_keys)
1402
+ { number: number }
1403
+ end
1404
+
1405
+ def ==(other)
1406
+ other.is_a?(DupN) && other.number == number
1407
+ end
1408
+
1194
1409
  def length
1195
1410
  2
1196
1411
  end
@@ -1242,6 +1457,15 @@ module SyntaxTree
1242
1457
  [:expandarray, number, flags]
1243
1458
  end
1244
1459
 
1460
+ def deconstruct_keys(_keys)
1461
+ { number: number, flags: flags }
1462
+ end
1463
+
1464
+ def ==(other)
1465
+ other.is_a?(ExpandArray) && other.number == number &&
1466
+ other.flags == flags
1467
+ end
1468
+
1245
1469
  def length
1246
1470
  3
1247
1471
  end
@@ -1259,7 +1483,42 @@ module SyntaxTree
1259
1483
  end
1260
1484
 
1261
1485
  def call(vm)
1262
- raise NotImplementedError, "expandarray"
1486
+ object = vm.pop
1487
+ object =
1488
+ if Array === object
1489
+ object.dup
1490
+ elsif object.respond_to?(:to_ary, true)
1491
+ object.to_ary
1492
+ else
1493
+ [object]
1494
+ end
1495
+
1496
+ splat_flag = flags & 0x01 > 0
1497
+ postarg_flag = flags & 0x02 > 0
1498
+
1499
+ if number == 0 && splat_flag == 0
1500
+ # no space left on stack
1501
+ elsif postarg_flag
1502
+ values = []
1503
+
1504
+ if number > object.size
1505
+ (number - object.size).times { values.push(nil) }
1506
+ end
1507
+ [number, object.size].min.times { values.push(object.pop) }
1508
+ values.push(object.to_a) if splat_flag
1509
+
1510
+ values.each { |item| vm.push(item) }
1511
+ else
1512
+ values = []
1513
+
1514
+ [number, object.size].min.times { values.push(object.shift) }
1515
+ if number > values.size
1516
+ (number - values.size).times { values.push(nil) }
1517
+ end
1518
+ values.push(object.to_a) if splat_flag
1519
+
1520
+ values.reverse_each { |item| vm.push(item) }
1521
+ end
1263
1522
  end
1264
1523
  end
1265
1524
 
@@ -1298,6 +1557,15 @@ module SyntaxTree
1298
1557
  [:getblockparam, current.local_table.offset(index), level]
1299
1558
  end
1300
1559
 
1560
+ def deconstruct_keys(_keys)
1561
+ { index: index, level: level }
1562
+ end
1563
+
1564
+ def ==(other)
1565
+ other.is_a?(GetBlockParam) && other.index == index &&
1566
+ other.level == level
1567
+ end
1568
+
1301
1569
  def length
1302
1570
  3
1303
1571
  end
@@ -1355,6 +1623,15 @@ module SyntaxTree
1355
1623
  [:getblockparamproxy, current.local_table.offset(index), level]
1356
1624
  end
1357
1625
 
1626
+ def deconstruct_keys(_keys)
1627
+ { index: index, level: level }
1628
+ end
1629
+
1630
+ def ==(other)
1631
+ other.is_a?(GetBlockParamProxy) && other.index == index &&
1632
+ other.level == level
1633
+ end
1634
+
1358
1635
  def length
1359
1636
  3
1360
1637
  end
@@ -1407,6 +1684,15 @@ module SyntaxTree
1407
1684
  [:getclassvariable, name, cache]
1408
1685
  end
1409
1686
 
1687
+ def deconstruct_keys(_keys)
1688
+ { name: name, cache: cache }
1689
+ end
1690
+
1691
+ def ==(other)
1692
+ other.is_a?(GetClassVariable) && other.name == name &&
1693
+ other.cache == cache
1694
+ end
1695
+
1410
1696
  def length
1411
1697
  3
1412
1698
  end
@@ -1424,7 +1710,7 @@ module SyntaxTree
1424
1710
  end
1425
1711
 
1426
1712
  def call(vm)
1427
- clazz = vm._self
1713
+ clazz = vm.frame._self
1428
1714
  clazz = clazz.class unless clazz.is_a?(Class)
1429
1715
  vm.push(clazz.class_variable_get(name))
1430
1716
  end
@@ -1457,6 +1743,14 @@ module SyntaxTree
1457
1743
  [:getconstant, name]
1458
1744
  end
1459
1745
 
1746
+ def deconstruct_keys(_keys)
1747
+ { name: name }
1748
+ end
1749
+
1750
+ def ==(other)
1751
+ other.is_a?(GetConstant) && other.name == name
1752
+ end
1753
+
1460
1754
  def length
1461
1755
  2
1462
1756
  end
@@ -1474,14 +1768,20 @@ module SyntaxTree
1474
1768
  end
1475
1769
 
1476
1770
  def call(vm)
1477
- # const_base, allow_nil =
1478
- vm.pop(2)
1771
+ const_base, allow_nil = vm.pop(2)
1479
1772
 
1480
- vm.frame.nesting.reverse_each do |clazz|
1481
- if clazz.const_defined?(name)
1482
- vm.push(clazz.const_get(name))
1773
+ if const_base
1774
+ if const_base.const_defined?(name)
1775
+ vm.push(const_base.const_get(name))
1483
1776
  return
1484
1777
  end
1778
+ elsif const_base.nil? && allow_nil
1779
+ vm.frame.nesting.reverse_each do |clazz|
1780
+ if clazz.const_defined?(name)
1781
+ vm.push(clazz.const_get(name))
1782
+ return
1783
+ end
1784
+ end
1485
1785
  end
1486
1786
 
1487
1787
  raise NameError, "uninitialized constant #{name}"
@@ -1513,6 +1813,14 @@ module SyntaxTree
1513
1813
  [:getglobal, name]
1514
1814
  end
1515
1815
 
1816
+ def deconstruct_keys(_keys)
1817
+ { name: name }
1818
+ end
1819
+
1820
+ def ==(other)
1821
+ other.is_a?(GetGlobal) && other.name == name
1822
+ end
1823
+
1516
1824
  def length
1517
1825
  2
1518
1826
  end
@@ -1572,6 +1880,15 @@ module SyntaxTree
1572
1880
  [:getinstancevariable, name, cache]
1573
1881
  end
1574
1882
 
1883
+ def deconstruct_keys(_keys)
1884
+ { name: name, cache: cache }
1885
+ end
1886
+
1887
+ def ==(other)
1888
+ other.is_a?(GetInstanceVariable) && other.name == name &&
1889
+ other.cache == cache
1890
+ end
1891
+
1575
1892
  def length
1576
1893
  3
1577
1894
  end
@@ -1590,7 +1907,7 @@ module SyntaxTree
1590
1907
 
1591
1908
  def call(vm)
1592
1909
  method = Object.instance_method(:instance_variable_get)
1593
- vm.push(method.bind(vm._self).call(name))
1910
+ vm.push(method.bind(vm.frame._self).call(name))
1594
1911
  end
1595
1912
  end
1596
1913
 
@@ -1626,6 +1943,14 @@ module SyntaxTree
1626
1943
  [:getlocal, current.local_table.offset(index), level]
1627
1944
  end
1628
1945
 
1946
+ def deconstruct_keys(_keys)
1947
+ { index: index, level: level }
1948
+ end
1949
+
1950
+ def ==(other)
1951
+ other.is_a?(GetLocal) && other.index == index && other.level == level
1952
+ end
1953
+
1629
1954
  def length
1630
1955
  3
1631
1956
  end
@@ -1675,6 +2000,14 @@ module SyntaxTree
1675
2000
  [:getlocal_WC_0, iseq.local_table.offset(index)]
1676
2001
  end
1677
2002
 
2003
+ def deconstruct_keys(_keys)
2004
+ { index: index }
2005
+ end
2006
+
2007
+ def ==(other)
2008
+ other.is_a?(GetLocalWC0) && other.index == index
2009
+ end
2010
+
1678
2011
  def length
1679
2012
  2
1680
2013
  end
@@ -1724,6 +2057,14 @@ module SyntaxTree
1724
2057
  [:getlocal_WC_1, iseq.parent_iseq.local_table.offset(index)]
1725
2058
  end
1726
2059
 
2060
+ def deconstruct_keys(_keys)
2061
+ { index: index }
2062
+ end
2063
+
2064
+ def ==(other)
2065
+ other.is_a?(GetLocalWC1) && other.index == index
2066
+ end
2067
+
1727
2068
  def length
1728
2069
  2
1729
2070
  end
@@ -1775,6 +2116,14 @@ module SyntaxTree
1775
2116
  [:getspecial, key, type]
1776
2117
  end
1777
2118
 
2119
+ def deconstruct_keys(_keys)
2120
+ { key: key, type: type }
2121
+ end
2122
+
2123
+ def ==(other)
2124
+ other.is_a?(GetSpecial) && other.key == key && other.type == type
2125
+ end
2126
+
1778
2127
  def length
1779
2128
  3
1780
2129
  end
@@ -1823,6 +2172,14 @@ module SyntaxTree
1823
2172
  [:intern]
1824
2173
  end
1825
2174
 
2175
+ def deconstruct_keys(_keys)
2176
+ {}
2177
+ end
2178
+
2179
+ def ==(other)
2180
+ other.is_a?(Intern)
2181
+ end
2182
+
1826
2183
  def length
1827
2184
  1
1828
2185
  end
@@ -1873,6 +2230,14 @@ module SyntaxTree
1873
2230
  [:invokeblock, calldata.to_h]
1874
2231
  end
1875
2232
 
2233
+ def deconstruct_keys(_keys)
2234
+ { calldata: calldata }
2235
+ end
2236
+
2237
+ def ==(other)
2238
+ other.is_a?(InvokeBlock) && other.calldata == calldata
2239
+ end
2240
+
1876
2241
  def length
1877
2242
  2
1878
2243
  end
@@ -1928,6 +2293,15 @@ module SyntaxTree
1928
2293
  [:invokesuper, calldata.to_h, block_iseq&.to_a]
1929
2294
  end
1930
2295
 
2296
+ def deconstruct_keys(_keys)
2297
+ { calldata: calldata, block_iseq: block_iseq }
2298
+ end
2299
+
2300
+ def ==(other)
2301
+ other.is_a?(InvokeSuper) && other.calldata == calldata &&
2302
+ other.block_iseq == block_iseq
2303
+ end
2304
+
1931
2305
  def length
1932
2306
  1
1933
2307
  end
@@ -1948,8 +2322,9 @@ module SyntaxTree
1948
2322
  def call(vm)
1949
2323
  block =
1950
2324
  if (iseq = block_iseq)
2325
+ frame = vm.frame
1951
2326
  ->(*args, **kwargs, &blk) do
1952
- vm.run_block_frame(iseq, *args, **kwargs, &blk)
2327
+ vm.run_block_frame(iseq, frame, *args, **kwargs, &blk)
1953
2328
  end
1954
2329
  end
1955
2330
 
@@ -1998,6 +2373,14 @@ module SyntaxTree
1998
2373
  [:jump, label.name]
1999
2374
  end
2000
2375
 
2376
+ def deconstruct_keys(_keys)
2377
+ { label: label }
2378
+ end
2379
+
2380
+ def ==(other)
2381
+ other.is_a?(Jump) && other.label == label
2382
+ end
2383
+
2001
2384
  def length
2002
2385
  2
2003
2386
  end
@@ -2038,6 +2421,14 @@ module SyntaxTree
2038
2421
  [:leave]
2039
2422
  end
2040
2423
 
2424
+ def deconstruct_keys(_keys)
2425
+ {}
2426
+ end
2427
+
2428
+ def ==(other)
2429
+ other.is_a?(Leave)
2430
+ end
2431
+
2041
2432
  def length
2042
2433
  1
2043
2434
  end
@@ -2088,6 +2479,14 @@ module SyntaxTree
2088
2479
  [:newarray, number]
2089
2480
  end
2090
2481
 
2482
+ def deconstruct_keys(_keys)
2483
+ { number: number }
2484
+ end
2485
+
2486
+ def ==(other)
2487
+ other.is_a?(NewArray) && other.number == number
2488
+ end
2489
+
2091
2490
  def length
2092
2491
  2
2093
2492
  end
@@ -2136,6 +2535,14 @@ module SyntaxTree
2136
2535
  [:newarraykwsplat, number]
2137
2536
  end
2138
2537
 
2538
+ def deconstruct_keys(_keys)
2539
+ { number: number }
2540
+ end
2541
+
2542
+ def ==(other)
2543
+ other.is_a?(NewArrayKwSplat) && other.number == number
2544
+ end
2545
+
2139
2546
  def length
2140
2547
  2
2141
2548
  end
@@ -2186,6 +2593,14 @@ module SyntaxTree
2186
2593
  [:newhash, number]
2187
2594
  end
2188
2595
 
2596
+ def deconstruct_keys(_keys)
2597
+ { number: number }
2598
+ end
2599
+
2600
+ def ==(other)
2601
+ other.is_a?(NewHash) && other.number == number
2602
+ end
2603
+
2189
2604
  def length
2190
2605
  2
2191
2606
  end
@@ -2237,6 +2652,14 @@ module SyntaxTree
2237
2652
  [:newrange, exclude_end]
2238
2653
  end
2239
2654
 
2655
+ def deconstruct_keys(_keys)
2656
+ { exclude_end: exclude_end }
2657
+ end
2658
+
2659
+ def ==(other)
2660
+ other.is_a?(NewRange) && other.exclude_end == exclude_end
2661
+ end
2662
+
2240
2663
  def length
2241
2664
  2
2242
2665
  end
@@ -2278,6 +2701,14 @@ module SyntaxTree
2278
2701
  [:nop]
2279
2702
  end
2280
2703
 
2704
+ def deconstruct_keys(_keys)
2705
+ {}
2706
+ end
2707
+
2708
+ def ==(other)
2709
+ other.is_a?(Nop)
2710
+ end
2711
+
2281
2712
  def length
2282
2713
  1
2283
2714
  end
@@ -2327,6 +2758,14 @@ module SyntaxTree
2327
2758
  [:objtostring, calldata.to_h]
2328
2759
  end
2329
2760
 
2761
+ def deconstruct_keys(_keys)
2762
+ { calldata: calldata }
2763
+ end
2764
+
2765
+ def ==(other)
2766
+ other.is_a?(ObjToString) && other.calldata == calldata
2767
+ end
2768
+
2330
2769
  def length
2331
2770
  2
2332
2771
  end
@@ -2378,6 +2817,14 @@ module SyntaxTree
2378
2817
  [:once, iseq.to_a, cache]
2379
2818
  end
2380
2819
 
2820
+ def deconstruct_keys(_keys)
2821
+ { iseq: iseq, cache: cache }
2822
+ end
2823
+
2824
+ def ==(other)
2825
+ other.is_a?(Once) && other.iseq == iseq && other.cache == cache
2826
+ end
2827
+
2381
2828
  def length
2382
2829
  3
2383
2830
  end
@@ -2396,7 +2843,7 @@ module SyntaxTree
2396
2843
 
2397
2844
  def call(vm)
2398
2845
  return if @executed
2399
- vm.push(vm.run_block_frame(iseq))
2846
+ vm.push(vm.run_block_frame(iseq, vm.frame))
2400
2847
  @executed = true
2401
2848
  end
2402
2849
  end
@@ -2429,6 +2876,14 @@ module SyntaxTree
2429
2876
  [:opt_and, calldata.to_h]
2430
2877
  end
2431
2878
 
2879
+ def deconstruct_keys(_keys)
2880
+ { calldata: calldata }
2881
+ end
2882
+
2883
+ def ==(other)
2884
+ other.is_a?(OptAnd) && other.calldata == calldata
2885
+ end
2886
+
2432
2887
  def length
2433
2888
  2
2434
2889
  end
@@ -2477,6 +2932,14 @@ module SyntaxTree
2477
2932
  [:opt_aref, calldata.to_h]
2478
2933
  end
2479
2934
 
2935
+ def deconstruct_keys(_keys)
2936
+ { calldata: calldata }
2937
+ end
2938
+
2939
+ def ==(other)
2940
+ other.is_a?(OptAref) && other.calldata == calldata
2941
+ end
2942
+
2480
2943
  def length
2481
2944
  2
2482
2945
  end
@@ -2530,6 +2993,15 @@ module SyntaxTree
2530
2993
  [:opt_aref_with, object, calldata.to_h]
2531
2994
  end
2532
2995
 
2996
+ def deconstruct_keys(_keys)
2997
+ { object: object, calldata: calldata }
2998
+ end
2999
+
3000
+ def ==(other)
3001
+ other.is_a?(OptArefWith) && other.object == object &&
3002
+ other.calldata == calldata
3003
+ end
3004
+
2533
3005
  def length
2534
3006
  3
2535
3007
  end
@@ -2579,6 +3051,14 @@ module SyntaxTree
2579
3051
  [:opt_aset, calldata.to_h]
2580
3052
  end
2581
3053
 
3054
+ def deconstruct_keys(_keys)
3055
+ { calldata: calldata }
3056
+ end
3057
+
3058
+ def ==(other)
3059
+ other.is_a?(OptAset) && other.calldata == calldata
3060
+ end
3061
+
2582
3062
  def length
2583
3063
  2
2584
3064
  end
@@ -2631,6 +3111,15 @@ module SyntaxTree
2631
3111
  [:opt_aset_with, object, calldata.to_h]
2632
3112
  end
2633
3113
 
3114
+ def deconstruct_keys(_keys)
3115
+ { object: object, calldata: calldata }
3116
+ end
3117
+
3118
+ def ==(other)
3119
+ other.is_a?(OptAsetWith) && other.object == object &&
3120
+ other.calldata == calldata
3121
+ end
3122
+
2634
3123
  def length
2635
3124
  3
2636
3125
  end
@@ -2699,6 +3188,16 @@ module SyntaxTree
2699
3188
  ]
2700
3189
  end
2701
3190
 
3191
+ def deconstruct_keys(_keys)
3192
+ { case_dispatch_hash: case_dispatch_hash, else_label: else_label }
3193
+ end
3194
+
3195
+ def ==(other)
3196
+ other.is_a?(OptCaseDispatch) &&
3197
+ other.case_dispatch_hash == case_dispatch_hash &&
3198
+ other.else_label == else_label
3199
+ end
3200
+
2702
3201
  def length
2703
3202
  3
2704
3203
  end
@@ -2748,6 +3247,14 @@ module SyntaxTree
2748
3247
  [:opt_div, calldata.to_h]
2749
3248
  end
2750
3249
 
3250
+ def deconstruct_keys(_keys)
3251
+ { calldata: calldata }
3252
+ end
3253
+
3254
+ def ==(other)
3255
+ other.is_a?(OptDiv) && other.calldata == calldata
3256
+ end
3257
+
2751
3258
  def length
2752
3259
  2
2753
3260
  end
@@ -2796,6 +3303,14 @@ module SyntaxTree
2796
3303
  [:opt_empty_p, calldata.to_h]
2797
3304
  end
2798
3305
 
3306
+ def deconstruct_keys(_keys)
3307
+ { calldata: calldata }
3308
+ end
3309
+
3310
+ def ==(other)
3311
+ other.is_a?(OptEmptyP) && other.calldata == calldata
3312
+ end
3313
+
2799
3314
  def length
2800
3315
  2
2801
3316
  end
@@ -2845,6 +3360,14 @@ module SyntaxTree
2845
3360
  [:opt_eq, calldata.to_h]
2846
3361
  end
2847
3362
 
3363
+ def deconstruct_keys(_keys)
3364
+ { calldata: calldata }
3365
+ end
3366
+
3367
+ def ==(other)
3368
+ other.is_a?(OptEq) && other.calldata == calldata
3369
+ end
3370
+
2848
3371
  def length
2849
3372
  2
2850
3373
  end
@@ -2894,6 +3417,14 @@ module SyntaxTree
2894
3417
  [:opt_ge, calldata.to_h]
2895
3418
  end
2896
3419
 
3420
+ def deconstruct_keys(_keys)
3421
+ { calldata: calldata }
3422
+ end
3423
+
3424
+ def ==(other)
3425
+ other.is_a?(OptGE) && other.calldata == calldata
3426
+ end
3427
+
2897
3428
  def length
2898
3429
  2
2899
3430
  end
@@ -2943,6 +3474,14 @@ module SyntaxTree
2943
3474
  [:opt_getconstant_path, names]
2944
3475
  end
2945
3476
 
3477
+ def deconstruct_keys(_keys)
3478
+ { names: names }
3479
+ end
3480
+
3481
+ def ==(other)
3482
+ other.is_a?(OptGetConstantPath) && other.names == names
3483
+ end
3484
+
2946
3485
  def length
2947
3486
  2
2948
3487
  end
@@ -2960,7 +3499,7 @@ module SyntaxTree
2960
3499
  end
2961
3500
 
2962
3501
  def call(vm)
2963
- current = vm._self
3502
+ current = vm.frame._self
2964
3503
  current = current.class unless current.is_a?(Class)
2965
3504
 
2966
3505
  names.each do |name|
@@ -2999,6 +3538,14 @@ module SyntaxTree
2999
3538
  [:opt_gt, calldata.to_h]
3000
3539
  end
3001
3540
 
3541
+ def deconstruct_keys(_keys)
3542
+ { calldata: calldata }
3543
+ end
3544
+
3545
+ def ==(other)
3546
+ other.is_a?(OptGT) && other.calldata == calldata
3547
+ end
3548
+
3002
3549
  def length
3003
3550
  2
3004
3551
  end
@@ -3048,6 +3595,14 @@ module SyntaxTree
3048
3595
  [:opt_le, calldata.to_h]
3049
3596
  end
3050
3597
 
3598
+ def deconstruct_keys(_keys)
3599
+ { calldata: calldata }
3600
+ end
3601
+
3602
+ def ==(other)
3603
+ other.is_a?(OptLE) && other.calldata == calldata
3604
+ end
3605
+
3051
3606
  def length
3052
3607
  2
3053
3608
  end
@@ -3097,6 +3652,14 @@ module SyntaxTree
3097
3652
  [:opt_length, calldata.to_h]
3098
3653
  end
3099
3654
 
3655
+ def deconstruct_keys(_keys)
3656
+ { calldata: calldata }
3657
+ end
3658
+
3659
+ def ==(other)
3660
+ other.is_a?(OptLength) && other.calldata == calldata
3661
+ end
3662
+
3100
3663
  def length
3101
3664
  2
3102
3665
  end
@@ -3146,6 +3709,14 @@ module SyntaxTree
3146
3709
  [:opt_lt, calldata.to_h]
3147
3710
  end
3148
3711
 
3712
+ def deconstruct_keys(_keys)
3713
+ { calldata: calldata }
3714
+ end
3715
+
3716
+ def ==(other)
3717
+ other.is_a?(OptLT) && other.calldata == calldata
3718
+ end
3719
+
3149
3720
  def length
3150
3721
  2
3151
3722
  end
@@ -3195,6 +3766,14 @@ module SyntaxTree
3195
3766
  [:opt_ltlt, calldata.to_h]
3196
3767
  end
3197
3768
 
3769
+ def deconstruct_keys(_keys)
3770
+ { calldata: calldata }
3771
+ end
3772
+
3773
+ def ==(other)
3774
+ other.is_a?(OptLTLT) && other.calldata == calldata
3775
+ end
3776
+
3198
3777
  def length
3199
3778
  2
3200
3779
  end
@@ -3245,6 +3824,14 @@ module SyntaxTree
3245
3824
  [:opt_minus, calldata.to_h]
3246
3825
  end
3247
3826
 
3827
+ def deconstruct_keys(_keys)
3828
+ { calldata: calldata }
3829
+ end
3830
+
3831
+ def ==(other)
3832
+ other.is_a?(OptMinus) && other.calldata == calldata
3833
+ end
3834
+
3248
3835
  def length
3249
3836
  2
3250
3837
  end
@@ -3294,6 +3881,14 @@ module SyntaxTree
3294
3881
  [:opt_mod, calldata.to_h]
3295
3882
  end
3296
3883
 
3884
+ def deconstruct_keys(_keys)
3885
+ { calldata: calldata }
3886
+ end
3887
+
3888
+ def ==(other)
3889
+ other.is_a?(OptMod) && other.calldata == calldata
3890
+ end
3891
+
3297
3892
  def length
3298
3893
  2
3299
3894
  end
@@ -3343,6 +3938,14 @@ module SyntaxTree
3343
3938
  [:opt_mult, calldata.to_h]
3344
3939
  end
3345
3940
 
3941
+ def deconstruct_keys(_keys)
3942
+ { calldata: calldata }
3943
+ end
3944
+
3945
+ def ==(other)
3946
+ other.is_a?(OptMult) && other.calldata == calldata
3947
+ end
3948
+
3346
3949
  def length
3347
3950
  2
3348
3951
  end
@@ -3398,6 +4001,15 @@ module SyntaxTree
3398
4001
  [:opt_neq, eq_calldata.to_h, neq_calldata.to_h]
3399
4002
  end
3400
4003
 
4004
+ def deconstruct_keys(_keys)
4005
+ { eq_calldata: eq_calldata, neq_calldata: neq_calldata }
4006
+ end
4007
+
4008
+ def ==(other)
4009
+ other.is_a?(OptNEq) && other.eq_calldata == eq_calldata &&
4010
+ other.neq_calldata == neq_calldata
4011
+ end
4012
+
3401
4013
  def length
3402
4014
  3
3403
4015
  end
@@ -3447,6 +4059,14 @@ module SyntaxTree
3447
4059
  [:opt_newarray_max, number]
3448
4060
  end
3449
4061
 
4062
+ def deconstruct_keys(_keys)
4063
+ { number: number }
4064
+ end
4065
+
4066
+ def ==(other)
4067
+ other.is_a?(OptNewArrayMax) && other.number == number
4068
+ end
4069
+
3450
4070
  def length
3451
4071
  2
3452
4072
  end
@@ -3495,6 +4115,14 @@ module SyntaxTree
3495
4115
  [:opt_newarray_min, number]
3496
4116
  end
3497
4117
 
4118
+ def deconstruct_keys(_keys)
4119
+ { number: number }
4120
+ end
4121
+
4122
+ def ==(other)
4123
+ other.is_a?(OptNewArrayMin) && other.number == number
4124
+ end
4125
+
3498
4126
  def length
3499
4127
  2
3500
4128
  end
@@ -3544,6 +4172,14 @@ module SyntaxTree
3544
4172
  [:opt_nil_p, calldata.to_h]
3545
4173
  end
3546
4174
 
4175
+ def deconstruct_keys(_keys)
4176
+ { calldata: calldata }
4177
+ end
4178
+
4179
+ def ==(other)
4180
+ other.is_a?(OptNilP) && other.calldata == calldata
4181
+ end
4182
+
3547
4183
  def length
3548
4184
  2
3549
4185
  end
@@ -3591,6 +4227,14 @@ module SyntaxTree
3591
4227
  [:opt_not, calldata.to_h]
3592
4228
  end
3593
4229
 
4230
+ def deconstruct_keys(_keys)
4231
+ { calldata: calldata }
4232
+ end
4233
+
4234
+ def ==(other)
4235
+ other.is_a?(OptNot) && other.calldata == calldata
4236
+ end
4237
+
3594
4238
  def length
3595
4239
  2
3596
4240
  end
@@ -3640,6 +4284,14 @@ module SyntaxTree
3640
4284
  [:opt_or, calldata.to_h]
3641
4285
  end
3642
4286
 
4287
+ def deconstruct_keys(_keys)
4288
+ { calldata: calldata }
4289
+ end
4290
+
4291
+ def ==(other)
4292
+ other.is_a?(OptOr) && other.calldata == calldata
4293
+ end
4294
+
3643
4295
  def length
3644
4296
  2
3645
4297
  end
@@ -3689,6 +4341,14 @@ module SyntaxTree
3689
4341
  [:opt_plus, calldata.to_h]
3690
4342
  end
3691
4343
 
4344
+ def deconstruct_keys(_keys)
4345
+ { calldata: calldata }
4346
+ end
4347
+
4348
+ def ==(other)
4349
+ other.is_a?(OptPlus) && other.calldata == calldata
4350
+ end
4351
+
3692
4352
  def length
3693
4353
  2
3694
4354
  end
@@ -3737,6 +4397,14 @@ module SyntaxTree
3737
4397
  [:opt_regexpmatch2, calldata.to_h]
3738
4398
  end
3739
4399
 
4400
+ def deconstruct_keys(_keys)
4401
+ { calldata: calldata }
4402
+ end
4403
+
4404
+ def ==(other)
4405
+ other.is_a?(OptRegExpMatch2) && other.calldata == calldata
4406
+ end
4407
+
3740
4408
  def length
3741
4409
  2
3742
4410
  end
@@ -3785,6 +4453,14 @@ module SyntaxTree
3785
4453
  [:opt_send_without_block, calldata.to_h]
3786
4454
  end
3787
4455
 
4456
+ def deconstruct_keys(_keys)
4457
+ { calldata: calldata }
4458
+ end
4459
+
4460
+ def ==(other)
4461
+ other.is_a?(OptSendWithoutBlock) && other.calldata == calldata
4462
+ end
4463
+
3788
4464
  def length
3789
4465
  2
3790
4466
  end
@@ -3834,6 +4510,14 @@ module SyntaxTree
3834
4510
  [:opt_size, calldata.to_h]
3835
4511
  end
3836
4512
 
4513
+ def deconstruct_keys(_keys)
4514
+ { calldata: calldata }
4515
+ end
4516
+
4517
+ def ==(other)
4518
+ other.is_a?(OptSize) && other.calldata == calldata
4519
+ end
4520
+
3837
4521
  def length
3838
4522
  2
3839
4523
  end
@@ -3886,6 +4570,15 @@ module SyntaxTree
3886
4570
  [:opt_str_freeze, object, calldata.to_h]
3887
4571
  end
3888
4572
 
4573
+ def deconstruct_keys(_keys)
4574
+ { object: object, calldata: calldata }
4575
+ end
4576
+
4577
+ def ==(other)
4578
+ other.is_a?(OptStrFreeze) && other.object == object &&
4579
+ other.calldata == calldata
4580
+ end
4581
+
3889
4582
  def length
3890
4583
  3
3891
4584
  end
@@ -3938,6 +4631,15 @@ module SyntaxTree
3938
4631
  [:opt_str_uminus, object, calldata.to_h]
3939
4632
  end
3940
4633
 
4634
+ def deconstruct_keys(_keys)
4635
+ { object: object, calldata: calldata }
4636
+ end
4637
+
4638
+ def ==(other)
4639
+ other.is_a?(OptStrUMinus) && other.object == object &&
4640
+ other.calldata == calldata
4641
+ end
4642
+
3941
4643
  def length
3942
4644
  3
3943
4645
  end
@@ -3987,6 +4689,14 @@ module SyntaxTree
3987
4689
  [:opt_succ, calldata.to_h]
3988
4690
  end
3989
4691
 
4692
+ def deconstruct_keys(_keys)
4693
+ { calldata: calldata }
4694
+ end
4695
+
4696
+ def ==(other)
4697
+ other.is_a?(OptSucc) && other.calldata == calldata
4698
+ end
4699
+
3990
4700
  def length
3991
4701
  2
3992
4702
  end
@@ -4027,6 +4737,14 @@ module SyntaxTree
4027
4737
  [:pop]
4028
4738
  end
4029
4739
 
4740
+ def deconstruct_keys(_keys)
4741
+ {}
4742
+ end
4743
+
4744
+ def ==(other)
4745
+ other.is_a?(Pop)
4746
+ end
4747
+
4030
4748
  def length
4031
4749
  1
4032
4750
  end
@@ -4067,6 +4785,14 @@ module SyntaxTree
4067
4785
  [:putnil]
4068
4786
  end
4069
4787
 
4788
+ def deconstruct_keys(_keys)
4789
+ {}
4790
+ end
4791
+
4792
+ def ==(other)
4793
+ other.is_a?(PutNil)
4794
+ end
4795
+
4070
4796
  def length
4071
4797
  1
4072
4798
  end
@@ -4113,6 +4839,14 @@ module SyntaxTree
4113
4839
  [:putobject, object]
4114
4840
  end
4115
4841
 
4842
+ def deconstruct_keys(_keys)
4843
+ { object: object }
4844
+ end
4845
+
4846
+ def ==(other)
4847
+ other.is_a?(PutObject) && other.object == object
4848
+ end
4849
+
4116
4850
  def length
4117
4851
  2
4118
4852
  end
@@ -4155,6 +4889,14 @@ module SyntaxTree
4155
4889
  [:putobject_INT2FIX_0_]
4156
4890
  end
4157
4891
 
4892
+ def deconstruct_keys(_keys)
4893
+ {}
4894
+ end
4895
+
4896
+ def ==(other)
4897
+ other.is_a?(PutObjectInt2Fix0)
4898
+ end
4899
+
4158
4900
  def length
4159
4901
  1
4160
4902
  end
@@ -4197,6 +4939,14 @@ module SyntaxTree
4197
4939
  [:putobject_INT2FIX_1_]
4198
4940
  end
4199
4941
 
4942
+ def deconstruct_keys(_keys)
4943
+ {}
4944
+ end
4945
+
4946
+ def ==(other)
4947
+ other.is_a?(PutObjectInt2Fix1)
4948
+ end
4949
+
4200
4950
  def length
4201
4951
  1
4202
4952
  end
@@ -4237,6 +4987,14 @@ module SyntaxTree
4237
4987
  [:putself]
4238
4988
  end
4239
4989
 
4990
+ def deconstruct_keys(_keys)
4991
+ {}
4992
+ end
4993
+
4994
+ def ==(other)
4995
+ other.is_a?(PutSelf)
4996
+ end
4997
+
4240
4998
  def length
4241
4999
  1
4242
5000
  end
@@ -4254,7 +5012,7 @@ module SyntaxTree
4254
5012
  end
4255
5013
 
4256
5014
  def call(vm)
4257
- vm.push(vm._self)
5015
+ vm.push(vm.frame._self)
4258
5016
  end
4259
5017
  end
4260
5018
 
@@ -4289,6 +5047,14 @@ module SyntaxTree
4289
5047
  [:putspecialobject, object]
4290
5048
  end
4291
5049
 
5050
+ def deconstruct_keys(_keys)
5051
+ { object: object }
5052
+ end
5053
+
5054
+ def ==(other)
5055
+ other.is_a?(PutSpecialObject) && other.object == object
5056
+ end
5057
+
4292
5058
  def length
4293
5059
  2
4294
5060
  end
@@ -4310,7 +5076,7 @@ module SyntaxTree
4310
5076
  when OBJECT_VMCORE
4311
5077
  vm.push(vm.frozen_core)
4312
5078
  when OBJECT_CBASE
4313
- value = vm._self
5079
+ value = vm.frame._self
4314
5080
  value = value.singleton_class unless value.is_a?(Class)
4315
5081
  vm.push(value)
4316
5082
  when OBJECT_CONST_BASE
@@ -4344,6 +5110,14 @@ module SyntaxTree
4344
5110
  [:putstring, object]
4345
5111
  end
4346
5112
 
5113
+ def deconstruct_keys(_keys)
5114
+ { object: object }
5115
+ end
5116
+
5117
+ def ==(other)
5118
+ other.is_a?(PutString) && other.object == object
5119
+ end
5120
+
4347
5121
  def length
4348
5122
  2
4349
5123
  end
@@ -4398,6 +5172,15 @@ module SyntaxTree
4398
5172
  [:send, calldata.to_h, block_iseq&.to_a]
4399
5173
  end
4400
5174
 
5175
+ def deconstruct_keys(_keys)
5176
+ { calldata: calldata, block_iseq: block_iseq }
5177
+ end
5178
+
5179
+ def ==(other)
5180
+ other.is_a?(Send) && other.calldata == calldata &&
5181
+ other.block_iseq == block_iseq
5182
+ end
5183
+
4401
5184
  def length
4402
5185
  3
4403
5186
  end
@@ -4418,9 +5201,12 @@ module SyntaxTree
4418
5201
  def call(vm)
4419
5202
  block =
4420
5203
  if (iseq = block_iseq)
5204
+ frame = vm.frame
4421
5205
  ->(*args, **kwargs, &blk) do
4422
- vm.run_block_frame(iseq, *args, **kwargs, &blk)
5206
+ vm.run_block_frame(iseq, frame, *args, **kwargs, &blk)
4423
5207
  end
5208
+ elsif calldata.flag?(CallData::CALL_ARGS_BLOCKARG)
5209
+ vm.pop
4424
5210
  end
4425
5211
 
4426
5212
  keywords =
@@ -4472,6 +5258,15 @@ module SyntaxTree
4472
5258
  [:setblockparam, current.local_table.offset(index), level]
4473
5259
  end
4474
5260
 
5261
+ def deconstruct_keys(_keys)
5262
+ { index: index, level: level }
5263
+ end
5264
+
5265
+ def ==(other)
5266
+ other.is_a?(SetBlockParam) && other.index == index &&
5267
+ other.level == level
5268
+ end
5269
+
4475
5270
  def length
4476
5271
  3
4477
5272
  end
@@ -4525,6 +5320,15 @@ module SyntaxTree
4525
5320
  [:setclassvariable, name, cache]
4526
5321
  end
4527
5322
 
5323
+ def deconstruct_keys(_keys)
5324
+ { name: name, cache: cache }
5325
+ end
5326
+
5327
+ def ==(other)
5328
+ other.is_a?(SetClassVariable) && other.name == name &&
5329
+ other.cache == cache
5330
+ end
5331
+
4528
5332
  def length
4529
5333
  3
4530
5334
  end
@@ -4542,7 +5346,7 @@ module SyntaxTree
4542
5346
  end
4543
5347
 
4544
5348
  def call(vm)
4545
- clazz = vm._self
5349
+ clazz = vm.frame._self
4546
5350
  clazz = clazz.class unless clazz.is_a?(Class)
4547
5351
  clazz.class_variable_set(name, vm.pop)
4548
5352
  end
@@ -4574,6 +5378,14 @@ module SyntaxTree
4574
5378
  [:setconstant, name]
4575
5379
  end
4576
5380
 
5381
+ def deconstruct_keys(_keys)
5382
+ { name: name }
5383
+ end
5384
+
5385
+ def ==(other)
5386
+ other.is_a?(SetConstant) && other.name == name
5387
+ end
5388
+
4577
5389
  def length
4578
5390
  2
4579
5391
  end
@@ -4622,6 +5434,14 @@ module SyntaxTree
4622
5434
  [:setglobal, name]
4623
5435
  end
4624
5436
 
5437
+ def deconstruct_keys(_keys)
5438
+ { name: name }
5439
+ end
5440
+
5441
+ def ==(other)
5442
+ other.is_a?(SetGlobal) && other.name == name
5443
+ end
5444
+
4625
5445
  def length
4626
5446
  2
4627
5447
  end
@@ -4680,6 +5500,15 @@ module SyntaxTree
4680
5500
  [:setinstancevariable, name, cache]
4681
5501
  end
4682
5502
 
5503
+ def deconstruct_keys(_keys)
5504
+ { name: name, cache: cache }
5505
+ end
5506
+
5507
+ def ==(other)
5508
+ other.is_a?(SetInstanceVariable) && other.name == name &&
5509
+ other.cache == cache
5510
+ end
5511
+
4683
5512
  def length
4684
5513
  3
4685
5514
  end
@@ -4698,7 +5527,7 @@ module SyntaxTree
4698
5527
 
4699
5528
  def call(vm)
4700
5529
  method = Object.instance_method(:instance_variable_set)
4701
- method.bind(vm._self).call(name, vm.pop)
5530
+ method.bind(vm.frame._self).call(name, vm.pop)
4702
5531
  end
4703
5532
  end
4704
5533
 
@@ -4734,6 +5563,14 @@ module SyntaxTree
4734
5563
  [:setlocal, current.local_table.offset(index), level]
4735
5564
  end
4736
5565
 
5566
+ def deconstruct_keys(_keys)
5567
+ { index: index, level: level }
5568
+ end
5569
+
5570
+ def ==(other)
5571
+ other.is_a?(SetLocal) && other.index == index && other.level == level
5572
+ end
5573
+
4737
5574
  def length
4738
5575
  3
4739
5576
  end
@@ -4783,6 +5620,14 @@ module SyntaxTree
4783
5620
  [:setlocal_WC_0, iseq.local_table.offset(index)]
4784
5621
  end
4785
5622
 
5623
+ def deconstruct_keys(_keys)
5624
+ { index: index }
5625
+ end
5626
+
5627
+ def ==(other)
5628
+ other.is_a?(SetLocalWC0) && other.index == index
5629
+ end
5630
+
4786
5631
  def length
4787
5632
  2
4788
5633
  end
@@ -4832,6 +5677,14 @@ module SyntaxTree
4832
5677
  [:setlocal_WC_1, iseq.parent_iseq.local_table.offset(index)]
4833
5678
  end
4834
5679
 
5680
+ def deconstruct_keys(_keys)
5681
+ { index: index }
5682
+ end
5683
+
5684
+ def ==(other)
5685
+ other.is_a?(SetLocalWC1) && other.index == index
5686
+ end
5687
+
4835
5688
  def length
4836
5689
  2
4837
5690
  end
@@ -4879,6 +5732,14 @@ module SyntaxTree
4879
5732
  [:setn, number]
4880
5733
  end
4881
5734
 
5735
+ def deconstruct_keys(_keys)
5736
+ { number: number }
5737
+ end
5738
+
5739
+ def ==(other)
5740
+ other.is_a?(SetN) && other.number == number
5741
+ end
5742
+
4882
5743
  def length
4883
5744
  2
4884
5745
  end
@@ -4927,6 +5788,14 @@ module SyntaxTree
4927
5788
  [:setspecial, key]
4928
5789
  end
4929
5790
 
5791
+ def deconstruct_keys(_keys)
5792
+ { key: key }
5793
+ end
5794
+
5795
+ def ==(other)
5796
+ other.is_a?(SetSpecial) && other.key == key
5797
+ end
5798
+
4930
5799
  def length
4931
5800
  2
4932
5801
  end
@@ -4946,7 +5815,7 @@ module SyntaxTree
4946
5815
  def call(vm)
4947
5816
  case key
4948
5817
  when GetSpecial::SVAR_LASTLINE
4949
- raise NotImplementedError, "svar SVAR_LASTLINE"
5818
+ raise NotImplementedError, "setspecial SVAR_LASTLINE"
4950
5819
  when GetSpecial::SVAR_BACKREF
4951
5820
  raise NotImplementedError, "setspecial SVAR_BACKREF"
4952
5821
  when GetSpecial::SVAR_FLIPFLOP_START
@@ -4982,6 +5851,14 @@ module SyntaxTree
4982
5851
  [:splatarray, flag]
4983
5852
  end
4984
5853
 
5854
+ def deconstruct_keys(_keys)
5855
+ { flag: flag }
5856
+ end
5857
+
5858
+ def ==(other)
5859
+ other.is_a?(SplatArray) && other.flag == flag
5860
+ end
5861
+
4985
5862
  def length
4986
5863
  2
4987
5864
  end
@@ -4999,7 +5876,27 @@ module SyntaxTree
4999
5876
  end
5000
5877
 
5001
5878
  def call(vm)
5002
- vm.push(*vm.pop)
5879
+ value = vm.pop
5880
+
5881
+ vm.push(
5882
+ if Array === value
5883
+ value.instance_of?(Array) ? value.dup : Array[*value]
5884
+ elsif value.nil?
5885
+ value.to_a
5886
+ else
5887
+ if value.respond_to?(:to_a, true)
5888
+ result = value.to_a
5889
+
5890
+ if result.nil?
5891
+ [value]
5892
+ elsif !result.is_a?(Array)
5893
+ raise TypeError, "expected to_a to return an Array"
5894
+ end
5895
+ else
5896
+ [value]
5897
+ end
5898
+ end
5899
+ )
5003
5900
  end
5004
5901
  end
5005
5902
 
@@ -5026,6 +5923,14 @@ module SyntaxTree
5026
5923
  [:swap]
5027
5924
  end
5028
5925
 
5926
+ def deconstruct_keys(_keys)
5927
+ {}
5928
+ end
5929
+
5930
+ def ==(other)
5931
+ other.is_a?(Swap)
5932
+ end
5933
+
5029
5934
  def length
5030
5935
  1
5031
5936
  end
@@ -5061,15 +5966,18 @@ module SyntaxTree
5061
5966
  # ~~~
5062
5967
  #
5063
5968
  class Throw
5064
- TAG_NONE = 0x0
5065
- TAG_RETURN = 0x1
5066
- TAG_BREAK = 0x2
5067
- TAG_NEXT = 0x3
5068
- TAG_RETRY = 0x4
5069
- TAG_REDO = 0x5
5070
- TAG_RAISE = 0x6
5071
- TAG_THROW = 0x7
5072
- TAG_FATAL = 0x8
5969
+ RUBY_TAG_NONE = 0x0
5970
+ RUBY_TAG_RETURN = 0x1
5971
+ RUBY_TAG_BREAK = 0x2
5972
+ RUBY_TAG_NEXT = 0x3
5973
+ RUBY_TAG_RETRY = 0x4
5974
+ RUBY_TAG_REDO = 0x5
5975
+ RUBY_TAG_RAISE = 0x6
5976
+ RUBY_TAG_THROW = 0x7
5977
+ RUBY_TAG_FATAL = 0x8
5978
+
5979
+ VM_THROW_NO_ESCAPE_FLAG = 0x8000
5980
+ VM_THROW_STATE_MASK = 0xff
5073
5981
 
5074
5982
  attr_reader :type
5075
5983
 
@@ -5085,6 +5993,14 @@ module SyntaxTree
5085
5993
  [:throw, type]
5086
5994
  end
5087
5995
 
5996
+ def deconstruct_keys(_keys)
5997
+ { type: type }
5998
+ end
5999
+
6000
+ def ==(other)
6001
+ other.is_a?(Throw) && other.type == type
6002
+ end
6003
+
5088
6004
  def length
5089
6005
  2
5090
6006
  end
@@ -5102,7 +6018,43 @@ module SyntaxTree
5102
6018
  end
5103
6019
 
5104
6020
  def call(vm)
5105
- raise NotImplementedError, "throw"
6021
+ state = type & VM_THROW_STATE_MASK
6022
+ value = vm.pop
6023
+
6024
+ case state
6025
+ when RUBY_TAG_NONE
6026
+ case value
6027
+ when nil
6028
+ # do nothing
6029
+ when Exception
6030
+ raise value
6031
+ else
6032
+ raise NotImplementedError
6033
+ end
6034
+ when RUBY_TAG_RETURN
6035
+ raise VM::ReturnError.new(value, error_backtrace(vm))
6036
+ when RUBY_TAG_BREAK
6037
+ raise VM::BreakError.new(value, error_backtrace(vm))
6038
+ when RUBY_TAG_NEXT
6039
+ raise VM::NextError.new(value, error_backtrace(vm))
6040
+ else
6041
+ raise NotImplementedError, "Unknown throw kind #{state}"
6042
+ end
6043
+ end
6044
+
6045
+ private
6046
+
6047
+ def error_backtrace(vm)
6048
+ backtrace = []
6049
+ current = vm.frame
6050
+
6051
+ while current
6052
+ backtrace << "#{current.iseq.file}:#{current.line}:in" \
6053
+ "`#{current.iseq.name}'"
6054
+ current = current.parent
6055
+ end
6056
+
6057
+ [*backtrace, *caller]
5106
6058
  end
5107
6059
  end
5108
6060
 
@@ -5135,6 +6087,14 @@ module SyntaxTree
5135
6087
  [:topn, number]
5136
6088
  end
5137
6089
 
6090
+ def deconstruct_keys(_keys)
6091
+ { number: number }
6092
+ end
6093
+
6094
+ def ==(other)
6095
+ other.is_a?(TopN) && other.number == number
6096
+ end
6097
+
5138
6098
  def length
5139
6099
  2
5140
6100
  end
@@ -5183,6 +6143,15 @@ module SyntaxTree
5183
6143
  [:toregexp, options, length]
5184
6144
  end
5185
6145
 
6146
+ def deconstruct_keys(_keys)
6147
+ { options: options, length: length }
6148
+ end
6149
+
6150
+ def ==(other)
6151
+ other.is_a?(ToRegExp) && other.options == options &&
6152
+ other.length == length
6153
+ end
6154
+
5186
6155
  def pops
5187
6156
  length
5188
6157
  end