InlineContentInjector::InlineContentInjector():
source_func(0),
- remap_names(false),
- deps_only(false)
+ remap_names(0)
{ }
const string &InlineContentInjector::apply(Stage &stage, FunctionDeclaration &target_func, Block &tgt_blk, const NodeList<Statement>::iterator &ins_pt, FunctionDeclaration &src)
inlined.push_back(r_inlined_statement);
}
- // Insert the variables here to enable further inlinings to avoid conflicts.
- tgt_blk.variables.insert(variable_map.begin(), variable_map.end());
-
SetForScope<unsigned> set_remap(remap_names, 1);
SetForScope<string> set_prefix(remap_prefix, target_func.name);
variable_map.clear();
}
else if(var.declaration)
{
- SetFlag set_deps(deps_only);
if(!variable_map.count(var.name))
{
dependencies.insert(var.declaration);
{
if(!remap_names && iface.declaration)
{
- SetFlag set_deps(deps_only);
dependencies.insert(iface.declaration);
referenced_names.insert(iface.name);
iface.declaration->visit(*this);
}
else if(var.type_declaration)
{
- SetFlag set_deps(deps_only);
dependencies.insert(var.type_declaration);
referenced_names.insert(var.type_declaration->name);
var.type_declaration->visit(*this);
FunctionInliner::FunctionInliner():
current_function(0),
- r_any_inlined(false)
+ r_any_inlined(false),
+ r_inlined_here(false)
{ }
bool FunctionInliner::apply(Stage &s)
{
SetForScope<Block *> set_block(current_block, &block);
SetForScope<NodeList<Statement>::iterator> save_insert_point(insert_point, block.body.begin());
- for(NodeList<Statement>::iterator i=block.body.begin(); i!=block.body.end(); ++i)
+ for(NodeList<Statement>::iterator i=block.body.begin(); (!r_inlined_here && i!=block.body.end()); ++i)
{
insert_point = i;
(*i)->visit(*this);
void FunctionInliner::visit(FunctionCall &call)
{
+ if(r_inlined_here)
+ return;
+
for(NodeArray<Expression>::iterator i=call.arguments.begin(); i!=call.arguments.end(); ++i)
visit(*i);
/* Inlined variables need to be resolved before this function can be
inlined further. */
inlineable.erase(current_function);
+ r_inlined_here = true;
}
}
{
SetForScope<FunctionDeclaration *> set_func(current_function, &func);
TraversingVisitor::visit(func);
+ r_inlined_here = false;
}
void FunctionInliner::visit(Iteration &iter)