const string &InlineContentInjector::apply(Stage &stage, FunctionDeclaration &target_func, Block &tgt_blk, const NodeList<Statement>::iterator &ins_pt, FunctionDeclaration &src)
{
- target_block = &tgt_blk;
+ staging_block.parent = &tgt_blk;
source_func = &src;
remap_prefix = source_func->name;
- vector<RefPtr<Statement> > inlined;
- inlined.reserve(src.body.body.size());
for(NodeList<Statement>::iterator i=src.body.body.begin(); i!=src.body.body.end(); ++i)
{
r_inlined_statement = 0;
SetForScope<unsigned> set_remap(remap_names, 2);
r_inlined_statement->visit(*this);
- inlined.push_back(r_inlined_statement);
+ staging_block.body.push_back(r_inlined_statement);
}
SetForScope<unsigned> set_remap(remap_names, 1);
SetForScope<string> set_prefix(remap_prefix, target_func.name);
- variable_map.clear();
+ staging_block.variables.clear();
target_func.visit(*this);
- tgt_blk.body.insert(ins_pt, inlined.begin(), inlined.end());
+ tgt_blk.body.splice(ins_pt, staging_block.body);
NodeReorderer().apply(stage, target_func, dependencies);
{
if(remap_names)
{
- map<string, VariableDeclaration *>::const_iterator i = variable_map.find(var.name);
- if(i!=variable_map.end())
+ map<string, VariableDeclaration *>::const_iterator i = staging_block.variables.find(var.name);
+ if(i!=staging_block.variables.end())
var.name = i->second->name;
}
else if(var.declaration)
{
- if(!variable_map.count(var.name))
+ if(!staging_block.variables.count(var.name))
{
dependencies.insert(var.declaration);
referenced_names.insert(var.name);
{
if(remap_names==2 || referenced_names.count(var.name))
{
- string mapped_name = get_unused_variable_name(*target_block, var.name, remap_prefix);
- variable_map[var.name] = &var;
+ string mapped_name = get_unused_variable_name(staging_block, var.name, remap_prefix);
+ staging_block.variables[var.name] = &var;
+ if(mapped_name!=var.name)
+ staging_block.variables[mapped_name] = &var;
var.name = mapped_name;
}
}
{
/* Create a new variable to hold the return value of the inlined
function. */
- r_result_name = get_unused_variable_name(*target_block, "_return", source_func->name);
+ r_result_name = get_unused_variable_name(staging_block, "_return", source_func->name);
RefPtr<VariableDeclaration> var = new VariableDeclaration;
var->source = ret.source;
var->line = ret.line;
--- /dev/null
+#pragma MSP stage(vertex)
+layout(location=0) in vec4 position;
+layout(location=1) in float scale;
+vec2 func()
+{
+ float _return = scale*2.0;
+ return vec2(_return, _return);
+}
+void main()
+{
+ float _return = scale+1.0;
+ gl_Position = position*func().xxyy*_return*_return;
+}
+
+/* Expected output: vertex
+layout(location=0) in vec4 position;
+layout(location=1) in float scale;
+void main()
+{
+ float _return = scale+1.0;
+ float _func_return = scale*2.0;
+ gl_Position = position*vec2(_func_return, _func_return).xxyy*_return*_return;
+}
+*/