#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"
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
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
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,
"ZEND_JMPNZ_EX",
"ZEND_CASE",
NULL,
- "ZEND_BRK",
- "ZEND_CONT",
+ NULL,
+ NULL,
"ZEND_BOOL",
"ZEND_FAST_CONCAT",
"ZEND_ROPE_INIT",
#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
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);
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:
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++;
}
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 ||
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 ||