#include <msp/core/raii.h>
#include <msp/strings/format.h>
#include "optimize.h"
+#include "reflect.h"
using namespace std;
InlineContentInjector::InlineContentInjector():
source_func(0),
- pass(DEPENDS)
+ pass(REFERENCED)
{ }
const string &InlineContentInjector::apply(Stage &stage, FunctionDeclaration &target_func, Block &tgt_blk, const NodeList<Statement>::iterator &ins_pt, FunctionCall &call)
{
source_func = call.declaration->definition;
- // Collect all declarations the inlined function depends on.
- pass = DEPENDS;
- source_func->visit(*this);
-
/* Populate referenced_names from the target function so we can rename
variables from the inlined function that would conflict. */
pass = REFERENCED;
tgt_blk.body.splice(ins_pt, staging_block.body);
- NodeReorderer().apply(stage, target_func, dependencies);
+ NodeReorderer().apply(stage, target_func, DependencyCollector().apply(*source_func));
return r_result_name;
}
if(i!=staging_block.variables.end())
var.name = i->second->name;
}
- else if(pass==DEPENDS && var.declaration)
- {
- dependencies.insert(var.declaration);
- var.declaration->visit(*this);
- }
else if(pass==REFERENCED)
referenced_names.insert(var.name);
}
void InlineContentInjector::visit(InterfaceBlockReference &iface)
{
- if(pass==DEPENDS && iface.declaration)
- {
- dependencies.insert(iface.declaration);
- iface.declaration->visit(*this);
- }
- else if(pass==REFERENCED)
+ if(pass==REFERENCED)
referenced_names.insert(iface.name);
}
void InlineContentInjector::visit(FunctionCall &call)
{
- if(pass==DEPENDS && call.declaration)
- dependencies.insert(call.declaration);
- else if(pass==REFERENCED)
+ if(pass==REFERENCED)
referenced_names.insert(call.name);
TraversingVisitor::visit(call);
}
}
}
}
- else if(pass==DEPENDS && var.type_declaration)
- {
- dependencies.insert(var.type_declaration);
- var.type_declaration->visit(*this);
- }
else if(pass==REFERENCED)
referenced_names.insert(var.type);
}
}
-ExpressionInliner::ExpressionInfo::ExpressionInfo():
- expression(0),
- assign_scope(0),
- inline_point(0),
- trivial(false),
- available(true)
-{ }
-
-
ExpressionInliner::ExpressionInliner():
r_ref_info(0),
r_any_inlined(false),