diff --git a/src/mapval.hh b/src/mapval.hh index 0ae6976..7a332de 100644 --- a/src/mapval.hh +++ b/src/mapval.hh @@ -21,18 +21,6 @@ PHP_ARMA_MAPVAL_OPERATOR_EX(cx_double, func) \ PHP_ARMA_OPERATOR_END() -#define PHP_ARMA_MAPVAL_OPERATOR_ASSIGN_EX(type, func) \ - PHP_ARMA_OPERATOR_ASSIGN_EX(mapval_dense , func) \ - PHP_ARMA_OPERATOR_ASSIGN_EX(mapval_spmat , func) \ - PHP_ARMA_OPERATOR_ASSIGN_EX(mapval_sp_subview, func) - -#define PHP_ARMA_MAPVAL_OPERATOR_ASSIGN(func) \ - PHP_ARMA_OPERATOR_BEGIN(scalar_ce) \ - PHP_ARMA_MAPVAL_OPERATOR_ASSIGN_EX(double, func) \ - PHP_ARMA_MAPVAL_OPERATOR_ASSIGN_EX(zend_long, func) \ - PHP_ARMA_MAPVAL_OPERATOR_ASSIGN_EX(cx_double, func) \ - PHP_ARMA_OPERATOR_END() - // Forward declarations. namespace arma { @@ -126,29 +114,24 @@ namespace php_arma struct mapval::operators { zend_always_inline - static bool assign(zval *zv1, zval *zv2, zval *retval) - { - if (!zval_is_scalar(zv2)) { - return false; - } - set_val(Z_OBJ_P(retval), zval_get_scalar(zv2)); - return true; - } - - zend_always_inline - static bool mul(zval *zv1, zval *zv2, zval *retval) - { + static bool mul( #if PHP_VERSION_ID < 70300 - if (Z_TYPE_P(zv1) == IS_LONG && Z_LVAL_P(zv1) == 1) { - zval_set_scalar(retval, get_val(Z_OBJ_P(zv2))); - return true; - } + zval *zv1, zval *zv2, #else - if (Z_TYPE_P(zv2) == IS_LONG && Z_LVAL_P(zv2) == 1) { - zval_set_scalar(retval, get_val(Z_OBJ_P(zv1))); + zval *zv2, zval *zv1, +#endif + zval *retval) + { + if (EXPECTED(Z_TYPE_P(zv1) == IS_LONG)) { + if (Z_LVAL_P(zv1) == 1) { + zval_set_scalar(retval, get_val(Z_OBJ_P(zv2))); + } else if (Z_LVAL_P(zv1) == -1) { + zval_set_scalar(retval, -get_val(Z_OBJ_P(zv2))); + } else { + return false; + } return true; } -#endif return false; } }; diff --git a/src/operators.cc b/src/operators.cc index 32624da..5320e69 100644 --- a/src/operators.cc +++ b/src/operators.cc @@ -84,15 +84,6 @@ namespace php_arma return ZEND_USER_OPCODE_CONTINUE; } - int assign_handler(zend_execute_data *execute_data) - { - return op_handler(execute_data, PHP_ARMA_OP_HANDLER_FUNC { - PHP_ARMA_MAPVAL_OPERATOR_ASSIGN(assign); - - return false; - }); - } - int add_handler(zend_execute_data *execute_data) { return op_handler(execute_data, PHP_ARMA_OP_HANDLER_FUNC { @@ -205,7 +196,6 @@ namespace php_arma void operators_init() { set_op_handlers( - std::tuple(ZEND_ASSIGN, assign_handler), std::tuple(ZEND_ADD, add_handler), std::tuple(ZEND_ASSIGN_ADD, add_assign_handler), std::tuple(ZEND_SUB, sub_handler), diff --git a/tests/007-scalar-operators.phpt b/tests/007-scalar-operators.phpt index 4333144..32f972a 100644 --- a/tests/007-scalar-operators.phpt +++ b/tests/007-scalar-operators.phpt @@ -14,15 +14,10 @@ if (is_php_arma_loaded()) { require_once 'includes/assert.php'; $mat = Arma\IMat::fromString('1 2; 3 4'); -$mapval = $mat(1, 0); -$mapval = 5; -// Unfortunately, the Zend Engine prevents us from writing something like: -// $mat(1, 0) = 5; -// because function return values are not supposed to be used in write context. -// Function `zend_ensure_writable_variable()` does that check in compile time. batch_assert('operator overloading of `MapVal`', - [5, +$mat->at(1, 0)] + [3, +$mat->at(1, 0)], + [-2, -$mat(0, 1)] ); ?>