syntax_tree 5.1.0 → 5.3.0

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