BinaryOpExpression::BinaryOpExpression (EXPRESSION_CONSTRUCTOR_PARAMETERS, ExpressionPtr exp1, ExpressionPtr exp2, int op) : Expression(EXPRESSION_CONSTRUCTOR_PARAMETER_VALUES(BinaryOpExpression)), m_exp1(exp1), m_exp2(exp2), m_op(op), m_assign(false), m_canThrow(false) { switch (m_op) { case T_PLUS_EQUAL: case T_MINUS_EQUAL: case T_MUL_EQUAL: case T_DIV_EQUAL: case T_POW_EQUAL: case T_CONCAT_EQUAL: case T_MOD_EQUAL: case T_AND_EQUAL: case T_OR_EQUAL: case T_XOR_EQUAL: case T_SL_EQUAL: case T_SR_EQUAL: m_assign = true; m_exp1->setContext(Expression::LValue); m_exp1->setContext(Expression::OprLValue); m_exp1->setContext(Expression::DeepOprLValue); if (m_exp1->is(Expression::KindOfObjectPropertyExpression)) { m_exp1->setContext(Expression::NoLValueWrapper); } break; case T_COLLECTION: { std::string s = m_exp1->getLiteralString(); ExpressionListPtr el = static_pointer_cast<ExpressionList>(m_exp2); el->setCollectionElems(); break; } default: break; } }