}
-void BlockResolver::visit(Block &block)
+void BlockResolver::enter(Block &block)
{
block.parent = current_block;
- TraversingVisitor::visit(block);
}
void BlockResolver::visit(InterfaceBlock &iface)
return block.parent ? block.parent : &block!=builtins ? builtins : 0;
}
-void VariableResolver::visit(Block &block)
+void VariableResolver::enter(Block &block)
{
- if(current_block!=&block)
- block.variables.clear();
-
- TraversingVisitor::visit(block);
+ block.variables.clear();
}
void VariableResolver::visit(VariableReference &var)
TraversingVisitor::visit(iface);
}
-void VariableResolver::visit(FunctionDeclaration &func)
-{
- SetForScope<Block *> set_block(current_block, &func.body);
- func.body.variables.clear();
- TraversingVisitor::visit(func);
-}
-
-void VariableResolver::visit(Iteration &iter)
-{
- SetForScope<Block *> set_block(current_block, &iter.body);
- iter.body.variables.clear();
- TraversingVisitor::visit(iter);
-}
-
void FunctionResolver::visit(FunctionCall &call)
{
{
if(var.declaration || !stage->previous)
return;
+ /* Don't pull a variable from previous stage if we just generated an out
+ interface in this stage */
+ if(stage->out_variables.count(var.name))
+ return;
const map<string, VariableDeclaration *> &prev_out = stage->previous->out_variables;
map<string, VariableDeclaration *>::const_iterator i = prev_out.find(var.name);
TraversingVisitor::visit(var);
}
+void InterfaceGenerator::visit(FunctionDeclaration &func)
+{
+ // Skip parameters because they're not useful here
+ func.body.visit(*this);
+}
+
void InterfaceGenerator::visit(Passthrough &pass)
{
vector<VariableDeclaration *> pass_vars;