Browse Source

Removed support for continue and break operators with non-constant operands

migration/RELEASE_1_0_0
Dmitry Stogov 21 years ago
parent
commit
97190ee606
  1. 2
      NEWS
  2. 5
      Zend/zend_compile.c
  3. 13
      Zend/zend_execute.c
  4. 12
      Zend/zend_vm_def.h
  5. 140
      Zend/zend_vm_execute.h

2
NEWS

@ -2,6 +2,8 @@ PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ??? ????, PHP 6.0
- Unicode support. (Andrei, Dmitry, et al)
- Removed support for continue and break operators with non-constant operands.
(Dmitry)
- Changed __toString() behavior to call it in all necessary places
(Marcus, Dmitry)
- Changed "instanceof" and "catch" operators, is_a() and is_subclass_of()

5
Zend/zend_compile.c

@ -2636,6 +2636,11 @@ void zend_do_brk_cont(zend_uchar op, znode *expr TSRMLS_DC)
opline->op1.u.opline_num = CG(active_op_array)->current_brk_cont;
SET_UNUSED(opline->op1);
if (expr) {
if (expr->op_type != IS_CONST) {
zend_error(E_COMPILE_ERROR, "'%s' operator with non-constant operand is no longer supported", op == ZEND_BRK ? "break" : "continue");
} else if (Z_TYPE(expr->u.constant) != IS_LONG || Z_LVAL(expr->u.constant) < 1) {
zend_error(E_COMPILE_ERROR, "'%s' operator accepts only positive numbers", op == ZEND_BRK ? "break" : "continue");
}
opline->op2 = *expr;
} else {
opline->op2.u.constant.type = IS_LONG;

13
Zend/zend_execute.c

@ -1386,20 +1386,11 @@ static void zend_fetch_property_address(temp_variable *result, zval **container_
}
}
static inline zend_brk_cont_element* zend_brk_cont(zval *nest_levels_zval, int array_offset, zend_op_array *op_array, temp_variable *Ts TSRMLS_DC)
static inline zend_brk_cont_element* zend_brk_cont(int nest_levels, int array_offset, zend_op_array *op_array, temp_variable *Ts TSRMLS_DC)
{
zval tmp;
int nest_levels, original_nest_levels;
int original_nest_levels;
zend_brk_cont_element *jmp_to;
if (nest_levels_zval->type != IS_LONG) {
tmp = *nest_levels_zval;
zval_copy_ctor(&tmp);
convert_to_long(&tmp);
nest_levels = tmp.value.lval;
} else {
nest_levels = nest_levels_zval->value.lval;
}
original_nest_levels = nest_levels;
do {
if (array_offset==-1) {

12
Zend/zend_vm_def.h

@ -2362,27 +2362,23 @@ ZEND_VM_HANDLER(52, ZEND_BOOL, CONST|TMP|VAR|CV, ANY)
ZEND_VM_NEXT_OPCODE();
}
ZEND_VM_HANDLER(50, ZEND_BRK, ANY, CONST|TMP|VAR|CV)
ZEND_VM_HANDLER(50, ZEND_BRK, ANY, CONST)
{
zend_op *opline = EX(opline);
zend_free_op free_op2;
zend_brk_cont_element *el;
el = zend_brk_cont(GET_OP2_ZVAL_PTR(BP_VAR_R), opline->op1.u.opline_num,
el = zend_brk_cont(Z_LVAL(opline->op2.u.constant), opline->op1.u.opline_num,
EX(op_array), EX(Ts) TSRMLS_CC);
FREE_OP2();
ZEND_VM_JMP(EX(op_array)->opcodes + el->brk);
}
ZEND_VM_HANDLER(51, ZEND_CONT, ANY, CONST|TMP|VAR|CV)
ZEND_VM_HANDLER(51, ZEND_CONT, ANY, CONST)
{
zend_op *opline = EX(opline);
zend_free_op free_op2;
zend_brk_cont_element *el;
el = zend_brk_cont(GET_OP2_ZVAL_PTR(BP_VAR_R), opline->op1.u.opline_num,
el = zend_brk_cont(Z_LVAL(opline->op2.u.constant), opline->op1.u.opline_num,
EX(op_array), EX(Ts) TSRMLS_CC);
FREE_OP2();
ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
}

140
Zend/zend_vm_execute.h

@ -771,24 +771,20 @@ static int ZEND_RECV_INIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
static int ZEND_BRK_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
zend_brk_cont_element *el;
el = zend_brk_cont(&opline->op2.u.constant, opline->op1.u.opline_num,
el = zend_brk_cont(Z_LVAL(opline->op2.u.constant), opline->op1.u.opline_num,
EX(op_array), EX(Ts) TSRMLS_CC);
ZEND_VM_JMP(EX(op_array)->opcodes + el->brk);
}
static int ZEND_CONT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
zend_brk_cont_element *el;
el = zend_brk_cont(&opline->op2.u.constant, opline->op1.u.opline_num,
el = zend_brk_cont(Z_LVAL(opline->op2.u.constant), opline->op1.u.opline_num,
EX(op_array), EX(Ts) TSRMLS_CC);
ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
}
@ -916,30 +912,6 @@ static int ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
}
static int ZEND_BRK_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
zend_free_op free_op2;
zend_brk_cont_element *el;
el = zend_brk_cont(_get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), opline->op1.u.opline_num,
EX(op_array), EX(Ts) TSRMLS_CC);
zval_dtor(free_op2.var);
ZEND_VM_JMP(EX(op_array)->opcodes + el->brk);
}
static int ZEND_CONT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
zend_free_op free_op2;
zend_brk_cont_element *el;
el = zend_brk_cont(_get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), opline->op1.u.opline_num,
EX(op_array), EX(Ts) TSRMLS_CC);
zval_dtor(free_op2.var);
ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
}
static int ZEND_FETCH_CLASS_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
@ -1064,30 +1036,6 @@ static int ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
}
static int ZEND_BRK_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
zend_free_op free_op2;
zend_brk_cont_element *el;
el = zend_brk_cont(_get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), opline->op1.u.opline_num,
EX(op_array), EX(Ts) TSRMLS_CC);
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
ZEND_VM_JMP(EX(op_array)->opcodes + el->brk);
}
static int ZEND_CONT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
zend_free_op free_op2;
zend_brk_cont_element *el;
el = zend_brk_cont(_get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), opline->op1.u.opline_num,
EX(op_array), EX(Ts) TSRMLS_CC);
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
}
static int ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
@ -1292,30 +1240,6 @@ static int ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
}
static int ZEND_BRK_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
zend_brk_cont_element *el;
el = zend_brk_cont(_get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC), opline->op1.u.opline_num,
EX(op_array), EX(Ts) TSRMLS_CC);
ZEND_VM_JMP(EX(op_array)->opcodes + el->brk);
}
static int ZEND_CONT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
zend_brk_cont_element *el;
el = zend_brk_cont(_get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC), opline->op1.u.opline_num,
EX(op_array), EX(Ts) TSRMLS_CC);
ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
}
static int ZEND_BW_NOT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
@ -28239,55 +28163,55 @@ void zend_init_opcodes_handlers()
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_BRK_SPEC_CONST_HANDLER,
ZEND_BRK_SPEC_TMP_HANDLER,
ZEND_BRK_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_BRK_SPEC_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_BRK_SPEC_CONST_HANDLER,
ZEND_BRK_SPEC_TMP_HANDLER,
ZEND_BRK_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_BRK_SPEC_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_BRK_SPEC_CONST_HANDLER,
ZEND_BRK_SPEC_TMP_HANDLER,
ZEND_BRK_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_BRK_SPEC_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_BRK_SPEC_CONST_HANDLER,
ZEND_BRK_SPEC_TMP_HANDLER,
ZEND_BRK_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_BRK_SPEC_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_BRK_SPEC_CONST_HANDLER,
ZEND_BRK_SPEC_TMP_HANDLER,
ZEND_BRK_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_BRK_SPEC_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_CONT_SPEC_CONST_HANDLER,
ZEND_CONT_SPEC_TMP_HANDLER,
ZEND_CONT_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_CONT_SPEC_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_CONT_SPEC_CONST_HANDLER,
ZEND_CONT_SPEC_TMP_HANDLER,
ZEND_CONT_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_CONT_SPEC_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_CONT_SPEC_CONST_HANDLER,
ZEND_CONT_SPEC_TMP_HANDLER,
ZEND_CONT_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_CONT_SPEC_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_CONT_SPEC_CONST_HANDLER,
ZEND_CONT_SPEC_TMP_HANDLER,
ZEND_CONT_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_CONT_SPEC_CV_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_CONT_SPEC_CONST_HANDLER,
ZEND_CONT_SPEC_TMP_HANDLER,
ZEND_CONT_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_CONT_SPEC_CV_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,

Loading…
Cancel
Save