From: Nikita Popov Date: Tue, 29 Oct 2019 12:05:02 +0000 (+0100) Subject: Throw "Unsupported operand types" error when using ** on arrays X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=26327bcd3b6375a4883f00a289ba129e5b23717d;p=php Throw "Unsupported operand types" error when using ** on arrays --- diff --git a/Zend/tests/bug74084.phpt b/Zend/tests/bug74084.phpt index 108f03be36..ab4dce0a5a 100644 --- a/Zend/tests/bug74084.phpt +++ b/Zend/tests/bug74084.phpt @@ -24,11 +24,14 @@ try { echo $e->getMessage(), "\n"; } unset($$A); -$$A **= $$B['a'] = &$$C; -var_dump($$A); +try { + $$A **= $$B['a'] = &$$C; +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} ?> --EXPECT-- Unsupported operand types Unsupported operand types Unsupported operand types -int(0) +Unsupported operand types diff --git a/Zend/tests/pow_array_leak.phpt b/Zend/tests/pow_array_leak.phpt index e9165bbbc5..a17a290458 100644 --- a/Zend/tests/pow_array_leak.phpt +++ b/Zend/tests/pow_array_leak.phpt @@ -4,14 +4,30 @@ Memory leak on ** with result==op1 array getMessage(), "\n"; +} var_dump($x); $x = [0]; -$x **= $x; +try { + $x **= $x; +} catch (Error $e) { + echo $e->getMessage(), "\n"; +} var_dump($x); ?> --EXPECT-- -int(0) -int(0) +Unsupported operand types +array(1) { + [0]=> + int(0) +} +Unsupported operand types +array(1) { + [0]=> + int(0) +} diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 69ee522b4c..a1f3024d4e 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1197,37 +1197,22 @@ ZEND_API int ZEND_FASTCALL pow_function(zval *result, zval *op1, zval *op2) /* { } else if (!converted) { ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_POW, pow_function); - if (EXPECTED(op1 != op2)) { - if (Z_TYPE_P(op1) == IS_ARRAY) { - if (op1 == result) { - zval_ptr_dtor(result); - } - ZVAL_LONG(result, 0); - return SUCCESS; - } else { - op1 = zendi_convert_scalar_to_number(op1, &op1_copy, result, 0); - } - if (Z_TYPE_P(op2) == IS_ARRAY) { - if (op1 == result) { - zval_ptr_dtor(result); - } - ZVAL_LONG(result, 1L); - return SUCCESS; - } else { - op2 = zendi_convert_scalar_to_number(op2, &op2_copy, result, 0); + if (Z_TYPE_P(op1) == IS_ARRAY || Z_TYPE_P(op2) == IS_ARRAY) { + if (result != op1) { + ZVAL_UNDEF(result); } + zend_throw_error(NULL, "Unsupported operand types"); + return FAILURE; + } + + if (EXPECTED(op1 != op2)) { + op1 = zendi_convert_scalar_to_number(op1, &op1_copy, result, 0); + op2 = zendi_convert_scalar_to_number(op2, &op2_copy, result, 0); } else { - if (Z_TYPE_P(op1) == IS_ARRAY) { - if (op1 == result) { - zval_ptr_dtor(result); - } - ZVAL_LONG(result, 0); - return SUCCESS; - } else { - op1 = zendi_convert_scalar_to_number(op1, &op1_copy, result, 0); - } + op1 = zendi_convert_scalar_to_number(op1, &op1_copy, result, 0); op2 = op1; } + if (EG(exception)) { if (result != op1) { ZVAL_UNDEF(result); diff --git a/ext/standard/tests/math/pow_variation1.phpt b/ext/standard/tests/math/pow_variation1.phpt index a3e13d861c..86df8e0eb4 100644 --- a/ext/standard/tests/math/pow_variation1.phpt +++ b/ext/standard/tests/math/pow_variation1.phpt @@ -84,9 +84,13 @@ $inputs = array( // loop through each element of $inputs to check the behaviour of pow() $iterator = 1; foreach($inputs as $input) { - echo "\n-- Iteration $iterator --\n"; - var_dump(pow($input, 3)); - $iterator++; + echo "\n-- Iteration $iterator --\n"; + try { + var_dump(pow($input, 3)); + } catch (Error $e) { + echo $e->getMessage(), "\n"; + } + $iterator++; }; fclose($fp); ?> @@ -153,7 +157,7 @@ Warning: A non-numeric value encountered in %s on line %d int(0) -- Iteration 19 -- -int(0) +Unsupported operand types -- Iteration 20 -- diff --git a/ext/standard/tests/math/pow_variation1_64bit.phpt b/ext/standard/tests/math/pow_variation1_64bit.phpt index 0d8b1960be..da63ae3d9f 100644 --- a/ext/standard/tests/math/pow_variation1_64bit.phpt +++ b/ext/standard/tests/math/pow_variation1_64bit.phpt @@ -84,9 +84,13 @@ $inputs = array( // loop through each element of $inputs to check the behaviour of pow() $iterator = 1; foreach($inputs as $input) { - echo "\n-- Iteration $iterator --\n"; - var_dump(pow($input, 3)); - $iterator++; + echo "\n-- Iteration $iterator --\n"; + try { + var_dump(pow($input, 3)); + } catch (Error $e) { + echo $e->getMessage(), "\n"; + } + $iterator++; }; fclose($fp); ?> @@ -153,7 +157,7 @@ Warning: A non-numeric value encountered in %s on line %d int(0) -- Iteration 19 -- -int(0) +Unsupported operand types -- Iteration 20 -- diff --git a/ext/standard/tests/math/pow_variation2.phpt b/ext/standard/tests/math/pow_variation2.phpt index 4876447da9..83d1fda065 100644 --- a/ext/standard/tests/math/pow_variation2.phpt +++ b/ext/standard/tests/math/pow_variation2.phpt @@ -80,9 +80,13 @@ $inputs = array( // loop through each element of $inputs to check the behaviour of pow() $iterator = 1; foreach($inputs as $input) { - echo "\n-- Iteration $iterator --\n"; - var_dump(pow(20.3, $input)); - $iterator++; + echo "\n-- Iteration $iterator --\n"; + try { + var_dump(pow(20.3, $input)); + } catch (Error $e) { + echo $e->getMessage(), "\n"; + } + $iterator++; }; fclose($fp); ?> @@ -149,7 +153,7 @@ Warning: A non-numeric value encountered in %s on line %d float(1) -- Iteration 19 -- -int(1) +Unsupported operand types -- Iteration 20 --