Skip to content

Commit ef1dfbb

Browse files
committed
Speed up ZEND_IS_IDENTICAL when it can't throw
Add a specialized opcode handler to use for `===`/`!==` when: 1. At least one side is a $cv, and the other is a $cv or CONST (avoids the need to free operands) 2. Neither operand can be undefined or a reference (avoids the need for error handling and dereferencing) ``` // Elapsed time decreased from 0.275 seconds to 0.243 seconds in combination // with PR php#4982 function count_same(array $values) { $same = 0; foreach ($values as $x) { foreach ($values as $y) { if ($y === $x) { $same++; } } } return $same; } $values = range(0, 5000); $values[] = new stdClass(); $values[] = null; $values[] = 3; $start = microtime(true); $total = count_same($values); ```
1 parent 2ede8db commit ef1dfbb

File tree

3 files changed

+381
-250
lines changed

3 files changed

+381
-250
lines changed

Zend/zend_vm_def.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8751,6 +8751,35 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_NOT_EQUAL|ZEND_IS_NOT_IDENTICAL, (op1_info
87518751
ZEND_VM_SMART_BRANCH(result, 0);
87528752
}
87538753

8754+
ZEND_VM_TYPE_SPEC_HANDLER(ZEND_IS_IDENTICAL, op->op1_type == IS_CV && (op->op2_type & (IS_CONST|IS_CV)) && !(op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_REF)), ZEND_IS_IDENTICAL_NOTHROW, CV, CONST|CV, SPEC(COMMUTATIVE))
8755+
{
8756+
/* This is declared below the specializations for MAY_BE_LONG/MAY_BE_DOUBLE so those will be used instead if possible. */
8757+
/* This optimizes $x === SOME_CONST_EXPR and $x === $y for non-refs and non-undef, which can't throw. */
8758+
/* (Infinite recursion when comparing arrays is an uncatchable fatal error) */
8759+
USE_OPLINE
8760+
zval *op1, *op2;
8761+
zend_bool result;
8762+
8763+
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
8764+
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
8765+
result = fast_is_identical_function(op1, op2);
8766+
/* Free is a no-op for const/cv */
8767+
ZEND_VM_SMART_BRANCH(result, 0);
8768+
}
8769+
8770+
ZEND_VM_TYPE_SPEC_HANDLER(ZEND_IS_NOT_IDENTICAL, op->op1_type == IS_CV && (op->op2_type & (IS_CONST|IS_CV)) && !(op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_REF)), ZEND_IS_NOT_IDENTICAL_NOTHROW, CV, CONST|CV, SPEC(COMMUTATIVE))
8771+
{
8772+
USE_OPLINE
8773+
zval *op1, *op2;
8774+
zend_bool result;
8775+
8776+
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
8777+
op2 = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
8778+
result = fast_is_identical_function(op1, op2);
8779+
/* Free is a no-op for const/cv */
8780+
ZEND_VM_SMART_BRANCH(!result, 0);
8781+
}
8782+
87548783
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_IS_SMALLER, (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG), ZEND_IS_SMALLER_LONG, CONST|TMPVARCV, CONST|TMPVARCV, SPEC(SMART_BRANCH,NO_CONST_CONST))
87558784
{
87568785
USE_OPLINE

Zend/zend_vm_execute.h

Lines changed: 120 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -40040,6 +40040,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_CV_CONST_HANDLER
4004040040
ZEND_VM_SMART_BRANCH(result, 1);
4004140041
}
4004240042

40043+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
40044+
{
40045+
/* This is declared below the specializations for MAY_BE_LONG/MAY_BE_DOUBLE so those will be used instead if possible. */
40046+
/* This optimizes $x === SOME_CONST_EXPR and $x === $y for non-refs and non-undef, which can't throw. */
40047+
/* (Infinite recursion when comparing arrays is an uncatchable fatal error) */
40048+
USE_OPLINE
40049+
zval *op1, *op2;
40050+
zend_bool result;
40051+
40052+
op1 = EX_VAR(opline->op1.var);
40053+
op2 = RT_CONSTANT(opline, opline->op2);
40054+
result = fast_is_identical_function(op1, op2);
40055+
/* Free is a no-op for const/cv */
40056+
ZEND_VM_SMART_BRANCH(result, 0);
40057+
}
40058+
40059+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
40060+
{
40061+
USE_OPLINE
40062+
zval *op1, *op2;
40063+
zend_bool result;
40064+
40065+
op1 = EX_VAR(opline->op1.var);
40066+
op2 = RT_CONSTANT(opline, opline->op2);
40067+
result = fast_is_identical_function(op1, op2);
40068+
/* Free is a no-op for const/cv */
40069+
ZEND_VM_SMART_BRANCH(!result, 0);
40070+
}
40071+
4004340072
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4004440073
{
4004540074
USE_OPLINE
@@ -48119,6 +48148,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_
4811948148
ZEND_VM_RETURN();
4812048149
}
4812148150

