Skip to content

Commit b9c6f07

Browse files
committed
Merge branch 'PHP-8.2' into PHP-8.3
* PHP-8.2: Fix incorrect handling of ZEND_ACC_FINAL flag in JIT (php#16778)
2 parents fbf4cec + 19809a5 commit b9c6f07

File tree

3 files changed

+48
-10
lines changed

3 files changed

+48
-10
lines changed

ext/opcache/jit/zend_jit.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -3191,7 +3191,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
31913191
if (opline->op1_type == IS_UNUSED) {
31923192
op1_info = MAY_BE_OBJECT|MAY_BE_RC1|MAY_BE_RCN;
31933193
ce = op_array->scope;
3194-
ce_is_instanceof = (ce->ce_flags & ZEND_ACC_FINAL) != 0;
3194+
ce_is_instanceof = !(ce->ce_flags & ZEND_ACC_FINAL);
31953195
op1_addr = 0;
31963196
on_this = 1;
31973197
} else {
@@ -3239,7 +3239,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
32393239
if (opline->op1_type == IS_UNUSED) {
32403240
op1_info = MAY_BE_OBJECT|MAY_BE_RC1|MAY_BE_RCN;
32413241
ce = op_array->scope;
3242-
ce_is_instanceof = (ce->ce_flags & ZEND_ACC_FINAL) != 0;
3242+
ce_is_instanceof = !(ce->ce_flags & ZEND_ACC_FINAL);
32433243
op1_addr = 0;
32443244
on_this = 1;
32453245
} else {
@@ -3280,7 +3280,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
32803280
if (opline->op1_type == IS_UNUSED) {
32813281
op1_info = MAY_BE_OBJECT|MAY_BE_RC1|MAY_BE_RCN;
32823282
ce = op_array->scope;
3283-
ce_is_instanceof = (ce->ce_flags & ZEND_ACC_FINAL) != 0;
3283+
ce_is_instanceof = !(ce->ce_flags & ZEND_ACC_FINAL);
32843284
op1_addr = 0;
32853285
on_this = 1;
32863286
} else {
@@ -3783,7 +3783,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
37833783
op1_info = MAY_BE_OBJECT|MAY_BE_RC1|MAY_BE_RCN;
37843784
op1_addr = 0;
37853785
ce = op_array->scope;
3786-
ce_is_instanceof = (ce->ce_flags & ZEND_ACC_FINAL) != 0;
3786+
ce_is_instanceof = !(ce->ce_flags & ZEND_ACC_FINAL);
37873787
on_this = 1;
37883788
} else {
37893789
op1_info = OP1_INFO();
@@ -3934,7 +3934,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
39343934
op1_info = MAY_BE_OBJECT|MAY_BE_RC1|MAY_BE_RCN;
39353935
op1_addr = 0;
39363936
ce = op_array->scope;
3937-
ce_is_instanceof = (ce->ce_flags & ZEND_ACC_FINAL) != 0;
3937+
ce_is_instanceof = !(ce->ce_flags & ZEND_ACC_FINAL);
39383938
on_this = 1;
39393939
} else {
39403940
op1_info = OP1_INFO();

ext/opcache/jit/zend_jit_trace.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -4652,7 +4652,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
46524652
if (opline->op1_type == IS_UNUSED) {
46534653
op1_info = MAY_BE_OBJECT|MAY_BE_RC1|MAY_BE_RCN;
46544654
ce = op_array->scope;
4655-
ce_is_instanceof = (ce->ce_flags & ZEND_ACC_FINAL) != 0;
4655+
ce_is_instanceof = !(ce->ce_flags & ZEND_ACC_FINAL);
46564656
op1_addr = 0;
46574657
on_this = 1;
46584658
} else {
@@ -4743,7 +4743,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
47434743
if (opline->op1_type == IS_UNUSED) {
47444744
op1_info = MAY_BE_OBJECT|MAY_BE_RC1|MAY_BE_RCN;
47454745
ce = op_array->scope;
4746-
ce_is_instanceof = (ce->ce_flags & ZEND_ACC_FINAL) != 0;
4746+
ce_is_instanceof = !(ce->ce_flags & ZEND_ACC_FINAL);
47474747
op1_addr = 0;
47484748
on_this = 1;
47494749
} else {
@@ -4823,7 +4823,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
48234823
if (opline->op1_type == IS_UNUSED) {
48244824
op1_info = MAY_BE_OBJECT|MAY_BE_RC1|MAY_BE_RCN;
48254825
ce = op_array->scope;
4826-
ce_is_instanceof = (ce->ce_flags & ZEND_ACC_FINAL) != 0;
4826+
ce_is_instanceof = !(ce->ce_flags & ZEND_ACC_FINAL);
48274827
op1_addr = 0;
48284828
on_this = 1;
48294829
} else {
@@ -5843,7 +5843,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
58435843
if (opline->op1_type == IS_UNUSED) {
58445844
op1_info = MAY_BE_OBJECT|MAY_BE_RC1|MAY_BE_RCN;
58455845
ce = op_array->scope;
5846-
ce_is_instanceof = (ce->ce_flags & ZEND_ACC_FINAL) != 0;
5846+
ce_is_instanceof = !(ce->ce_flags & ZEND_ACC_FINAL);
58475847
op1_addr = 0;
58485848
on_this = 1;
58495849
} else {
@@ -6122,7 +6122,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
61226122
if (opline->op1_type == IS_UNUSED) {
61236123
op1_info = MAY_BE_OBJECT|MAY_BE_RC1|MAY_BE_RCN;
61246124
ce = op_array->scope;
6125-
ce_is_instanceof = (ce->ce_flags & ZEND_ACC_FINAL) != 0;
6125+
ce_is_instanceof = !(ce->ce_flags & ZEND_ACC_FINAL);
61266126
op1_addr = 0;
61276127
on_this = 1;
61286128
} else {
+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
--TEST--
2+
JIT ASSIGN_OBJ: Typed & not-typed property
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.file_update_protection=0
7+
opcache.jit_buffer_size=1M
8+
--FILE--
9+
<?php
10+
interface I {
11+
}
12+
abstract class C1 implements I {
13+
public function __construct($x) {
14+
$this->x = $x;
15+
}
16+
}
17+
class C2 extends C1 {
18+
public $x = 0;
19+
}
20+
class C3 extends C1 {
21+
public int $x = 0;
22+
}
23+
$o = new C2("abcd");
24+
var_dump($o->x);
25+
$o = new C3(42);
26+
var_dump($o->x);
27+
$o = new C3("abcd");
28+
var_dump($o->x);
29+
?>
30+
--EXPECTF--
31+
string(4) "abcd"
32+
int(42)
33+
34+
Fatal error: Uncaught TypeError: Cannot assign string to property C3::$x of type int in %sassign_obj_005.php:6
35+
Stack trace:
36+
#0 %sassign_obj_005.php(19): C1->__construct('abcd')
37+
#1 {main}
38+
thrown in %sassign_obj_005.php on line 6

0 commit comments

Comments
 (0)