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
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