class Bpl::AST::ProcedureDeclaration

Public Instance Methods

abstract() { |{ description: "removing procedure body", weight: count * 10e2, action: proc do replace_children(:body,nil) end }| ... } click to toggle source
# File lib/bpl/passes/transformation/abstraction.rb, line 71
def abstract
  unless has_attribute?(:entrypoint) ||
         assertion_localization.has_assert[self] ||
         body.nil?
    yield({
      description: "removing procedure body",
      weight: body.count * 10e2,
      action: Proc.new do
        replace_children(:body,nil)
      end
    })
  end

  parameters.each_with_index do |x,i|
    yield({
      description: "removing paramter to #{name}",
      elems: [x],
      weight: 10e2,
      action: Proc.new do
        bindings.each do |b|
          stmt = b.parent
          fail "expected call" unless stmt.is_a?(CallStatement)
          stmt.arguments[i].remove
        end
        v = fresh_var(x.type)
        x.bindings.each do |b|
          b.replace_with(v)
        end
        x.remove
      end
    })
  end

  returns.each_with_index do |x,i|
    yield({
      description: "removing return from #{name}",
      elems: [x],
      weight: 10e2,
      action: Proc.new do
        bindings.each do |b|
          stmt = b.parent
          fail "expected call" unless stmt.is_a?(CallStatement)
          stmt.assignments[i].remove
        end
        v = fresh_var(x.type)
        x.bindings.each do |b|
          b.replace_with(v)
        end
        x.remove
      end
    })
  end

end
declarations() click to toggle source
# File lib/bpl/ast/declaration.rb, line 94
def declarations; parameters + returns end
fresh_label(prefix="$label") click to toggle source
# File lib/bpl/ast/declaration.rb, line 106
def fresh_label(prefix="$label") @body && @body.fresh_label(prefix) end
fresh_var(prefix="",type) click to toggle source
# File lib/bpl/ast/declaration.rb, line 102
def fresh_var(prefix="",type)
  taken = @parameters.map{|x| x.names}.flatten + @returns.map{|x| x.names}.flatten
  @body && @body.fresh_var(prefix,type,taken)
end
modifies() click to toggle source
# File lib/bpl/ast/declaration.rb, line 99
def modifies
  specifications.map{|s| s.is_a?(ModifiesClause) ? s.identifiers : []}.flatten
end
show() { |s| ... } click to toggle source
# File lib/bpl/ast/declaration.rb, line 116
def show(&block)
  specs = @specifications.map{|s| yield s} * "\n"
  specs = "\n" + specs unless specs.empty?
  if @body
    "#{yield :procedure} #{sig(&block)}#{specs}\n#{yield @body}"
  else
    "#{yield :procedure} #{sig(&block)};#{specs}"
  end
end
sig() { |a| ... } click to toggle source
# File lib/bpl/ast/declaration.rb, line 107
def sig(&blk)
  params = @parameters.map{|a| yield a} * ", "
  rets = @returns.empty? ? "" : "#{yield :returns} (#{@returns.map{|a| yield a} * ", "})"
  "#{show_attrs(&blk)} #{yield @name}(#{params}) #{rets}".fmt
end
signature() click to toggle source
# File lib/bpl/ast/declaration.rb, line 112
def signature
  "#{@name}(#{@parameters.map(&:type) * ","})" +
  (@returns.empty? ? "" : ":#{@returns.map(&:type) * ","}")
end