class Metasm::Indirection

symbolic pointer dereference API similar to Expression

Attributes

len[R]

length in bytes of data referenced

origin[RW]

address of the instruction who generated the indirection

pointer[RW]

Expression (the pointer)

pointer=[RW]

Expression (the pointer)

target[RW]

Expression (the pointer)

Public Class Methods

[](t, l, o=nil) click to toggle source
# File metasm/decode.rb, line 60
def self.[](t, l, o=nil)
        new(Expression[*t], l, o)
end
new(target, len, origin) click to toggle source
# File metasm/decode.rb, line 24
def initialize(target, len, origin)
        @target, @origin = target, origin
        self.len = len
end

Public Instance Methods

==(o)
Alias for: eql?
bind(h) click to toggle source
# File metasm/decode.rb, line 39
def bind(h)
        h[self] || Indirection.new(@target.bind(h), @len, @origin)
end
complexity() click to toggle source

returns the complexity of the expression (number of externals +1 per indirection)

# File metasm/decode.rb, line 56
def complexity
        1+@target.complexity
end
eql?(o) click to toggle source
# File metasm/decode.rb, line 44
def eql?(o) o.class == self.class and [o.target, o.len] == [@target, @len] end
Also aliased as: ==
externals() click to toggle source
# File metasm/decode.rb, line 68
def externals
        @target.externals
end
hash() click to toggle source
# File metasm/decode.rb, line 43
def hash ; @target.hash^@len.to_i end
inspect() click to toggle source
# File metasm/decode.rb, line 64
def inspect
        "Indirection[#{@target.inspect.sub(/^Expression/, '')}, #{@len.inspect}#{', '+@origin.inspect if @origin}]"
end
len=(len) click to toggle source
# File metasm/decode.rb, line 29
def len=(len)
        @len = len
        @max_bits_mask ||= (1 << (len*8)) - 1 if len.kind_of?(::Integer)
end
match_rec(pattern, vars) click to toggle source
# File metasm/decode.rb, line 72
def match_rec(pattern, vars)
        return false if not pattern.kind_of? Indirection
        pt = pattern.target
        if vars[pt]
                return false if @target != vars[pt]
        elsif vars.has_key? pt
                vars[pt] = @target
        elsif pt.kind_of? ExpressionType
                return false if not @target.match_rec(pt, vars)
        else
                return false if pt != @target
        end
        pl = pattern.len
        if vars[pl]
                return false if @len != vars[pl]
        elsif vars.has_key? pl
                vars[pl] = @len
        else
                return false if pl != @len
        end
        vars
end
reduce_rec(cb=nil) click to toggle source
# File metasm/decode.rb, line 34
def reduce_rec(cb=nil)
        ptr = Expression[@target.reduce(&cb)]
        (ptr == Expression::Unknown) ? ptr : Indirection.new(ptr, @len, @origin)
end
render() click to toggle source
# File metasm/decode.rb, line 48
def render
        ret = []
        qual = {1 => 'byte', 2 => 'word', 4 => 'dword', 8 => 'qword'}[len] || "_#{len*8}bits" if len
        ret << "#{qual} ptr " if qual
        ret << '[' << @target << ']'
end