mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
Merge branch 'PHP-8.2'
* PHP-8.2: Fix missing readonly modification error with inc/dec in JIT
This commit is contained in:
commit
86669774ae
9 changed files with 234 additions and 0 deletions
|
@ -2662,6 +2662,13 @@ static ZEND_COLD zend_long _zend_jit_throw_dec_prop_error(zend_property_info *pr
|
|||
|
||||
static void ZEND_FASTCALL zend_jit_inc_typed_prop(zval *var_ptr, zend_property_info *prop_info)
|
||||
{
|
||||
ZEND_ASSERT(Z_TYPE_P(var_ptr) != IS_UNDEF);
|
||||
|
||||
if (UNEXPECTED((prop_info->flags & ZEND_ACC_READONLY))) {
|
||||
zend_readonly_property_modification_error(prop_info);
|
||||
return;
|
||||
}
|
||||
|
||||
zend_execute_data *execute_data = EG(current_execute_data);
|
||||
zval tmp;
|
||||
|
||||
|
@ -2685,6 +2692,13 @@ static void ZEND_FASTCALL zend_jit_inc_typed_prop(zval *var_ptr, zend_property_i
|
|||
|
||||
static void ZEND_FASTCALL zend_jit_dec_typed_prop(zval *var_ptr, zend_property_info *prop_info)
|
||||
{
|
||||
ZEND_ASSERT(Z_TYPE_P(var_ptr) != IS_UNDEF);
|
||||
|
||||
if (UNEXPECTED((prop_info->flags & ZEND_ACC_READONLY))) {
|
||||
zend_readonly_property_modification_error(prop_info);
|
||||
return;
|
||||
}
|
||||
|
||||
zend_execute_data *execute_data = EG(current_execute_data);
|
||||
zval tmp;
|
||||
|
||||
|
@ -2722,6 +2736,16 @@ static void ZEND_FASTCALL zend_jit_pre_dec_typed_prop(zval *var_ptr, zend_proper
|
|||
|
||||
static void ZEND_FASTCALL zend_jit_post_inc_typed_prop(zval *var_ptr, zend_property_info *prop_info, zval *result)
|
||||
{
|
||||
ZEND_ASSERT(Z_TYPE_P(var_ptr) != IS_UNDEF);
|
||||
|
||||
if (UNEXPECTED((prop_info->flags & ZEND_ACC_READONLY))) {
|
||||
zend_readonly_property_modification_error(prop_info);
|
||||
if (result) {
|
||||
ZVAL_UNDEF(result);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
zend_execute_data *execute_data = EG(current_execute_data);
|
||||
|
||||
ZVAL_DEREF(var_ptr);
|
||||
|
@ -2743,6 +2767,16 @@ static void ZEND_FASTCALL zend_jit_post_inc_typed_prop(zval *var_ptr, zend_prope
|
|||
|
||||
static void ZEND_FASTCALL zend_jit_post_dec_typed_prop(zval *var_ptr, zend_property_info *prop_info, zval *result)
|
||||
{
|
||||
ZEND_ASSERT(Z_TYPE_P(var_ptr) != IS_UNDEF);
|
||||
|
||||
if (UNEXPECTED((prop_info->flags & ZEND_ACC_READONLY))) {
|
||||
zend_readonly_property_modification_error(prop_info);
|
||||
if (result) {
|
||||
ZVAL_UNDEF(result);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
zend_execute_data *execute_data = EG(current_execute_data);
|
||||
|
||||
ZVAL_DEREF(var_ptr);
|
||||
|
|
25
ext/opcache/tests/jit/readonly_001.phpt
Normal file
25
ext/opcache/tests/jit/readonly_001.phpt
Normal file
|
@ -0,0 +1,25 @@
|
|||
--TEST--
|
||||
JIT readonly modification post-inc
|
||||
--INI--
|
||||
opcache.enable=1
|
||||
opcache.enable_cli=1
|
||||
opcache.jit_buffer_size=1M
|
||||
--FILE--
|
||||
<?php
|
||||
class Foo {
|
||||
public readonly int $bar;
|
||||
|
||||
public function __construct() {
|
||||
$this->bar = 1;
|
||||
$this->bar++;
|
||||
}
|
||||
}
|
||||
|
||||
new Foo();
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Uncaught Error: Cannot modify readonly property Foo::$bar in %s:%d
|
||||
Stack trace:
|
||||
#0 %s(%d): Foo->__construct()
|
||||
#1 {main}
|
||||
thrown in %s on line %d
|
25
ext/opcache/tests/jit/readonly_002.phpt
Normal file
25
ext/opcache/tests/jit/readonly_002.phpt
Normal file
|
@ -0,0 +1,25 @@
|
|||
--TEST--
|
||||
JIT readonly modification pre-inc
|
||||
--INI--
|
||||
opcache.enable=1
|
||||
opcache.enable_cli=1
|
||||
opcache.jit_buffer_size=1M
|
||||
--FILE--
|
||||
<?php
|
||||
class Foo {
|
||||
public readonly int $bar;
|
||||
|
||||
public function __construct() {
|
||||
$this->bar = 1;
|
||||
++$this->bar;
|
||||
}
|
||||
}
|
||||
|
||||
new Foo();
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Uncaught Error: Cannot modify readonly property Foo::$bar in %s:%d
|
||||
Stack trace:
|
||||
#0 %s(%d): Foo->__construct()
|
||||
#1 {main}
|
||||
thrown in %s on line %d
|
25
ext/opcache/tests/jit/readonly_003.phpt
Normal file
25
ext/opcache/tests/jit/readonly_003.phpt
Normal file
|
@ -0,0 +1,25 @@
|
|||
--TEST--
|
||||
JIT readonly modification post-inc with result
|
||||
--INI--
|
||||
opcache.enable=1
|
||||
opcache.enable_cli=1
|
||||
opcache.jit_buffer_size=1M
|
||||
--FILE--
|
||||
<?php
|
||||
class Foo {
|
||||
public readonly int $bar;
|
||||
|
||||
public function __construct() {
|
||||
$this->bar = 1;
|
||||
var_dump($this->bar++);
|
||||
}
|
||||
}
|
||||
|
||||
new Foo();
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Uncaught Error: Cannot modify readonly property Foo::$bar in %s:%d
|
||||
Stack trace:
|
||||
#0 %s(%d): Foo->__construct()
|
||||
#1 {main}
|
||||
thrown in %s on line %d
|
25
ext/opcache/tests/jit/readonly_004.phpt
Normal file
25
ext/opcache/tests/jit/readonly_004.phpt
Normal file
|
@ -0,0 +1,25 @@
|
|||
--TEST--
|
||||
JIT readonly modification pre-inc with result
|
||||
--INI--
|
||||
opcache.enable=1
|
||||
opcache.enable_cli=1
|
||||
opcache.jit_buffer_size=1M
|
||||
--FILE--
|
||||
<?php
|
||||
class Foo {
|
||||
public readonly int $bar;
|
||||
|
||||
public function __construct() {
|
||||
$this->bar = 1;
|
||||
var_dump(++$this->bar);
|
||||
}
|
||||
}
|
||||
|
||||
new Foo();
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Uncaught Error: Cannot modify readonly property Foo::$bar in %s:%d
|
||||
Stack trace:
|
||||
#0 %s(%d): Foo->__construct()
|
||||
#1 {main}
|
||||
thrown in %s on line %d
|
25
ext/opcache/tests/jit/readonly_005.phpt
Normal file
25
ext/opcache/tests/jit/readonly_005.phpt
Normal file
|
@ -0,0 +1,25 @@
|
|||
--TEST--
|
||||
JIT readonly modification post-dec
|
||||
--INI--
|
||||
opcache.enable=1
|
||||
opcache.enable_cli=1
|
||||
opcache.jit_buffer_size=1M
|
||||
--FILE--
|
||||
<?php
|
||||
class Foo {
|
||||
public readonly int $bar;
|
||||
|
||||
public function __construct() {
|
||||
$this->bar = 1;
|
||||
$this->bar--;
|
||||
}
|
||||
}
|
||||
|
||||
new Foo();
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Uncaught Error: Cannot modify readonly property Foo::$bar in %s:%d
|
||||
Stack trace:
|
||||
#0 %s(%d): Foo->__construct()
|
||||
#1 {main}
|
||||
thrown in %s on line %d
|
25
ext/opcache/tests/jit/readonly_006.phpt
Normal file
25
ext/opcache/tests/jit/readonly_006.phpt
Normal file
|
@ -0,0 +1,25 @@
|
|||
--TEST--
|
||||
JIT readonly modification pre-dec
|
||||
--INI--
|
||||
opcache.enable=1
|
||||
opcache.enable_cli=1
|
||||
opcache.jit_buffer_size=1M
|
||||
--FILE--
|
||||
<?php
|
||||
class Foo {
|
||||
public readonly int $bar;
|
||||
|
||||
public function __construct() {
|
||||
$this->bar = 1;
|
||||
--$this->bar;
|
||||
}
|
||||
}
|
||||
|
||||
new Foo();
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Uncaught Error: Cannot modify readonly property Foo::$bar in %s:%d
|
||||
Stack trace:
|
||||
#0 %s(%d): Foo->__construct()
|
||||
#1 {main}
|
||||
thrown in %s on line %d
|
25
ext/opcache/tests/jit/readonly_007.phpt
Normal file
25
ext/opcache/tests/jit/readonly_007.phpt
Normal file
|
@ -0,0 +1,25 @@
|
|||
--TEST--
|
||||
JIT readonly modification dec-inc with result
|
||||
--INI--
|
||||
opcache.enable=1
|
||||
opcache.enable_cli=1
|
||||
opcache.jit_buffer_size=1M
|
||||
--FILE--
|
||||
<?php
|
||||
class Foo {
|
||||
public readonly int $bar;
|
||||
|
||||
public function __construct() {
|
||||
$this->bar = 1;
|
||||
var_dump($this->bar--);
|
||||
}
|
||||
}
|
||||
|
||||
new Foo();
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Uncaught Error: Cannot modify readonly property Foo::$bar in %s:%d
|
||||
Stack trace:
|
||||
#0 %s(%d): Foo->__construct()
|
||||
#1 {main}
|
||||
thrown in %s on line %d
|
25
ext/opcache/tests/jit/readonly_008.phpt
Normal file
25
ext/opcache/tests/jit/readonly_008.phpt
Normal file
|
@ -0,0 +1,25 @@
|
|||
--TEST--
|
||||
JIT readonly modification pre-dec with result
|
||||
--INI--
|
||||
opcache.enable=1
|
||||
opcache.enable_cli=1
|
||||
opcache.jit_buffer_size=1M
|
||||
--FILE--
|
||||
<?php
|
||||
class Foo {
|
||||
public readonly int $bar;
|
||||
|
||||
public function __construct() {
|
||||
$this->bar = 1;
|
||||
var_dump(--$this->bar);
|
||||
}
|
||||
}
|
||||
|
||||
new Foo();
|
||||
?>
|
||||
--EXPECTF--
|
||||
Fatal error: Uncaught Error: Cannot modify readonly property Foo::$bar in %s:%d
|
||||
Stack trace:
|
||||
#0 %s(%d): Foo->__construct()
|
||||
#1 {main}
|
||||
thrown in %s on line %d
|
Loading…
Add table
Add a link
Reference in a new issue