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