Throw "Unsupported operand types" error when using ** on arrays

This commit is contained in:
Nikita Popov 2019-10-29 13:05:02 +01:00
parent 8f20b9969f
commit 26327bcd3b
6 changed files with 62 additions and 46 deletions

View File

@ -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

View File

@ -4,14 +4,30 @@ Memory leak on ** with result==op1 array
<?php
$x = [0];
$x **= 1;
try {
$x **= 1;
} catch (Error $e) {
echo $e->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)
}

View File

@ -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 (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)) {
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);
}
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);

View File

@ -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 --

View File

@ -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 --

View File

@ -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 --