Skip to content

Commit 53b3ef5

Browse files
committed
Merge branch 'PHP-7.1'
2 parents 9c7ba79 + b4213f0 commit 53b3ef5

File tree

2 files changed

+700
-80
lines changed

2 files changed

+700
-80
lines changed

Zend/zend_vm_def.h

Lines changed: 72 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -216,9 +216,22 @@ ZEND_VM_HANDLER(6, ZEND_SL, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
216216
zend_free_op free_op1, free_op2;
217217
zval *op1, *op2;
218218

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+
219228
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+
}
222235
shift_left_function(EX_VAR(opline->result.var), op1, op2);
223236
FREE_OP1();
224237
FREE_OP2();
@@ -231,9 +244,22 @@ ZEND_VM_HANDLER(7, ZEND_SR, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
231244
zend_free_op free_op1, free_op2;
232245
zval *op1, *op2;
233246

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+
234256
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+
}
237263
shift_right_function(EX_VAR(opline->result.var), op1, op2);
238264
FREE_OP1();
239265
FREE_OP2();
@@ -608,9 +634,21 @@ ZEND_VM_HANDLER(9, ZEND_BW_OR, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
608634
zend_free_op free_op1, free_op2;
609635
zval *op1, *op2;
610636

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+
611645
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+
}
614652
bitwise_or_function(EX_VAR(opline->result.var), op1, op2);
615653
FREE_OP1();
616654
FREE_OP2();
@@ -623,9 +661,21 @@ ZEND_VM_HANDLER(10, ZEND_BW_AND, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
623661
zend_free_op free_op1, free_op2;
624662
zval *op1, *op2;
625663

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+
626672
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+
}
629679
bitwise_and_function(EX_VAR(opline->result.var), op1, op2);
630680
FREE_OP1();
631681
FREE_OP2();
@@ -638,9 +688,21 @@ ZEND_VM_HANDLER(11, ZEND_BW_XOR, CONST|TMPVAR|CV, CONST|TMPVAR|CV)
638688
zend_free_op free_op1, free_op2;
639689
zval *op1, *op2;
640690

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+
641699
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+
}
644706
bitwise_xor_function(EX_VAR(opline->result.var), op1, op2);
645707
FREE_OP1();
646708
FREE_OP2();

0 commit comments

Comments
 (0)