blob: a2dbf8960b23e7e8ad772a2cd3122c7adbc17057 [file] [log] [blame]
module XoredDebugger
class Breakpoint
include BreakpointContract
attr_reader :breakpoint_id
attr_reader :temporary
attr_accessor :state
attr_accessor :expression
attr_accessor :hit_value
attr_accessor :hit_condition
attr_reader :hit_count
def initialize(id, temporary)
@breakpoint_id = id
@temporary = temporary
@state = true
@expression = nil
@hit_value = 0
@hit_condition = '>='
@hit_count = 0
end
def hit(context)
if (@hit_count.nil?)
@hit_count = 0
end
@hit_count = @hit_count + 1
# State
if not state
return false
end
# Expression
unless expression.nil?
begin
if not context.eval(expression.to_s)
return false # Expression evaluated to false
end
rescue Exception
return false # Expression can not be evaluated
end
end
# Hit condition
case hit_condition
when BreakpointContract::COND_GREATER_OR_EQUALS
return @hit_count >= hit_value
when BreakpointContract::COND_EQUALS
return @hit_count == hit_value
when BreakpointContract::COND_MULTIPLE
return (@hit_count % hit_value) == 0
else
return false
end
end
end
class ExceptionBreakpoint < Breakpoint
include ExceptionBreakpointContract
attr_reader :exception
def initialize(id, exception, temporary)
super(id, temporary)
@exception = exception
@exceptionClass = nil
@permanentError = false
end
def hit(context, expt)
if @permanentError
return false
end
if @exceptionClass.nil?
begin
@exceptionClass = Kernel.eval(@exception)
if !@exceptionClass.ancestors.include?(Exception)
@permanentError = true
return false
end
rescue Exception
return false
end
end
return (expt.is_a?(@exceptionClass) and super(context))
end
end
end