48151+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
48152+
{
48153+
/* This is declared below the specializations for MAY_BE_LONG/MAY_BE_DOUBLE so those will be used instead if possible. */
48154+
/* This optimizes $x === SOME_CONST_EXPR and $x === $y for non-refs and non-undef, which can't throw. */
48155+
/* (Infinite recursion when comparing arrays is an uncatchable fatal error) */
48156+
USE_OPLINE
48157+
zval *op1, *op2;
48158+
zend_bool result;
48159+
48160+
op1 = EX_VAR(opline->op1.var);
48161+
op2 = EX_VAR(opline->op2.var);
48162+
result = fast_is_identical_function(op1, op2);
48163+
/* Free is a no-op for const/cv */
48164+
ZEND_VM_SMART_BRANCH(result, 0);
48165+
}
48166+
48167+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
48168+
{
48169+
USE_OPLINE
48170+
zval *op1, *op2;
48171+
zend_bool result;
48172+
48173+
op1 = EX_VAR(opline->op1.var);
48174+
op2 = EX_VAR(opline->op2.var);
48175+
result = fast_is_identical_function(op1, op2);
48176+
/* Free is a no-op for const/cv */
48177+
ZEND_VM_SMART_BRANCH(!result, 0);
48178+
}
48179+
4812248180
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4812348181
{
4812448182
USE_OPLINE
@@ -50998,6 +51056,16 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5099851056
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_LABEL,
5099951057
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_LABEL,
5100051058
(void*)&&ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_LABEL,
51059+
(void*)&&ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST_LABEL,
51060+
(void*)&&ZEND_NULL_LABEL,
51061+
(void*)&&ZEND_NULL_LABEL,
51062+
(void*)&&ZEND_NULL_LABEL,
51063+
(void*)&&ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV_LABEL,
51064+
(void*)&&ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST_LABEL,
51065+
(void*)&&ZEND_NULL_LABEL,
51066+
(void*)&&ZEND_NULL_LABEL,
51067+
(void*)&&ZEND_NULL_LABEL,
51068+
(void*)&&ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV_LABEL,
5100151069
(void*)&&ZEND_NULL_LABEL,
5100251070
(void*)&&ZEND_NULL_LABEL,
5100351071
(void*)&&ZEND_NULL_LABEL,
@@ -55003,6 +55071,14 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5500355071
VM_TRACE(ZEND_IN_ARRAY_SPEC_CV_CONST)
5500455072
ZEND_IN_ARRAY_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
5500555073
HYBRID_BREAK();
55074+
HYBRID_CASE(ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST):
55075+
VM_TRACE(ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST)
55076+
ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
55077+
HYBRID_BREAK();
55078+
HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST):
55079+
VM_TRACE(ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST)
55080+
ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
55081+
HYBRID_BREAK();
5500655082
HYBRID_CASE(ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST):
5500755083
VM_TRACE(ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST)
5500855084
ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -55575,6 +55651,14 @@ ZEND_API void execute_ex(zend_execute_data *ex)
5557555651
VM_TRACE(ZEND_YIELD_SPEC_CV_CV)
5557655652
ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
5557755653
HYBRID_BREAK();
55654+
HYBRID_CASE(ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV):
55655+
VM_TRACE(ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV)
55656+
ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
55657+
HYBRID_BREAK();
55658+
HYBRID_CASE(ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV):
55659+
VM_TRACE(ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV)
55660+
ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
55661+
HYBRID_BREAK();
5557855662
HYBRID_CASE(HYBRID_HALT):
5557955663
#ifdef ZEND_VM_FP_GLOBAL_REG
5558055664
execute_data = orig_execute_data;
@@ -58486,6 +58570,16 @@ void zend_vm_init(void)
5848658570
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_HANDLER,
5848758571
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ_HANDLER,
5848858572
ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ_HANDLER,
58573+
ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST_HANDLER,
58574+
ZEND_NULL_HANDLER,
58575+
ZEND_NULL_HANDLER,
58576+
ZEND_NULL_HANDLER,
58577+
ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV_HANDLER,
58578+
ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST_HANDLER,
58579+
ZEND_NULL_HANDLER,
58580+
ZEND_NULL_HANDLER,
58581+
ZEND_NULL_HANDLER,
58582+
ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV_HANDLER,
5848958583
ZEND_NULL_HANDLER,
5849058584
ZEND_NULL_HANDLER,
5849158585
ZEND_NULL_HANDLER,
@@ -59050,7 +59144,7 @@ void zend_vm_init(void)
5905059144
2280,
5905159145
2281 | SPEC_RULE_OP1,
5905259146
2286 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
59053-
3203
59147+
3213
5905459148
};
5905559149
#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
5905659150
zend_opcode_handler_funcs = labels;
@@ -59285,6 +59379,8 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
5928559379
break;
5928659380
}
5928759381
spec = 2612 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
59382+
} else if (op->op1_type == IS_CV && (op->op2_type & (IS_CONST|IS_CV)) && !(op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_REF))) {
59383+
spec = 2837 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
5928859384
}
5928959385
break;
5929059386
case ZEND_IS_NOT_IDENTICAL:
@@ -59301,6 +59397,8 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
5930159397
break;
5930259398
}
5930359399
spec = 2762 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
59400+
} else if (op->op1_type == IS_CV && (op->op2_type & (IS_CONST|IS_CV)) && !(op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_REF))) {
59401+
spec = 2842 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
5930459402
}
5930559403
break;
5930659404
case ZEND_IS_EQUAL:
@@ -59340,62 +59438,62 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
5934059438
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
5934159439
break;
5934259440
}
59343-
spec = 2837 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
59441+
spec = 2847 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
5934459442
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
5934559443
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
5934659444
break;
5934759445
}
59348-
spec = 2912 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
59446+
spec = 2922 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
5934959447
}
5935059448
break;
5935159449
case ZEND_IS_SMALLER_OR_EQUAL:
5935259450
if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
5935359451
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
5935459452
break;
5935559453
}
59356-
spec = 2987 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
59454+
spec = 2997 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
5935759455
} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
5935859456
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
5935959457
break;
5936059458
}
59361-
spec = 3062 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
59459+
spec = 3072 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
5936259460
}
5936359461
break;
5936459462
case ZEND_QM_ASSIGN:
5936559463
if (op1_info == MAY_BE_LONG) {
59366-
spec = 3149 | SPEC_RULE_OP1;
59464+
spec = 3159 | SPEC_RULE_OP1;
5936759465
} else if (op1_info == MAY_BE_DOUBLE) {
59368-
spec = 3154 | SPEC_RULE_OP1;
59466+
spec = 3164 | SPEC_RULE_OP1;
5936959467
} else if ((op->op1_type == IS_CONST) ? !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1)) : (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE))))) {
59370-
spec = 3159 | SPEC_RULE_OP1;
59468+
spec = 3169 | SPEC_RULE_OP1;
5937159469
}
5937259470
break;
5937359471
case ZEND_PRE_INC:
5937459472
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
59375-
spec = 3137 | SPEC_RULE_RETVAL;
59473+
spec = 3147 | SPEC_RULE_RETVAL;
5937659474
} else if (op1_info == MAY_BE_LONG) {
59377-
spec = 3139 | SPEC_RULE_RETVAL;
59475+
spec = 3149 | SPEC_RULE_RETVAL;
5937859476
}
5937959477
break;
5938059478
case ZEND_PRE_DEC:
5938159479
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
59382-
spec = 3141 | SPEC_RULE_RETVAL;
59480+
spec = 3151 | SPEC_RULE_RETVAL;
5938359481
} else if (op1_info == MAY_BE_LONG) {
59384-
spec = 3143 | SPEC_RULE_RETVAL;
59482+
spec = 3153 | SPEC_RULE_RETVAL;
5938559483
}
5938659484
break;
5938759485
case ZEND_POST_INC:
5938859486
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
59389-
spec = 3145;
59487+
spec = 3155;
5939059488
} else if (op1_info == MAY_BE_LONG) {
59391-
spec = 3146;
59489+
spec = 3156;
5939259490
}
5939359491
break;
5939459492
case ZEND_POST_DEC:
5939559493
if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
59396-
spec = 3147;
59494+
spec = 3157;
5939759495
} else if (op1_info == MAY_BE_LONG) {
59398-
spec = 3148;
59496+
spec = 3158;
5939959497
}
5940059498
break;
5940159499
case ZEND_JMP:
@@ -59405,35 +59503,35 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
5940559503
break;
5940659504
case ZEND_SEND_VAL:
5940759505
if (op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) {
59408-
spec = 3199;
59506+
spec = 3209;
5940959507
}
5941059508
break;
5941159509
case ZEND_SEND_VAR_EX:
5941259510
if (op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
59413-
spec = 3194 | SPEC_RULE_OP1;
59511+
spec = 3204 | SPEC_RULE_OP1;
5941459512
}
5941559513
break;
5941659514
case ZEND_FE_FETCH_R:
5941759515
if (op->op2_type == IS_CV && (op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY) {
59418-
spec = 3201 | SPEC_RULE_RETVAL;
59516+
spec = 3211 | SPEC_RULE_RETVAL;
5941959517
}
5942059518
break;
5942159519
case ZEND_FETCH_DIM_R:
5942259520
if (!(op2_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) {
5942359521
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
5942459522
break;
5942559523
}
59426-
spec = 3164 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
59524+
spec = 3174 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
5942759525
}
5942859526
break;
5942959527
case ZEND_SEND_VAL_EX:
5943059528
if (op->op2.num <= MAX_ARG_FLAG_NUM && op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) {
59431-
spec = 3200;
59529+
spec = 3210;
5943259530
}
5943359531
break;
5943459532
case ZEND_SEND_VAR:
5943559533
if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
59436-
spec = 3189 | SPEC_RULE_OP1;
59534+
spec = 3199 | SPEC_RULE_OP1;
5943759535
}
5943859536
break;
5943959537
case ZEND_BW_OR:

0 commit comments

Comments
 (0)