#include <msp/core/raii.h>
+#include <msp/strings/format.h>
#include "optimize.h"
using namespace std;
TraversingVisitor::visit(func);
}
-void InlineableFunctionLocator::visit(Conditional &)
+void InlineableFunctionLocator::visit(Conditional &cond)
{
+ TraversingVisitor::visit(cond);
inlineable.erase(current_function);
}
-void InlineableFunctionLocator::visit(Iteration &)
+void InlineableFunctionLocator::visit(Iteration &iter)
{
+ TraversingVisitor::visit(iter);
inlineable.erase(current_function);
}
-void InlineableFunctionLocator::visit(Return &)
+void InlineableFunctionLocator::visit(Return &ret)
{
+ TraversingVisitor::visit(ret);
if(return_count)
inlineable.erase(current_function);
++return_count;
void FunctionInliner::visit(Block &block)
{
+ SetForScope<Block *> set_block(current_block, &block);
SetForScope<NodeList<Statement>::iterator> save_insert_point(insert_point, block.body.begin());
for(NodeList<Statement>::iterator i=block.body.begin(); i!=block.body.end(); ++i)
{
TraversingVisitor::visit(func);
}
+void FunctionInliner::visit(Conditional &cond)
+{
+ visit_and_inline(cond.condition);
+ cond.body.visit(*this);
+}
+
+void FunctionInliner::visit(Iteration &iter)
+{
+ SetForScope<Block *> set_block(current_block, &iter.body);
+ if(iter.init_statement)
+ iter.init_statement->visit(*this);
+ /* Skip the condition and loop expression parts because they're executed on
+ every iteration of the loop */
+ iter.body.visit(*this);
+}
+
void FunctionInliner::visit(Return &ret)
{
if(ret.expression)
void ConstantConditionEliminator::visit(UnaryExpression &unary)
{
if(VariableReference *var = dynamic_cast<VariableReference *>(unary.expression.get()))
- if(unary.oper=="++" || unary.oper=="--")
+ if(unary.oper->token[1]=='+' || unary.oper->token[1]=='-')
variable_values.erase(var->declaration);
}
void UnusedVariableRemover::visit(UnaryExpression &unary)
{
TraversingVisitor::visit(unary);
- if(unary.oper=="++" || unary.oper=="--")
+ if(unary.oper->token[1]=='+' || unary.oper->token[1]=='-')
side_effects = true;
}
void UnusedVariableRemover::visit(BinaryExpression &binary)
{
- if(binary.oper=="[")
+ if(binary.oper->token[0]=='[')
{
if(assignment_target)
assign_to_subscript = true;