some ruby magic to declare classes with index -> name association (registers)
for subclasses
for subclasses
# File metasm/cpu/ia32/main.rb, line 32 def initialize(v) raise Exception, "invalid #{self.class} #{v}" unless self.class.i_to_s[v] @val = v end
size -> (index -> name), name -> [index, size]
# File metasm/cpu/ia32/main.rb, line 46 def self.double_map(h) # { 32 => { 1 => 'ecx' } } @i_to_s = h # { 'ecx' => [1, 32] } @s_to_i = {} ; @i_to_s.each { |sz, hh| hh.each_with_index { |r, i| @s_to_i[r] = [i, sz] } } class_eval { attr_accessor :val, :sz def initialize(v, sz) raise Exception, "invalid #{self.class} #{sz}/#{v}" unless self.class.i_to_s[sz] and self.class.i_to_s[sz][v] @val = v @sz = sz end def ==(o) self.class == o.class and val == o.val and sz == o.sz end def self.from_str(s) raise "Bad #{name} #{s.inspect}" if not x = @s_to_i[s] new(*x) end } end
# File metasm/cpu/ia32/main.rb, line 41 def self.from_str(s) new(@s_to_i[s]) end
index -> name, name -> index
# File metasm/cpu/ia32/main.rb, line 24 def self.simple_map(a) # { 1 => 'dr1' } @i_to_s = Hash[*a.flatten] # { 'dr1' => 1 } @s_to_i = @i_to_s.invert class_eval { attr_accessor :val def initialize(v) raise Exception, "invalid #{self.class} #{v}" unless self.class.i_to_s[v] @val = v end def ==(o) self.class == o.class and val == o.val end def self.from_str(s) new(@s_to_i[s]) end } end
# File metasm/cpu/ia32/main.rb, line 37 def ==(o) self.class == o.class and val == o.val end