Skip to content

Commit 502002a

Browse files
committed
Replacel constant JMPZ/NZ/ZNZ by JMP or NOP
1 parent 3253e61 commit 502002a

File tree

1 file changed

+34
-0
lines changed

1 file changed

+34
-0
lines changed

ext/opcache/Optimizer/zend_optimizer.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,41 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array,
256256
zend_op *opline,
257257
zval *val)
258258
{
259+
zend_op *target_opline;
260+
259261
switch (opline->opcode) {
262+
case ZEND_JMPZ:
263+
if (zend_is_true(val)) {
264+
MAKE_NOP(opline);
265+
} else {
266+
opline->opcode = ZEND_JMP;
267+
COPY_NODE(opline->op1, opline->op2);
268+
opline->op2_type = IS_UNUSED;
269+
}
270+
zval_ptr_dtor_nogc(val);
271+
return 1;
272+
case ZEND_JMPNZ:
273+
if (zend_is_true(val)) {
274+
opline->opcode = ZEND_JMP;
275+
COPY_NODE(opline->op1, opline->op2);
276+
opline->op2_type = IS_UNUSED;
277+
} else {
278+
MAKE_NOP(opline);
279+
}
280+
zval_ptr_dtor_nogc(val);
281+
return 1;
282+
case ZEND_JMPZNZ:
283+
if (zend_is_true(val)) {
284+
target_opline = ZEND_OFFSET_TO_OPLINE(opline, opline->extended_value);
285+
} else {
286+
target_opline = ZEND_OP2_JMP_ADDR(opline);
287+
}
288+
ZEND_SET_OP_JMP_ADDR(opline, opline->op1, target_opline);
289+
opline->op1_type = IS_UNUSED;
290+
opline->extended_value = 0;
291+
opline->opcode = ZEND_JMP;
292+
zval_ptr_dtor_nogc(val);
293+
return 1;
260294
case ZEND_FREE:
261295
MAKE_NOP(opline);
262296
zval_ptr_dtor_nogc(val);

0 commit comments

Comments
 (0)