{ :no_arg => 1, :var => 2, :implicit_var => 1, :ldc => 2, :ldc_w => 3, :label => 3, :method => 3, :field => 3, :int => 2, :iinc => 3, :type => 3, :lookup_switch => -1 }.each do |type, size| class_eval %Q{ def #{type}_instructions(*opcode, &block) instructions(#{size}, *opcode, &block) end } end
{ :Method => [:owner, :name, :desc], :Field => [:owner, :name, :desc], :Var => [:var], :Type => [:type], :Int => [:operand], :Iinc => [:var, :incr], :Jump => [:label], :Ldc => [:constant], :LookupSwitch => [:default_label, :case_table] }.each do |type, args| module_eval <<-INSTRUCTION class #{type}Insn < Instruction attr_accessor #{args.collect{|item| ":#{item}"}.join(',')} def initialize(opcode, #{args.collect{|item| "#{item}"}.join(',')}) super(opcode) #{args.collect{|item| "@#{item} = #{item}"}.join("\n")} end def ==(insn) super(insn) && #{args.collect{|item| "@#{item} == insn.#{item}"}.join('&&')} end end INSTRUCTION