class Metasm::Ia32::Argument

some ruby magic to declare classes with index -> name association (registers)

Attributes

i_to_s[RW]

for subclasses

s_to_i[RW]

for subclasses

Public Class Methods

new(v) click to toggle source
# 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

Private Class Methods

double_map(h) click to toggle source

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
from_str(s) click to toggle source
# File metasm/cpu/ia32/main.rb, line 41
def self.from_str(s) new(@s_to_i[s]) end
simple_map(a) click to toggle source

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

Private Instance Methods

==(o) click to toggle source
# File metasm/cpu/ia32/main.rb, line 37
def ==(o)
        self.class == o.class and val == o.val
end