class Bpl::DefinitionLocalization

Public Instance Methods

add_def(proc, id, stmt) click to toggle source
# File lib/bpl/passes/analysis/definition_localization.rb, line 8
def add_def(proc, id, stmt)
  definitions[proc.name] ||= {}
  definitions[proc.name][id.name] ||= Set.new
  definitions[proc.name][id.name].add(stmt)
end
run!(program) click to toggle source
# File lib/bpl/passes/analysis/definition_localization.rb, line 14
def run! program
  program.declarations.each do |proc|
    next unless proc.is_a?(ProcedureDeclaration) && proc.body

    proc.body.each do |stmt|
      if stmt.is_a?(AssignStatement)
        stmt.lhs.each do |id|
          if id.is_a?(StorageIdentifier)
            add_def(proc, id, stmt)
          end
        end
      elsif stmt.is_a?(HavocStatement)
        stmt.identifiers.each do |id|
          add_def(proc, id, stmt)
        end
      elsif stmt.is_a?(CallStatement)
        mods = modification.modifies[stmt.procedure.declaration]
        (stmt.assignments + mods.to_a).each do |id|
          if id.is_a?(StorageIdentifier)
            add_def(proc, id, stmt)
          end
        end
      end
    end
  end
end