mirror of
https://github.com/php/php-src.git
synced 2024-11-24 02:15:04 +08:00
Throw "Unsupported operand types" error when using ** on arrays
This commit is contained in:
parent
8f20b9969f
commit
26327bcd3b
@ -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
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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 --
|
||||
|
||||
|
@ -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 --
|
||||
|
||||
|
@ -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 --
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user