class ADSL::Parser::ASTForEach

Public Instance Methods

list_creations() click to toggle source
# File lib/adsl/parser/ast_nodes.rb, line 819
def list_creations
  @block.list_creations
end
optimize() click to toggle source
Calls superclass method ADSL::Parser::ASTNode#optimize
# File lib/adsl/parser/ast_nodes.rb, line 823
def optimize
  optimized = super
  if optimized.block.statements.empty?
    return ASTObjsetStmt.new(:objset => optimized.objset).optimize
  end
  optimized
end
to_adsl() click to toggle source
# File lib/adsl/parser/ast_nodes.rb, line 831
def to_adsl
  "foreach #{ @var_name.text } : #{ @objset.to_adsl } {\n#{ @block.to_adsl.adsl_indent }}\n"
end
typecheck_and_resolve(context) click to toggle source
# File lib/adsl/parser/ast_nodes.rb, line 766
def typecheck_and_resolve(context)
  before_context = context.dup
  objset = @objset.typecheck_and_resolve context
  
  temp_iterator_objset = ASTDummyObjset.new :type => objset.type
  assignment = ASTAssignment.new :lineno => @lineno, :var_name => @var_name, :objset => temp_iterator_objset
  @block.statements = [assignment, @block.statements].flatten
  
  vars_written_to = Set[]
  vars_read = Set[]
  vars_read_before_being_written_to = Set[]
  context.on_var_write do |name|
    vars_written_to << name
  end
  context.on_var_read do |name|
    var_node, var = context.lookup_var name, false
    vars_read_before_being_written_to << name unless
        vars_written_to.include?(name) or vars_read_before_being_written_to.include? name
    vars_read << name unless vars_read.include? name
  end

  context.push_frame
  block = @block.typecheck_and_resolve context
  context.pop_frame

  vars_read_before_being_written_to.each do |var_name|
    vars_read_before_being_written_to.delete var_name unless vars_written_to.include? var_name
  end

  flat = true
  # flat = false unless vars_read_before_being_written_to.empty?

  if flat
    for_each = ADSL::DS::DSFlatForEach.new :objset => objset, :block => block
  else
    for_each = ADSL::DS::DSForEach.new :objset => objset, :block => block
  end

  vars_read_before_being_written_to.each do |var_name|
    before_var_node, before_var = before_context.lookup_var var_name, false
    inside_var_node, inside_var = context.lookup_var var_name, false
    lambda_objset = ADSL::DS::DSForEachPreLambdaObjset.new :for_each => for_each, :before_var => before_var, :inside_var => inside_var
    var = ADSL::DS::DSVariable.new :name => var_name, :type => before_var.type
    assignment = ADSL::DS::DSAssignment.new :var => var, :objset => lambda_objset
    block.replace before_var, var
    block.statements.unshift assignment
  end
  
  iterator_objset = ADSL::DS::DSForEachIteratorObjset.new :for_each => for_each
  block.replace temp_iterator_objset, iterator_objset
  return for_each
end