r_ternary_result = 0;
}
+void ConstantConditionEliminator::visit(UnaryExpression &unary)
+{
+ if(unary.oper->token[1]=='+' || unary.oper->token[1]=='-')
+ if(const VariableReference *var = dynamic_cast<const VariableReference *>(unary.expression.get()))
+ {
+ auto i = current_block->variables.find(var->name);
+ r_external_side_effects = (i==current_block->variables.end() || i->second!=var->declaration);
+ return;
+ }
+
+ TraversingVisitor::visit(unary);
+}
+
+void ConstantConditionEliminator::visit(Assignment &assign)
+{
+ auto i = find_if(current_block->variables, [&assign](const pair<string, VariableDeclaration *> &kvp){ return kvp.second==assign.target.declaration; });
+ if(i==current_block->variables.end())
+ r_external_side_effects = true;
+ TraversingVisitor::visit(assign);
+}
+
void ConstantConditionEliminator::visit(TernaryExpression &ternary)
{
ConstantStatus result = check_constant_condition(*ternary.condition);
r_ternary_result = 0;
}
+void ConstantConditionEliminator::visit(FunctionCall &call)
+{
+ r_external_side_effects = true;
+ TraversingVisitor::visit(call);
+}
+
void ConstantConditionEliminator::visit(Conditional &cond)
{
ConstantStatus result = check_constant_condition(*cond.condition);
return;
}
+ r_external_side_effects = false;
TraversingVisitor::visit(cond);
+
+ if(cond.body.body.empty() && cond.else_body.body.empty() && !r_external_side_effects)
+ nodes_to_remove.insert(&cond);
}
void ConstantConditionEliminator::visit(Iteration &iter)
}
}
+ r_external_side_effects = false;
TraversingVisitor::visit(iter);
+ if(iter.body.body.empty() && !r_external_side_effects)
+ nodes_to_remove.insert(&iter);
}