+void InlineableFunctionLocator::visit(Conditional &)
+{
+ inlineable.erase(current_function);
+}
+
+void InlineableFunctionLocator::visit(Iteration &)
+{
+ inlineable.erase(current_function);
+}
+
+void InlineableFunctionLocator::visit(Return &)
+{
+ 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 &tgtb, const NodeList<Statement>::iterator &ins_pt, FunctionDeclaration &src)
+{
+ target_block = &tgtb;
+ source_func = &src;
+ for(NodeList<Statement>::iterator i=src.body.body.begin(); i!=src.body.body.end(); ++i)
+ {
+ inlined_statement = 0;
+ (*i)->visit(*this);
+ if(!inlined_statement)
+ inlined_statement = (*i)->clone();
+
+ SetFlag set_remap(remap_names);
+ inlined_statement->visit(*this);
+ tgtb.body.insert(ins_pt, inlined_statement);
+ }
+
+ NodeReorderer().apply(stage, target_func, dependencies);
+
+ return 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;
+}