metasploit-framework/lib/rex/poly/register.rb

100 lines
2.2 KiB
Ruby

module Rex
module Poly
###
#
# This class represents a register that is used in the context of one or more
# logical blocks. The register number is assigned on demand or is statically
# specified if passed in to the constructor.
#
###
class LogicalRegister
require 'rex/poly/register/x86'
#
# This class method is meant to return an array of register numbers that
# can be used to pool from. Architecture specific classes must implement
# this method on their own.
#
def self.regnum_set
nil
end
#
# Initializes the register's name and number, if assigned. If a register
# number is specified, the instance will be assumed to have a statically
# assigned register number. The name is meant to be used as a symbolic
# variable name, such as 'counter' or 'key'.
#
def initialize(name, regnum = nil)
@name = name
@regnum = regnum
@static = (regnum) ? true : false
end
#
# Returns true if the register number should be assumed static.
#
def static?
@static
end
#
# Sets the register number to the value specified. If the register number
# is declared static, a RuntimeError exception is raised.
#
def regnum=(val)
raise RuntimeError, "Attempted to assign regnum to static register" if (static?)
@regnum = val
end
#
# Returns the register number that has currently been assigned. If no
# register number is assigned, an InvalidRegisterError exception is raised.
# This exception can be used to assign the LogicalRegister instance a
# register number on demand.
#
def regnum
raise InvalidRegisterError.new(self), "Register has not been assigned" if (@regnum == nil)
@regnum
end
#
# Returns the variable (friendly) name for the register that was passed to
# the constructor.
#
attr_reader :name
protected
end
###
#
# An exception that is raised when the regnum method is accessed on a
# LogicalRegister that does not currently have a regnum assigned to it.
#
###
class InvalidRegisterError < RuntimeError
#
# Initializes the exception with the instance that lead to the generation
# of the exception such that it can be assigned a register number as
# needed.
#
def initialize(reg)
@reg = reg
end
#
# The LogicalRegister instance that generated the exception.
#
attr_reader :reg
end
end
end