+ TraversingVisitor::visit(iter);
+ inlineable.erase(current_function);
+}
+
+void InlineableFunctionLocator::visit(Return &ret)
+{
+ TraversingVisitor::visit(ret);
+ if(return_count)
+ inlineable.erase(current_function);
+ ++return_count;
+}
+
+
+InlineContentInjector::InlineContentInjector():
+ source_func(0),
+ remap_names(false),
+ deps_only(false)
+{ }
+
+const string &InlineContentInjector::apply(Stage &stage, FunctionDeclaration &target_func, Block &tgt_blk, const NodeList<Statement>::iterator &ins_pt, FunctionDeclaration &src)
+{
+ target_block = &tgt_blk;
+ source_func = &src;
+ for(NodeList<Statement>::iterator i=src.body.body.begin(); i!=src.body.body.end(); ++i)
+ {
+ r_inlined_statement = 0;
+ (*i)->visit(*this);
+ if(!r_inlined_statement)
+ r_inlined_statement = (*i)->clone();
+
+ SetFlag set_remap(remap_names);
+ r_inlined_statement->visit(*this);
+ tgt_blk.body.insert(ins_pt, r_inlined_statement);
+ }
+
+ NodeReorderer().apply(stage, target_func, dependencies);
+
+ return r_result_name;
+}
+
+string InlineContentInjector::create_unused_name(const string &base, bool always_prefix)
+{
+ string result = base;
+ if(always_prefix || target_block->variables.count(result))
+ result = format("_%s_%s", source_func->name, base);
+ unsigned initial_size = result.size();
+ for(unsigned i=1; target_block->variables.count(result); ++i)
+ {
+ result.erase(initial_size);
+ result += format("_%d", i);
+ }
+ return result;
+}
+
+void InlineContentInjector::visit(VariableReference &var)
+{
+ if(remap_names)
+ {
+ map<string, VariableDeclaration *>::const_iterator i = variable_map.find(var.name);
+ if(i!=variable_map.end())
+ var.name = i->second->name;
+ }
+ else if(var.declaration)