ExpressionPtr UnaryOpExpression::postOptimize(AnalysisResultConstPtr ar) { if (m_op == T_PRINT && m_exp->is(KindOfEncapsListExpression) && !m_exp->hasEffect()) { EncapsListExpressionPtr e = static_pointer_cast<EncapsListExpression> (m_exp); e->stripConcat(); } if (m_op == T_UNSET_CAST && !hasEffect()) { if (!getScope()->getVariables()-> getAttribute(VariableTable::ContainsCompact) || !m_exp->isScalar()) { return CONSTANT("null"); } } else if (m_op == T_UNSET && m_exp->is(KindOfExpressionList) && !static_pointer_cast<ExpressionList>(m_exp)->getCount()) { recomputeEffects(); return CONSTANT("null"); } else if (m_op == T_BOOL_CAST) { if (m_exp->getActualType() && m_exp->getActualType()->is(Type::KindOfBoolean)) { return replaceValue(m_exp); } } else if (m_op != T_ARRAY && m_exp && m_exp->isScalar()) { Variant value; Variant result; if (m_exp->getScalarValue(value) && preCompute(value, result)) { return replaceValue(makeScalarExpression(ar, result)); } } return ExpressionPtr(); }
ExpressionPtr UnaryOpExpression::postOptimize(AnalysisResultPtr ar) { bool insideScalarArray = ar->getInsideScalarArray(); if (m_op == T_ARRAY && (getContext() & (RefValue|LValue)) == 0) { if (m_exp) { ExpressionListPtr pairs = dynamic_pointer_cast<ExpressionList>(m_exp); if (pairs && pairs->isScalarArrayPairs()) { m_arrayId = ar->registerScalarArray(m_exp); ar->setInsideScalarArray(true); } } else { m_arrayId = ar->registerScalarArray(m_exp); // empty array } } ar->postOptimize(m_exp); if (m_op == T_PRINT && m_exp->is(KindOfEncapsListExpression) && !m_exp->hasEffect()) { EncapsListExpressionPtr e = static_pointer_cast<EncapsListExpression> (m_exp); e->stripConcat(); } ar->setInsideScalarArray(insideScalarArray); if (m_op == T_UNSET_CAST && !hasEffect()) { return CONSTANT("null"); } else if (m_op == T_UNSET && m_exp->is(KindOfExpressionList) && !static_pointer_cast<ExpressionList>(m_exp)->getCount()) { return CONSTANT("null"); } return ExpressionPtr(); }
int BinaryOpExpression::getConcatList(ExpressionPtrVec &ev, ExpressionPtr exp, bool &hasVoid) { if (!exp->hasCPPTemp()) { if (exp->is(Expression::KindOfUnaryOpExpression)) { UnaryOpExpressionPtr u = static_pointer_cast<UnaryOpExpression>(exp); if (u->getOp() == '(') { return getConcatList(ev, u->getExpression(), hasVoid); } } else if (exp->is(Expression::KindOfBinaryOpExpression)) { BinaryOpExpressionPtr b = static_pointer_cast<BinaryOpExpression>(exp); if (b->getOp() == '.') { return getConcatList(ev, b->getExp1(), hasVoid) + getConcatList(ev, b->getExp2(), hasVoid); } } else if (exp->is(Expression::KindOfEncapsListExpression)) { EncapsListExpressionPtr e = static_pointer_cast<EncapsListExpression>(exp); if (e->getType() != '`') { ExpressionListPtr el = e->getExpressions(); int num = 0; for (int i = 0, s = el->getCount(); i < s; i++) { ExpressionPtr exp = (*el)[i]; num += getConcatList(ev, exp, hasVoid); } return num; } } } ev.push_back(exp); bool isVoid = !exp->getActualType(); hasVoid |= isVoid; return isVoid ? 0 : 1; }
int BinaryOpExpression::getConcatList(ExpressionPtrVec &ev, ExpressionPtr exp, bool &hasVoid) { if (!exp->hasCPPTemp()) { if (exp->is(Expression::KindOfUnaryOpExpression)) { UnaryOpExpressionPtr u = static_pointer_cast<UnaryOpExpression>(exp); if (u->getOp() == '(') { return getConcatList(ev, u->getExpression(), hasVoid); } } else if (exp->is(Expression::KindOfBinaryOpExpression)) { BinaryOpExpressionPtr b = static_pointer_cast<BinaryOpExpression>(exp); if (b->getOp() == '.') { if (b->getExp1()->is(Expression::KindOfSimpleVariable) && b->getExp1()->isLocalExprAltered() && !b->getExp1()->hasCPPTemp() && b->getExp2()->hasEffect() && !b->getExp2()->hasCPPTemp()) { /* In this case, the simple variable must be evaluated after b->getExp2(). But when we output a concat list we explicitly order the expressions from left to right. */ } else { return getConcatList(ev, b->getExp1(), hasVoid) + getConcatList(ev, b->getExp2(), hasVoid); } } } else if (exp->is(Expression::KindOfEncapsListExpression)) { EncapsListExpressionPtr e = static_pointer_cast<EncapsListExpression>(exp); if (e->getType() != '`') { ExpressionListPtr el = e->getExpressions(); int num = 0; for (int i = 0, s = el->getCount(); i < s; i++) { ExpressionPtr exp = (*el)[i]; num += getConcatList(ev, exp, hasVoid); } return num; } } } else if (!exp->getActualType()) { return 0; } ev.push_back(exp); bool isVoid = !exp->getActualType(); hasVoid |= isVoid; return isVoid ? 0 : 1; }
ExpressionPtr UnaryOpExpression::postOptimize(AnalysisResultPtr ar) { if (m_op == T_PRINT && m_exp->is(KindOfEncapsListExpression) && !m_exp->hasEffect()) { EncapsListExpressionPtr e = static_pointer_cast<EncapsListExpression> (m_exp); e->stripConcat(); } if (m_op == T_UNSET_CAST && !hasEffect()) { return CONSTANT("null"); } else if (m_op == T_UNSET && m_exp->is(KindOfExpressionList) && !static_pointer_cast<ExpressionList>(m_exp)->getCount()) { return CONSTANT("null"); } return ExpressionPtr(); }
ExpressionPtr UnaryOpExpression::postOptimize(AnalysisResultConstPtr ar) { if (m_op == T_PRINT && m_exp->is(KindOfEncapsListExpression) && !m_exp->hasEffect()) { EncapsListExpressionPtr e = static_pointer_cast<EncapsListExpression> (m_exp); e->stripConcat(); } if (m_op == T_UNSET_CAST && !hasEffect()) { if (!getScope()->getVariables()-> getAttribute(VariableTable::ContainsCompact) || !m_exp->isScalar()) { return CONSTANT("null"); } } else if (m_op == T_UNSET && m_exp->is(KindOfExpressionList) && !static_pointer_cast<ExpressionList>(m_exp)->getCount()) { recomputeEffects(); return CONSTANT("null"); } return ExpressionPtr(); }