pass = INLINE;
staging_block.parent = &tgt_blk;
staging_block.variables.clear();
- remap_prefix = source_func->name;
std::vector<RefPtr<VariableDeclaration> > params;
params.reserve(source_func->parameters.size());
SetForScope<Pass> set_pass(pass, RENAME);
var->visit(*this);
- staging_block.body.push_back(0);
- staging_block.body.back() = var;
+ staging_block.body.push_back_nocopy(var);
params.push_back(var);
}
SetForScope<Pass> set_pass(pass, RENAME);
r_inlined_statement->visit(*this);
- staging_block.body.push_back(0);
- staging_block.body.back() = r_inlined_statement;
+ staging_block.body.push_back_nocopy(r_inlined_statement);
}
/* Now collect names from the staging block. Local variables that would
global identifiers used by the source function. */
pass = RENAME;
staging_block.parent = source_func->body.parent;
- remap_prefix = target_func.name;
target_func.visit(*this);
// Put the argument expressions in place after all renaming has been done.
if(pass==RENAME)
{
+ /* Check against conflicts with the other context as well as variables
+ already renamed here. */
+ bool conflict = (staging_block.variables.count(var.name) || referenced_names.count(var.name));
staging_block.variables[var.name] = &var;
- if(referenced_names.count(var.name))
+ if(conflict)
{
- string mapped_name = get_unused_variable_name(staging_block, var.name, remap_prefix);
+ string mapped_name = get_unused_variable_name(staging_block, var.name);
if(mapped_name!=var.name)
{
staging_block.variables[mapped_name] = &var;
if(pass==INLINE && ret.expression)
{
// Create a new variable to hold the return value of the inlined function.
- r_result_name = get_unused_variable_name(staging_block, "_return", source_func->name);
+ r_result_name = get_unused_variable_name(staging_block, "_return");
RefPtr<VariableDeclaration> var = new VariableDeclaration;
var->source = ret.source;
var->line = ret.line;
void FunctionInliner::visit(FunctionCall &call)
{
+ for(NodeArray<Expression>::iterator i=call.arguments.begin(); (!r_inlined_here && i!=call.arguments.end()); ++i)
+ visit(*i);
+
if(r_inlined_here)
return;
- for(NodeArray<Expression>::iterator i=call.arguments.begin(); i!=call.arguments.end(); ++i)
- visit(*i);
-
FunctionDeclaration *def = call.declaration;
if(def)
def = def->definition;
// This will later get removed by UnusedVariableRemover.
if(result_name.empty())
- result_name = "msp_unused_from_inline";
+ result_name = "_msp_unused_from_inline";
RefPtr<VariableReference> ref = new VariableReference;
ref->name = result_name;
/* Mark variables as output if they're used by the next stage or the
graphics API. */
if(interface_block)
- var_info.output = (interface_block->interface=="out" && (interface_block->linked_block || !interface_block->name.compare(0, 3, "gl_")));
+ var_info.output = (interface_block->interface=="out" && (interface_block->linked_block || !interface_block->block_name.compare(0, 3, "gl_")));
else
var_info.output = (var.interface=="out" && (stage->type==Stage::FRAGMENT || var.linked_declaration || !var.name.compare(0, 3, "gl_")));
else
{
VariableInfo &var_info = variables[&iface];
- var_info.output = (iface.interface=="out" && (iface.linked_block || !iface.name.compare(0, 3, "gl_")));
+ var_info.output = (iface.interface=="out" && (iface.linked_block || !iface.block_name.compare(0, 3, "gl_")));
}
}