@@ -216,9 +216,22 @@ ZEND_VM_HANDLER(6, ZEND_SL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
216
216
zend_free_op free_op1 , free_op2 ;
217
217
zval * op1 , * op2 ;
218
218
219
+ op1 = GET_OP1_ZVAL_PTR_UNDEF (BP_VAR_R );
220
+ op2 = GET_OP2_ZVAL_PTR_UNDEF (BP_VAR_R );
221
+ if (EXPECTED (Z_TYPE_INFO_P (op1 ) == IS_LONG )
222
+ && EXPECTED (Z_TYPE_INFO_P (op2 ) == IS_LONG )
223
+ && EXPECTED ((zend_ulong )Z_LVAL_P (op2 ) < SIZEOF_ZEND_LONG * 8 )) {
224
+ ZVAL_LONG (EX_VAR (opline -> result .var ), Z_LVAL_P (op1 ) << Z_LVAL_P (op2 ));
225
+ ZEND_VM_NEXT_OPCODE ();
226
+ }
227
+
219
228
SAVE_OPLINE ();
220
- op1 = GET_OP1_ZVAL_PTR (BP_VAR_R );
221
- op2 = GET_OP2_ZVAL_PTR (BP_VAR_R );
229
+ if (OP1_TYPE == IS_CV && UNEXPECTED (Z_TYPE_INFO_P (op1 ) == IS_UNDEF )) {
230
+ op1 = GET_OP1_UNDEF_CV (op1 , BP_VAR_R );
231
+ }
232
+ if (OP2_TYPE == IS_CV && UNEXPECTED (Z_TYPE_INFO_P (op2 ) == IS_UNDEF )) {
233
+ op2 = GET_OP2_UNDEF_CV (op2 , BP_VAR_R );
234
+ }
222
235
shift_left_function (EX_VAR (opline -> result .var ), op1 , op2 );
223
236
FREE_OP1 ();
224
237
FREE_OP2 ();
@@ -231,9 +244,22 @@ ZEND_VM_HANDLER(7, ZEND_SR, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
231
244
zend_free_op free_op1 , free_op2 ;
232
245
zval * op1 , * op2 ;
233
246
247
+ op1 = GET_OP1_ZVAL_PTR_UNDEF (BP_VAR_R );
248
+ op2 = GET_OP2_ZVAL_PTR_UNDEF (BP_VAR_R );
249
+ if (EXPECTED (Z_TYPE_INFO_P (op1 ) == IS_LONG )
250
+ && EXPECTED (Z_TYPE_INFO_P (op2 ) == IS_LONG )
251
+ && EXPECTED ((zend_ulong )Z_LVAL_P (op2 ) < SIZEOF_ZEND_LONG * 8 )) {
252
+ ZVAL_LONG (EX_VAR (opline -> result .var ), Z_LVAL_P (op1 ) >> Z_LVAL_P (op2 ));
253
+ ZEND_VM_NEXT_OPCODE ();
254
+ }
255
+
234
256
SAVE_OPLINE ();
235
- op1 = GET_OP1_ZVAL_PTR (BP_VAR_R );
236
- op2 = GET_OP2_ZVAL_PTR (BP_VAR_R );
257
+ if (OP1_TYPE == IS_CV && UNEXPECTED (Z_TYPE_INFO_P (op1 ) == IS_UNDEF )) {
258
+ op1 = GET_OP1_UNDEF_CV (op1 , BP_VAR_R );
259
+ }
260
+ if (OP2_TYPE == IS_CV && UNEXPECTED (Z_TYPE_INFO_P (op2 ) == IS_UNDEF )) {
261
+ op2 = GET_OP2_UNDEF_CV (op2 , BP_VAR_R );
262
+ }
237
263
shift_right_function (EX_VAR (opline -> result .var ), op1 , op2 );
238
264
FREE_OP1 ();
239
265
FREE_OP2 ();
@@ -608,9 +634,21 @@ ZEND_VM_HANDLER(9, ZEND_BW_OR, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
608
634
zend_free_op free_op1 , free_op2 ;
609
635
zval * op1 , * op2 ;
610
636
637
+ op1 = GET_OP1_ZVAL_PTR_UNDEF (BP_VAR_R );
638
+ op2 = GET_OP2_ZVAL_PTR_UNDEF (BP_VAR_R );
639
+ if (EXPECTED (Z_TYPE_INFO_P (op1 ) == IS_LONG )
640
+ && EXPECTED (Z_TYPE_INFO_P (op2 ) == IS_LONG )) {
641
+ ZVAL_LONG (EX_VAR (opline -> result .var ), Z_LVAL_P (op1 ) | Z_LVAL_P (op2 ));
642
+ ZEND_VM_NEXT_OPCODE ();
643
+ }
644
+
611
645
SAVE_OPLINE ();
612
- op1 = GET_OP1_ZVAL_PTR (BP_VAR_R );
613
- op2 = GET_OP2_ZVAL_PTR (BP_VAR_R );
646
+ if (OP1_TYPE == IS_CV && UNEXPECTED (Z_TYPE_INFO_P (op1 ) == IS_UNDEF )) {
647
+ op1 = GET_OP1_UNDEF_CV (op1 , BP_VAR_R );
648
+ }
649
+ if (OP2_TYPE == IS_CV && UNEXPECTED (Z_TYPE_INFO_P (op2 ) == IS_UNDEF )) {
650
+ op2 = GET_OP2_UNDEF_CV (op2 , BP_VAR_R );
651
+ }
614
652
bitwise_or_function (EX_VAR (opline -> result .var ), op1 , op2 );
615
653
FREE_OP1 ();
616
654
FREE_OP2 ();
@@ -623,9 +661,21 @@ ZEND_VM_HANDLER(10, ZEND_BW_AND, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
623
661
zend_free_op free_op1 , free_op2 ;
624
662
zval * op1 , * op2 ;
625
663
664
+ op1 = GET_OP1_ZVAL_PTR_UNDEF (BP_VAR_R );
665
+ op2 = GET_OP2_ZVAL_PTR_UNDEF (BP_VAR_R );
666
+ if (EXPECTED (Z_TYPE_INFO_P (op1 ) == IS_LONG )
667
+ && EXPECTED (Z_TYPE_INFO_P (op2 ) == IS_LONG )) {
668
+ ZVAL_LONG (EX_VAR (opline -> result .var ), Z_LVAL_P (op1 ) & Z_LVAL_P (op2 ));
669
+ ZEND_VM_NEXT_OPCODE ();
670
+ }
671
+
626
672
SAVE_OPLINE ();
627
- op1 = GET_OP1_ZVAL_PTR (BP_VAR_R );
628
- op2 = GET_OP2_ZVAL_PTR (BP_VAR_R );
673
+ if (OP1_TYPE == IS_CV && UNEXPECTED (Z_TYPE_INFO_P (op1 ) == IS_UNDEF )) {
674
+ op1 = GET_OP1_UNDEF_CV (op1 , BP_VAR_R );
675
+ }
676
+ if (OP2_TYPE == IS_CV && UNEXPECTED (Z_TYPE_INFO_P (op2 ) == IS_UNDEF )) {
677
+ op2 = GET_OP2_UNDEF_CV (op2 , BP_VAR_R );
678
+ }
629
679
bitwise_and_function (EX_VAR (opline -> result .var ), op1 , op2 );
630
680
FREE_OP1 ();
631
681
FREE_OP2 ();
@@ -638,9 +688,21 @@ ZEND_VM_HANDLER(11, ZEND_BW_XOR, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
638
688
zend_free_op free_op1 , free_op2 ;
639
689
zval * op1 , * op2 ;
640
690
691
+ op1 = GET_OP1_ZVAL_PTR_UNDEF (BP_VAR_R );
692
+ op2 = GET_OP2_ZVAL_PTR_UNDEF (BP_VAR_R );
693
+ if (EXPECTED (Z_TYPE_INFO_P (op1 ) == IS_LONG )
694
+ && EXPECTED (Z_TYPE_INFO_P (op2 ) == IS_LONG )) {
695
+ ZVAL_LONG (EX_VAR (opline -> result .var ), Z_LVAL_P (op1 ) ^ Z_LVAL_P (op2 ));
696
+ ZEND_VM_NEXT_OPCODE ();
697
+ }
698
+
641
699
SAVE_OPLINE ();
642
- op1 = GET_OP1_ZVAL_PTR (BP_VAR_R );
643
- op2 = GET_OP2_ZVAL_PTR (BP_VAR_R );
700
+ if (OP1_TYPE == IS_CV && UNEXPECTED (Z_TYPE_INFO_P (op1 ) == IS_UNDEF )) {
701
+ op1 = GET_OP1_UNDEF_CV (op1 , BP_VAR_R );
702
+ }
703
+ if (OP2_TYPE == IS_CV && UNEXPECTED (Z_TYPE_INFO_P (op2 ) == IS_UNDEF )) {
704
+ op2 = GET_OP2_UNDEF_CV (op2 , BP_VAR_R );
705
+ }
644
706
bitwise_xor_function (EX_VAR (opline -> result .var ), op1 , op2 );
645
707
FREE_OP1 ();
646
708
FREE_OP2 ();
0 commit comments