diff --git a/.rubocop.yml b/.rubocop.yml index 069041bd..0212027b 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -8,6 +8,7 @@ AllCops: TargetRubyVersion: 2.7 Exclude: - '{.git,.github,bin,coverage,pkg,spec,test/fixtures,vendor,tmp}/**/*' + - test/ruby-syntax-fixtures/**/* - test.rb Layout/LineLength: diff --git a/lib/syntax_tree/yarv/instructions.rb b/lib/syntax_tree/yarv/instructions.rb index 5e1d116b..bba06f8d 100644 --- a/lib/syntax_tree/yarv/instructions.rb +++ b/lib/syntax_tree/yarv/instructions.rb @@ -91,6 +91,14 @@ def to_a(_iseq) [:adjuststack, number] end + def deconstruct_keys(_keys) + { number: number } + end + + def ==(other) + other.is_a?(AdjustStack) && other.number == number + end + def length 2 end @@ -139,6 +147,14 @@ def to_a(_iseq) [:anytostring] end + def deconstruct_keys(_keys) + {} + end + + def ==(other) + other.is_a?(AnyToString) + end + def length 1 end @@ -197,6 +213,14 @@ def to_a(_iseq) [:branchif, label.name] end + def deconstruct_keys(_keys) + { label: label } + end + + def ==(other) + other.is_a?(BranchIf) && other.label == label + end + def length 2 end @@ -250,6 +274,14 @@ def to_a(_iseq) [:branchnil, label.name] end + def deconstruct_keys(_keys) + { label: label } + end + + def ==(other) + other.is_a?(BranchNil) && other.label == label + end + def length 2 end @@ -302,6 +334,14 @@ def to_a(_iseq) [:branchunless, label.name] end + def deconstruct_keys(_keys) + { label: label } + end + + def ==(other) + other.is_a?(BranchUnless) && other.label == label + end + def length 2 end @@ -365,6 +405,16 @@ def to_a(iseq) ] end + def deconstruct_keys(_keys) + { keyword_bits_index: keyword_bits_index, keyword_index: keyword_index } + end + + def ==(other) + other.is_a?(CheckKeyword) && + other.keyword_bits_index == keyword_bits_index && + other.keyword_index == keyword_index + end + def length 3 end @@ -419,6 +469,14 @@ def to_a(_iseq) [:checkmatch, type] end + def deconstruct_keys(_keys) + { type: type } + end + + def ==(other) + other.is_a?(CheckMatch) && other.type == type + end + def length 2 end @@ -561,6 +619,14 @@ def to_a(_iseq) [:checktype, type] end + def deconstruct_keys(_keys) + { type: type } + end + + def ==(other) + other.is_a?(CheckType) && other.type == type + end + def length 2 end @@ -656,6 +722,14 @@ def to_a(_iseq) [:concatarray] end + def deconstruct_keys(_keys) + {} + end + + def ==(other) + other.is_a?(ConcatArray) + end + def length 1 end @@ -708,6 +782,14 @@ def to_a(_iseq) [:concatstrings, number] end + def deconstruct_keys(_keys) + { number: number } + end + + def ==(other) + other.is_a?(ConcatStrings) && other.number == number + end + def length 2 end @@ -771,6 +853,15 @@ def to_a(_iseq) [:defineclass, name, class_iseq.to_a, flags] end + def deconstruct_keys(_keys) + { name: name, class_iseq: class_iseq, flags: flags } + end + + def ==(other) + other.is_a?(DefineClass) && other.name == name && + other.class_iseq == class_iseq && other.flags == flags + end + def length 4 end @@ -899,6 +990,15 @@ def to_a(_iseq) [:defined, type, name, message] end + def deconstruct_keys(_keys) + { type: type, name: name, message: message } + end + + def ==(other) + other.is_a?(Defined) && other.type == type && other.name == name && + other.message == message + end + def length 4 end @@ -989,6 +1089,15 @@ def to_a(_iseq) [:definemethod, method_name, method_iseq.to_a] end + def deconstruct_keys(_keys) + { method_name: method_name, method_iseq: method_iseq } + end + + def ==(other) + other.is_a?(DefineMethod) && other.method_name == method_name && + other.method_iseq == method_iseq + end + def length 3 end @@ -1061,6 +1170,15 @@ def to_a(_iseq) [:definesmethod, method_name, method_iseq.to_a] end + def deconstruct_keys(_keys) + { method_name: method_name, method_iseq: method_iseq } + end + + def ==(other) + other.is_a?(DefineSMethod) && other.method_name == method_name && + other.method_iseq == method_iseq + end + def length 3 end @@ -1118,6 +1236,14 @@ def to_a(_iseq) [:dup] end + def deconstruct_keys(_keys) + {} + end + + def ==(other) + other.is_a?(Dup) + end + def length 1 end @@ -1164,6 +1290,14 @@ def to_a(_iseq) [:duparray, object] end + def deconstruct_keys(_keys) + { object: object } + end + + def ==(other) + other.is_a?(DupArray) && other.object == object + end + def length 2 end @@ -1210,6 +1344,14 @@ def to_a(_iseq) [:duphash, object] end + def deconstruct_keys(_keys) + { object: object } + end + + def ==(other) + other.is_a?(DupHash) && other.object == object + end + def length 2 end @@ -1256,6 +1398,14 @@ def to_a(_iseq) [:dupn, number] end + def deconstruct_keys(_keys) + { number: number } + end + + def ==(other) + other.is_a?(DupN) && other.number == number + end + def length 2 end @@ -1307,6 +1457,15 @@ def to_a(_iseq) [:expandarray, number, flags] end + def deconstruct_keys(_keys) + { number: number, flags: flags } + end + + def ==(other) + other.is_a?(ExpandArray) && other.number == number && + other.flags == flags + end + def length 3 end @@ -1398,6 +1557,15 @@ def to_a(iseq) [:getblockparam, current.local_table.offset(index), level] end + def deconstruct_keys(_keys) + { index: index, level: level } + end + + def ==(other) + other.is_a?(GetBlockParam) && other.index == index && + other.level == level + end + def length 3 end @@ -1455,6 +1623,15 @@ def to_a(iseq) [:getblockparamproxy, current.local_table.offset(index), level] end + def deconstruct_keys(_keys) + { index: index, level: level } + end + + def ==(other) + other.is_a?(GetBlockParamProxy) && other.index == index && + other.level == level + end + def length 3 end @@ -1507,6 +1684,15 @@ def to_a(_iseq) [:getclassvariable, name, cache] end + def deconstruct_keys(_keys) + { name: name, cache: cache } + end + + def ==(other) + other.is_a?(GetClassVariable) && other.name == name && + other.cache == cache + end + def length 3 end @@ -1557,6 +1743,14 @@ def to_a(_iseq) [:getconstant, name] end + def deconstruct_keys(_keys) + { name: name } + end + + def ==(other) + other.is_a?(GetConstant) && other.name == name + end + def length 2 end @@ -1619,6 +1813,14 @@ def to_a(_iseq) [:getglobal, name] end + def deconstruct_keys(_keys) + { name: name } + end + + def ==(other) + other.is_a?(GetGlobal) && other.name == name + end + def length 2 end @@ -1678,6 +1880,15 @@ def to_a(_iseq) [:getinstancevariable, name, cache] end + def deconstruct_keys(_keys) + { name: name, cache: cache } + end + + def ==(other) + other.is_a?(GetInstanceVariable) && other.name == name && + other.cache == cache + end + def length 3 end @@ -1732,6 +1943,14 @@ def to_a(iseq) [:getlocal, current.local_table.offset(index), level] end + def deconstruct_keys(_keys) + { index: index, level: level } + end + + def ==(other) + other.is_a?(GetLocal) && other.index == index && other.level == level + end + def length 3 end @@ -1781,6 +2000,14 @@ def to_a(iseq) [:getlocal_WC_0, iseq.local_table.offset(index)] end + def deconstruct_keys(_keys) + { index: index } + end + + def ==(other) + other.is_a?(GetLocalWC0) && other.index == index + end + def length 2 end @@ -1830,6 +2057,14 @@ def to_a(iseq) [:getlocal_WC_1, iseq.parent_iseq.local_table.offset(index)] end + def deconstruct_keys(_keys) + { index: index } + end + + def ==(other) + other.is_a?(GetLocalWC1) && other.index == index + end + def length 2 end @@ -1881,6 +2116,14 @@ def to_a(_iseq) [:getspecial, key, type] end + def deconstruct_keys(_keys) + { key: key, type: type } + end + + def ==(other) + other.is_a?(GetSpecial) && other.key == key && other.type == type + end + def length 3 end @@ -1929,6 +2172,14 @@ def to_a(_iseq) [:intern] end + def deconstruct_keys(_keys) + {} + end + + def ==(other) + other.is_a?(Intern) + end + def length 1 end @@ -1979,6 +2230,14 @@ def to_a(_iseq) [:invokeblock, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(InvokeBlock) && other.calldata == calldata + end + def length 2 end @@ -2034,6 +2293,15 @@ def to_a(_iseq) [:invokesuper, calldata.to_h, block_iseq&.to_a] end + def deconstruct_keys(_keys) + { calldata: calldata, block_iseq: block_iseq } + end + + def ==(other) + other.is_a?(InvokeSuper) && other.calldata == calldata && + other.block_iseq == block_iseq + end + def length 1 end @@ -2105,6 +2373,14 @@ def to_a(_iseq) [:jump, label.name] end + def deconstruct_keys(_keys) + { label: label } + end + + def ==(other) + other.is_a?(Jump) && other.label == label + end + def length 2 end @@ -2145,6 +2421,14 @@ def to_a(_iseq) [:leave] end + def deconstruct_keys(_keys) + {} + end + + def ==(other) + other.is_a?(Leave) + end + def length 1 end @@ -2195,6 +2479,14 @@ def to_a(_iseq) [:newarray, number] end + def deconstruct_keys(_keys) + { number: number } + end + + def ==(other) + other.is_a?(NewArray) && other.number == number + end + def length 2 end @@ -2243,6 +2535,14 @@ def to_a(_iseq) [:newarraykwsplat, number] end + def deconstruct_keys(_keys) + { number: number } + end + + def ==(other) + other.is_a?(NewArrayKwSplat) && other.number == number + end + def length 2 end @@ -2293,6 +2593,14 @@ def to_a(_iseq) [:newhash, number] end + def deconstruct_keys(_keys) + { number: number } + end + + def ==(other) + other.is_a?(NewHash) && other.number == number + end + def length 2 end @@ -2344,6 +2652,14 @@ def to_a(_iseq) [:newrange, exclude_end] end + def deconstruct_keys(_keys) + { exclude_end: exclude_end } + end + + def ==(other) + other.is_a?(NewRange) && other.exclude_end == exclude_end + end + def length 2 end @@ -2385,6 +2701,14 @@ def to_a(_iseq) [:nop] end + def deconstruct_keys(_keys) + {} + end + + def ==(other) + other.is_a?(Nop) + end + def length 1 end @@ -2434,6 +2758,14 @@ def to_a(_iseq) [:objtostring, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(ObjToString) && other.calldata == calldata + end + def length 2 end @@ -2485,6 +2817,14 @@ def to_a(_iseq) [:once, iseq.to_a, cache] end + def deconstruct_keys(_keys) + { iseq: iseq, cache: cache } + end + + def ==(other) + other.is_a?(Once) && other.iseq == iseq && other.cache == cache + end + def length 3 end @@ -2536,6 +2876,14 @@ def to_a(_iseq) [:opt_and, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptAnd) && other.calldata == calldata + end + def length 2 end @@ -2584,6 +2932,14 @@ def to_a(_iseq) [:opt_aref, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptAref) && other.calldata == calldata + end + def length 2 end @@ -2637,6 +2993,15 @@ def to_a(_iseq) [:opt_aref_with, object, calldata.to_h] end + def deconstruct_keys(_keys) + { object: object, calldata: calldata } + end + + def ==(other) + other.is_a?(OptArefWith) && other.object == object && + other.calldata == calldata + end + def length 3 end @@ -2686,6 +3051,14 @@ def to_a(_iseq) [:opt_aset, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptAset) && other.calldata == calldata + end + def length 2 end @@ -2738,6 +3111,15 @@ def to_a(_iseq) [:opt_aset_with, object, calldata.to_h] end + def deconstruct_keys(_keys) + { object: object, calldata: calldata } + end + + def ==(other) + other.is_a?(OptAsetWith) && other.object == object && + other.calldata == calldata + end + def length 3 end @@ -2806,6 +3188,16 @@ def to_a(_iseq) ] end + def deconstruct_keys(_keys) + { case_dispatch_hash: case_dispatch_hash, else_label: else_label } + end + + def ==(other) + other.is_a?(OptCaseDispatch) && + other.case_dispatch_hash == case_dispatch_hash && + other.else_label == else_label + end + def length 3 end @@ -2855,6 +3247,14 @@ def to_a(_iseq) [:opt_div, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptDiv) && other.calldata == calldata + end + def length 2 end @@ -2903,6 +3303,14 @@ def to_a(_iseq) [:opt_empty_p, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptEmptyP) && other.calldata == calldata + end + def length 2 end @@ -2952,6 +3360,14 @@ def to_a(_iseq) [:opt_eq, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptEq) && other.calldata == calldata + end + def length 2 end @@ -3001,6 +3417,14 @@ def to_a(_iseq) [:opt_ge, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptGE) && other.calldata == calldata + end + def length 2 end @@ -3050,6 +3474,14 @@ def to_a(_iseq) [:opt_getconstant_path, names] end + def deconstruct_keys(_keys) + { names: names } + end + + def ==(other) + other.is_a?(OptGetConstantPath) && other.names == names + end + def length 2 end @@ -3106,6 +3538,14 @@ def to_a(_iseq) [:opt_gt, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptGT) && other.calldata == calldata + end + def length 2 end @@ -3155,6 +3595,14 @@ def to_a(_iseq) [:opt_le, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptLE) && other.calldata == calldata + end + def length 2 end @@ -3204,6 +3652,14 @@ def to_a(_iseq) [:opt_length, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptLength) && other.calldata == calldata + end + def length 2 end @@ -3253,6 +3709,14 @@ def to_a(_iseq) [:opt_lt, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptLT) && other.calldata == calldata + end + def length 2 end @@ -3302,6 +3766,14 @@ def to_a(_iseq) [:opt_ltlt, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptLTLT) && other.calldata == calldata + end + def length 2 end @@ -3352,6 +3824,14 @@ def to_a(_iseq) [:opt_minus, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptMinus) && other.calldata == calldata + end + def length 2 end @@ -3401,6 +3881,14 @@ def to_a(_iseq) [:opt_mod, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptMod) && other.calldata == calldata + end + def length 2 end @@ -3450,6 +3938,14 @@ def to_a(_iseq) [:opt_mult, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptMult) && other.calldata == calldata + end + def length 2 end @@ -3505,6 +4001,15 @@ def to_a(_iseq) [:opt_neq, eq_calldata.to_h, neq_calldata.to_h] end + def deconstruct_keys(_keys) + { eq_calldata: eq_calldata, neq_calldata: neq_calldata } + end + + def ==(other) + other.is_a?(OptNEq) && other.eq_calldata == eq_calldata && + other.neq_calldata == neq_calldata + end + def length 3 end @@ -3554,6 +4059,14 @@ def to_a(_iseq) [:opt_newarray_max, number] end + def deconstruct_keys(_keys) + { number: number } + end + + def ==(other) + other.is_a?(OptNewArrayMax) && other.number == number + end + def length 2 end @@ -3602,6 +4115,14 @@ def to_a(_iseq) [:opt_newarray_min, number] end + def deconstruct_keys(_keys) + { number: number } + end + + def ==(other) + other.is_a?(OptNewArrayMin) && other.number == number + end + def length 2 end @@ -3651,6 +4172,14 @@ def to_a(_iseq) [:opt_nil_p, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptNilP) && other.calldata == calldata + end + def length 2 end @@ -3698,6 +4227,14 @@ def to_a(_iseq) [:opt_not, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptNot) && other.calldata == calldata + end + def length 2 end @@ -3747,6 +4284,14 @@ def to_a(_iseq) [:opt_or, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptOr) && other.calldata == calldata + end + def length 2 end @@ -3796,6 +4341,14 @@ def to_a(_iseq) [:opt_plus, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptPlus) && other.calldata == calldata + end + def length 2 end @@ -3844,6 +4397,14 @@ def to_a(_iseq) [:opt_regexpmatch2, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptRegExpMatch2) && other.calldata == calldata + end + def length 2 end @@ -3892,6 +4453,14 @@ def to_a(_iseq) [:opt_send_without_block, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptSendWithoutBlock) && other.calldata == calldata + end + def length 2 end @@ -3941,6 +4510,14 @@ def to_a(_iseq) [:opt_size, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptSize) && other.calldata == calldata + end + def length 2 end @@ -3993,6 +4570,15 @@ def to_a(_iseq) [:opt_str_freeze, object, calldata.to_h] end + def deconstruct_keys(_keys) + { object: object, calldata: calldata } + end + + def ==(other) + other.is_a?(OptStrFreeze) && other.object == object && + other.calldata == calldata + end + def length 3 end @@ -4045,6 +4631,15 @@ def to_a(_iseq) [:opt_str_uminus, object, calldata.to_h] end + def deconstruct_keys(_keys) + { object: object, calldata: calldata } + end + + def ==(other) + other.is_a?(OptStrUMinus) && other.object == object && + other.calldata == calldata + end + def length 3 end @@ -4094,6 +4689,14 @@ def to_a(_iseq) [:opt_succ, calldata.to_h] end + def deconstruct_keys(_keys) + { calldata: calldata } + end + + def ==(other) + other.is_a?(OptSucc) && other.calldata == calldata + end + def length 2 end @@ -4134,6 +4737,14 @@ def to_a(_iseq) [:pop] end + def deconstruct_keys(_keys) + {} + end + + def ==(other) + other.is_a?(Pop) + end + def length 1 end @@ -4174,6 +4785,14 @@ def to_a(_iseq) [:putnil] end + def deconstruct_keys(_keys) + {} + end + + def ==(other) + other.is_a?(PutNil) + end + def length 1 end @@ -4220,6 +4839,14 @@ def to_a(_iseq) [:putobject, object] end + def deconstruct_keys(_keys) + { object: object } + end + + def ==(other) + other.is_a?(PutObject) && other.object == object + end + def length 2 end @@ -4262,6 +4889,14 @@ def to_a(_iseq) [:putobject_INT2FIX_0_] end + def deconstruct_keys(_keys) + {} + end + + def ==(other) + other.is_a?(PutObjectInt2Fix0) + end + def length 1 end @@ -4304,6 +4939,14 @@ def to_a(_iseq) [:putobject_INT2FIX_1_] end + def deconstruct_keys(_keys) + {} + end + + def ==(other) + other.is_a?(PutObjectInt2Fix1) + end + def length 1 end @@ -4344,6 +4987,14 @@ def to_a(_iseq) [:putself] end + def deconstruct_keys(_keys) + {} + end + + def ==(other) + other.is_a?(PutSelf) + end + def length 1 end @@ -4396,6 +5047,14 @@ def to_a(_iseq) [:putspecialobject, object] end + def deconstruct_keys(_keys) + { object: object } + end + + def ==(other) + other.is_a?(PutSpecialObject) && other.object == object + end + def length 2 end @@ -4451,6 +5110,14 @@ def to_a(_iseq) [:putstring, object] end + def deconstruct_keys(_keys) + { object: object } + end + + def ==(other) + other.is_a?(PutString) && other.object == object + end + def length 2 end @@ -4505,6 +5172,15 @@ def to_a(_iseq) [:send, calldata.to_h, block_iseq&.to_a] end + def deconstruct_keys(_keys) + { calldata: calldata, block_iseq: block_iseq } + end + + def ==(other) + other.is_a?(Send) && other.calldata == calldata && + other.block_iseq == block_iseq + end + def length 3 end @@ -4582,6 +5258,15 @@ def to_a(iseq) [:setblockparam, current.local_table.offset(index), level] end + def deconstruct_keys(_keys) + { index: index, level: level } + end + + def ==(other) + other.is_a?(SetBlockParam) && other.index == index && + other.level == level + end + def length 3 end @@ -4635,6 +5320,15 @@ def to_a(_iseq) [:setclassvariable, name, cache] end + def deconstruct_keys(_keys) + { name: name, cache: cache } + end + + def ==(other) + other.is_a?(SetClassVariable) && other.name == name && + other.cache == cache + end + def length 3 end @@ -4684,6 +5378,14 @@ def to_a(_iseq) [:setconstant, name] end + def deconstruct_keys(_keys) + { name: name } + end + + def ==(other) + other.is_a?(SetConstant) && other.name == name + end + def length 2 end @@ -4732,6 +5434,14 @@ def to_a(_iseq) [:setglobal, name] end + def deconstruct_keys(_keys) + { name: name } + end + + def ==(other) + other.is_a?(SetGlobal) && other.name == name + end + def length 2 end @@ -4790,6 +5500,15 @@ def to_a(_iseq) [:setinstancevariable, name, cache] end + def deconstruct_keys(_keys) + { name: name, cache: cache } + end + + def ==(other) + other.is_a?(SetInstanceVariable) && other.name == name && + other.cache == cache + end + def length 3 end @@ -4844,6 +5563,14 @@ def to_a(iseq) [:setlocal, current.local_table.offset(index), level] end + def deconstruct_keys(_keys) + { index: index, level: level } + end + + def ==(other) + other.is_a?(SetLocal) && other.index == index && other.level == level + end + def length 3 end @@ -4893,6 +5620,14 @@ def to_a(iseq) [:setlocal_WC_0, iseq.local_table.offset(index)] end + def deconstruct_keys(_keys) + { index: index } + end + + def ==(other) + other.is_a?(SetLocalWC0) && other.index == index + end + def length 2 end @@ -4942,6 +5677,14 @@ def to_a(iseq) [:setlocal_WC_1, iseq.parent_iseq.local_table.offset(index)] end + def deconstruct_keys(_keys) + { index: index } + end + + def ==(other) + other.is_a?(SetLocalWC1) && other.index == index + end + def length 2 end @@ -4989,6 +5732,14 @@ def to_a(_iseq) [:setn, number] end + def deconstruct_keys(_keys) + { number: number } + end + + def ==(other) + other.is_a?(SetN) && other.number == number + end + def length 2 end @@ -5037,6 +5788,14 @@ def to_a(_iseq) [:setspecial, key] end + def deconstruct_keys(_keys) + { key: key } + end + + def ==(other) + other.is_a?(SetSpecial) && other.key == key + end + def length 2 end @@ -5092,6 +5851,14 @@ def to_a(_iseq) [:splatarray, flag] end + def deconstruct_keys(_keys) + { flag: flag } + end + + def ==(other) + other.is_a?(SplatArray) && other.flag == flag + end + def length 2 end @@ -5156,6 +5923,14 @@ def to_a(_iseq) [:swap] end + def deconstruct_keys(_keys) + {} + end + + def ==(other) + other.is_a?(Swap) + end + def length 1 end @@ -5218,6 +5993,14 @@ def to_a(_iseq) [:throw, type] end + def deconstruct_keys(_keys) + { type: type } + end + + def ==(other) + other.is_a?(Throw) && other.type == type + end + def length 2 end @@ -5304,6 +6087,14 @@ def to_a(_iseq) [:topn, number] end + def deconstruct_keys(_keys) + { number: number } + end + + def ==(other) + other.is_a?(TopN) && other.number == number + end + def length 2 end @@ -5352,6 +6143,15 @@ def to_a(_iseq) [:toregexp, options, length] end + def deconstruct_keys(_keys) + { options: options, length: length } + end + + def ==(other) + other.is_a?(ToRegExp) && other.options == options && + other.length == length + end + def pops length end diff --git a/lib/syntax_tree/yarv/legacy.rb b/lib/syntax_tree/yarv/legacy.rb index b2e33290..ab9b00df 100644 --- a/lib/syntax_tree/yarv/legacy.rb +++ b/lib/syntax_tree/yarv/legacy.rb @@ -34,6 +34,14 @@ def to_a(_iseq) [:getclassvariable, name] end + def deconstruct_keys(_keys) + { name: name } + end + + def ==(other) + other.is_a?(GetClassVariable) && other.name == name + end + def length 2 end @@ -90,6 +98,15 @@ def to_a(_iseq) [:opt_getinlinecache, label.name, cache] end + def deconstruct_keys(_keys) + { label: label, cache: cache } + end + + def ==(other) + other.is_a?(OptGetInlineCache) && other.label == label && + other.cache == cache + end + def length 3 end @@ -141,6 +158,14 @@ def to_a(_iseq) [:opt_setinlinecache, cache] end + def deconstruct_keys(_keys) + { cache: cache } + end + + def ==(other) + other.is_a?(OptSetInlineCache) && other.cache == cache + end + def length 2 end @@ -190,6 +215,14 @@ def to_a(_iseq) [:setclassvariable, name] end + def deconstruct_keys(_keys) + { name: name } + end + + def ==(other) + other.is_a?(SetClassVariable) && other.name == name + end + def length 2 end diff --git a/test/yarv_test.rb b/test/yarv_test.rb index 6f60d74e..be7c4c2d 100644 --- a/test/yarv_test.rb +++ b/test/yarv_test.rb @@ -288,6 +288,41 @@ def value end end + instructions = + YARV.constants.map { YARV.const_get(_1) } + + YARV::Legacy.constants.map { YARV::Legacy.const_get(_1) } - + [ + YARV::Assembler, + YARV::Bf, + YARV::CallData, + YARV::Compiler, + YARV::Decompiler, + YARV::Disassembler, + YARV::InstructionSequence, + YARV::Legacy, + YARV::LocalTable, + YARV::VM + ] + + interface = %i[ + disasm + to_a + deconstruct_keys + length + pops + pushes + canonical + call + == + ] + + instructions.each do |instruction| + define_method("test_instruction_interface_#{instruction.name}") do + instance_methods = instruction.instance_methods(false) + assert_empty(interface - instance_methods) + end + end + private def assert_decompiles(expected, source)