@@ -4507,7 +4507,9 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CONST_CON
4507
4507
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
4508
4508
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
4509
4509
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
4510
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) << Z_LVAL_P(op2));
4510
+ /* Perform shift on unsigned numbers to get well-defined wrap behavior. */
4511
+ ZVAL_LONG(EX_VAR(opline->result.var),
4512
+ (zend_long) ((zend_ulong) Z_LVAL_P(op1) << Z_LVAL_P(op2)));
4511
4513
ZEND_VM_NEXT_OPCODE();
4512
4514
}
4513
4515
@@ -6821,7 +6823,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CONST_TMPVAR_HANDLER(Z
6821
6823
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
6822
6824
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
6823
6825
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
6824
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) << Z_LVAL_P(op2));
6826
+ /* Perform shift on unsigned numbers to get well-defined wrap behavior. */
6827
+ ZVAL_LONG(EX_VAR(opline->result.var),
6828
+ (zend_long) ((zend_ulong) Z_LVAL_P(op1) << Z_LVAL_P(op2)));
6825
6829
ZEND_VM_NEXT_OPCODE();
6826
6830
}
6827
6831
@@ -9471,7 +9475,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CONST_CV_HANDLER(ZEND_
9471
9475
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
9472
9476
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
9473
9477
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
9474
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) << Z_LVAL_P(op2));
9478
+ /* Perform shift on unsigned numbers to get well-defined wrap behavior. */
9479
+ ZVAL_LONG(EX_VAR(opline->result.var),
9480
+ (zend_long) ((zend_ulong) Z_LVAL_P(op1) << Z_LVAL_P(op2)));
9475
9481
ZEND_VM_NEXT_OPCODE();
9476
9482
}
9477
9483
@@ -12926,7 +12932,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_TMPVAR_CONST_HANDLER(Z
12926
12932
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
12927
12933
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
12928
12934
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
12929
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) << Z_LVAL_P(op2));
12935
+ /* Perform shift on unsigned numbers to get well-defined wrap behavior. */
12936
+ ZVAL_LONG(EX_VAR(opline->result.var),
12937
+ (zend_long) ((zend_ulong) Z_LVAL_P(op1) << Z_LVAL_P(op2)));
12930
12938
ZEND_VM_NEXT_OPCODE();
12931
12939
}
12932
12940
@@ -14510,7 +14518,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_TMPVAR_TMPVAR_HANDLER(
14510
14518
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
14511
14519
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
14512
14520
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
14513
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) << Z_LVAL_P(op2));
14521
+ /* Perform shift on unsigned numbers to get well-defined wrap behavior. */
14522
+ ZVAL_LONG(EX_VAR(opline->result.var),
14523
+ (zend_long) ((zend_ulong) Z_LVAL_P(op1) << Z_LVAL_P(op2)));
14514
14524
ZEND_VM_NEXT_OPCODE();
14515
14525
}
14516
14526
@@ -16214,7 +16224,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_TMPVAR_CV_HANDLER(ZEND
16214
16224
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
16215
16225
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
16216
16226
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
16217
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) << Z_LVAL_P(op2));
16227
+ /* Perform shift on unsigned numbers to get well-defined wrap behavior. */
16228
+ ZVAL_LONG(EX_VAR(opline->result.var),
16229
+ (zend_long) ((zend_ulong) Z_LVAL_P(op1) << Z_LVAL_P(op2)));
16218
16230
ZEND_VM_NEXT_OPCODE();
16219
16231
}
16220
16232
@@ -38589,7 +38601,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CV_CONST_HANDLER(ZEND_
38589
38601
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
38590
38602
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
38591
38603
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
38592
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) << Z_LVAL_P(op2));
38604
+ /* Perform shift on unsigned numbers to get well-defined wrap behavior. */
38605
+ ZVAL_LONG(EX_VAR(opline->result.var),
38606
+ (zend_long) ((zend_ulong) Z_LVAL_P(op1) << Z_LVAL_P(op2)));
38593
38607
ZEND_VM_NEXT_OPCODE();
38594
38608
}
38595
38609
@@ -42459,7 +42473,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CV_TMPVAR_HANDLER(ZEND
42459
42473
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
42460
42474
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
42461
42475
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
42462
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) << Z_LVAL_P(op2));
42476
+ /* Perform shift on unsigned numbers to get well-defined wrap behavior. */
42477
+ ZVAL_LONG(EX_VAR(opline->result.var),
42478
+ (zend_long) ((zend_ulong) Z_LVAL_P(op1) << Z_LVAL_P(op2)));
42463
42479
ZEND_VM_NEXT_OPCODE();
42464
42480
}
42465
42481
@@ -47894,7 +47910,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SL_SPEC_CV_CV_HANDLER(ZEND_OPC
47894
47910
if (EXPECTED(Z_TYPE_INFO_P(op1) == IS_LONG)
47895
47911
&& EXPECTED(Z_TYPE_INFO_P(op2) == IS_LONG)
47896
47912
&& EXPECTED((zend_ulong)Z_LVAL_P(op2) < SIZEOF_ZEND_LONG * 8)) {
47897
- ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(op1) << Z_LVAL_P(op2));
47913
+ /* Perform shift on unsigned numbers to get well-defined wrap behavior. */
47914
+ ZVAL_LONG(EX_VAR(opline->result.var),
47915
+ (zend_long) ((zend_ulong) Z_LVAL_P(op1) << Z_LVAL_P(op2)));
47898
47916
ZEND_VM_NEXT_OPCODE();
47899
47917
}
47900
47918
0 commit comments