From: Nikita Popov Date: Fri, 22 May 2015 20:31:02 +0000 (+0200) Subject: Remove ZEND_BRK/ZEND_CONT from VM X-Git-Tag: PRE_PHP7_NSAPI_REMOVAL~36^2~7 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8542befa7b4338a26464acf4e1d224bd71b9d5e6;p=php Remove ZEND_BRK/ZEND_CONT from VM These are no longer used at run-time now, only temporarily during compilation. --- diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 3c3569b9f0..3f9098c314 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -949,6 +949,11 @@ static zend_always_inline int zend_check_arg_send_type(const zend_function *zf, #define ZEND_ARRAY_NOT_PACKED (1<<1) #define ZEND_ARRAY_SIZE_SHIFT 2 +/* Pseudo-opcodes that are used only temporarily during compilation */ +#define ZEND_BRK 254 +#define ZEND_CONT 255 + + END_EXTERN_C() #define ZEND_CLONE_FUNC_NAME "__clone" diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index f63a41e515..d3ca96819d 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -4816,28 +4816,6 @@ ZEND_VM_HANDLER(52, ZEND_BOOL, CONST|TMPVAR|CV, ANY) ZEND_VM_NEXT_OPCODE(); } -ZEND_VM_HANDLER(50, ZEND_BRK, ANY, ANY) -{ - USE_OPLINE - zend_brk_cont_element *el; - - SAVE_OPLINE(); - el = zend_brk_cont(opline->op2.num, opline->op1.num, - &EX(func)->op_array, execute_data); - ZEND_VM_JMP(EX(func)->op_array.opcodes + el->brk); -} - -ZEND_VM_HANDLER(51, ZEND_CONT, ANY, ANY) -{ - USE_OPLINE - zend_brk_cont_element *el; - - SAVE_OPLINE(); - el = zend_brk_cont(opline->op2.num, opline->op1.num, - &EX(func)->op_array, execute_data); - ZEND_VM_JMP(EX(func)->op_array.opcodes + el->cont); -} - ZEND_VM_HANDLER(100, ZEND_GOTO, ANY, CONST) { USE_OPLINE diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index aa3b7f3658..c174ff4653 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1248,28 +1248,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_VARIADIC_SPEC_HANDLER(ZEN ZEND_VM_NEXT_OPCODE(); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BRK_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - zend_brk_cont_element *el; - - SAVE_OPLINE(); - el = zend_brk_cont(opline->op2.num, opline->op1.num, - &EX(func)->op_array, execute_data); - ZEND_VM_JMP(EX(func)->op_array.opcodes + el->brk); -} - -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CONT_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - zend_brk_cont_element *el; - - SAVE_OPLINE(); - el = zend_brk_cont(opline->op2.num, opline->op1.num, - &EX(func)->op_array, execute_data); - ZEND_VM_JMP(EX(func)->op_array.opcodes + el->cont); -} - static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BEGIN_SILENCE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -46678,56 +46656,56 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_BRK_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, - ZEND_CONT_SPEC_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_BOOL_SPEC_CONST_HANDLER, ZEND_BOOL_SPEC_CONST_HANDLER, ZEND_BOOL_SPEC_CONST_HANDLER, diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index 95b8b859eb..705ab9cd29 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -72,8 +72,8 @@ const char *zend_vm_opcodes_map[173] = { "ZEND_JMPNZ_EX", "ZEND_CASE", NULL, - "ZEND_BRK", - "ZEND_CONT", + NULL, + NULL, "ZEND_BOOL", "ZEND_FAST_CONCAT", "ZEND_ROPE_INIT", diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index 89a0d3139b..f6de5b1b57 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -82,8 +82,6 @@ END_EXTERN_C() #define ZEND_JMPZ_EX 46 #define ZEND_JMPNZ_EX 47 #define ZEND_CASE 48 -#define ZEND_BRK 50 -#define ZEND_CONT 51 #define ZEND_BOOL 52 #define ZEND_FAST_CONCAT 53 #define ZEND_ROPE_INIT 54 diff --git a/ext/opcache/Optimizer/block_pass.c b/ext/opcache/Optimizer/block_pass.c index 275e3f5fa2..fe20248fee 100644 --- a/ext/opcache/Optimizer/block_pass.c +++ b/ext/opcache/Optimizer/block_pass.c @@ -123,12 +123,9 @@ static int find_code_blocks(zend_op_array *op_array, zend_cfg *cfg, zend_optimiz blocks[0].start_opline_no = 0; while (opline < end) { switch((unsigned)opline->opcode) { - case ZEND_BRK: - case ZEND_CONT: case ZEND_GOTO: - /* would not optimize non-optimized BRK/CONTs - we cannot - really know where it jumps, so these optimizations are - too dangerous */ + /* would not optimize GOTOs - we cannot really know where it jumps, + * so these optimizations are too dangerous */ return 0; case ZEND_FAST_CALL: START_BLOCK_OP(ZEND_OP1(opline).opline_num); diff --git a/ext/opcache/Optimizer/pass1_5.c b/ext/opcache/Optimizer/pass1_5.c index c042940b0e..611b39df24 100644 --- a/ext/opcache/Optimizer/pass1_5.c +++ b/ext/opcache/Optimizer/pass1_5.c @@ -613,8 +613,6 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) case ZEND_EXIT: case ZEND_THROW: case ZEND_CATCH: - case ZEND_BRK: - case ZEND_CONT: case ZEND_GOTO: case ZEND_FAST_CALL: case ZEND_FAST_RET: diff --git a/ext/opcache/Optimizer/pass2.c b/ext/opcache/Optimizer/pass2.c index 3991a41e0f..a9d85daa6f 100644 --- a/ext/opcache/Optimizer/pass2.c +++ b/ext/opcache/Optimizer/pass2.c @@ -181,53 +181,6 @@ void zend_optimizer_pass2(zend_op_array *op_array) opline->opcode = ZEND_JMP; } break; - - case ZEND_BRK: - case ZEND_CONT: - { - zend_brk_cont_element *jmp_to; - int array_offset = ZEND_OP1(opline).num; - int nest_levels = ZEND_OP2(opline).num; - int dont_optimize = 0; - - while (1) { - if (array_offset == -1) { - dont_optimize = 1; /* don't optimize this bogus break/continue, let the executor shout */ - break; - } - jmp_to = &op_array->brk_cont_array[array_offset]; - array_offset = jmp_to->parent; - if (--nest_levels > 0) { - if (op_array->opcodes[jmp_to->brk].opcode == ZEND_FREE || - op_array->opcodes[jmp_to->brk].opcode == ZEND_FE_FREE || - op_array->opcodes[jmp_to->brk].opcode == ZEND_END_SILENCE) { - dont_optimize = 1; - break; - } - } else { - break; - } - } - - if (dont_optimize) { - break; - } - - /* optimize - convert to a JMP */ - switch (opline->opcode) { - case ZEND_BRK: - MAKE_NOP(opline); - ZEND_OP1(opline).opline_num = jmp_to->brk; - break; - case ZEND_CONT: - MAKE_NOP(opline); - ZEND_OP1(opline).opline_num = jmp_to->cont; - break; - } - opline->opcode = ZEND_JMP; - /* MAKE_NOP() already set op1 and op2 to IS_UNUSED */ - } - break; } opline++; } diff --git a/ext/opcache/Optimizer/pass3.c b/ext/opcache/Optimizer/pass3.c index 3019b274e9..cb717998d6 100644 --- a/ext/opcache/Optimizer/pass3.c +++ b/ext/opcache/Optimizer/pass3.c @@ -322,8 +322,6 @@ continue_jmp_ex_optimization: op->opcode == ZEND_JMPNZ || op->opcode == ZEND_JMPNZ_EX || op->opcode == ZEND_JMPZNZ || - op->opcode == ZEND_BRK || - op->opcode == ZEND_CONT || op->opcode == ZEND_CASE || op->opcode == ZEND_RETURN || op->opcode == ZEND_RETURN_BY_REF || @@ -358,8 +356,6 @@ continue_jmp_ex_optimization: op->opcode == ZEND_JMPNZ || op->opcode == ZEND_JMPNZ_EX || op->opcode == ZEND_JMPZNZ || - op->opcode == ZEND_BRK || - op->opcode == ZEND_CONT || op->opcode == ZEND_CASE || op->opcode == ZEND_RETURN || op->opcode == ZEND_RETURN_BY_REF ||