diff options
-rw-r--r-- | Zend/zend_execute.c | 138 |
1 files changed, 70 insertions, 68 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 29d259fe62..10095b5565 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -945,6 +945,10 @@ static void call_overloaded_function(int arg_count, zval *return_value, HashTabl # define free_alloca(p) efree(p) #endif +#define NEXT_OPCODE() \ + opline++; \ + continue; + typedef struct _object_info { zval *ptr; } object_info; @@ -1058,15 +1062,14 @@ binary_op_addr: get_zval_ptr(&opline->op2, Ts, &EG(free_op2), BP_VAR_R) ); FREE_OP(&opline->op1, EG(free_op1)); FREE_OP(&opline->op2, EG(free_op2)); - break; + NEXT_OPCODE(); case ZEND_BW_NOT: case ZEND_BOOL_NOT: EG(unary_op) = get_unary_op(opline->opcode); EG(unary_op)(&Ts[opline->result.u.var].tmp_var, get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R) ); FREE_OP(&opline->op1, EG(free_op1)); - break; - + NEXT_OPCODE(); case ZEND_ASSIGN_ADD: EG(binary_op) = add_function; goto binary_assign_op_addr; @@ -1130,7 +1133,7 @@ binary_assign_op_addr: { FREE_OP(&opline->op2, EG(free_op2)); AI_USE_PTR(Ts[opline->result.u.var].var); } - break; + NEXT_OPCODE(); case ZEND_PRE_INC: case ZEND_PRE_DEC: case ZEND_POST_INC: @@ -1179,27 +1182,27 @@ binary_assign_op_addr: { break; } } - break; + NEXT_OPCODE(); case ZEND_PRINT: zend_print_variable(get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R)); Ts[opline->result.u.var].tmp_var.value.lval = 1; Ts[opline->result.u.var].tmp_var.type = IS_LONG; FREE_OP(&opline->op1, EG(free_op1)); - break; + NEXT_OPCODE(); case ZEND_ECHO: zend_print_variable(get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R)); FREE_OP(&opline->op1, EG(free_op1)); - break; + NEXT_OPCODE(); case ZEND_FETCH_R: zend_fetch_var_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_R ELS_CC); AI_USE_PTR(Ts[opline->result.u.var].var); - break; + NEXT_OPCODE(); case ZEND_FETCH_W: zend_fetch_var_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_W ELS_CC); - break; + NEXT_OPCODE(); case ZEND_FETCH_RW: zend_fetch_var_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_RW ELS_CC); - break; + NEXT_OPCODE(); case ZEND_FETCH_FUNC_ARG: if (ARG_SHOULD_BE_SENT_BY_REF(opline->extended_value, fbc, fbc->common.arg_types)) { /* Behave like FETCH_W */ @@ -1209,28 +1212,28 @@ binary_assign_op_addr: { zend_fetch_var_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_R ELS_CC); AI_USE_PTR(Ts[opline->result.u.var].var); } - break; + NEXT_OPCODE(); case ZEND_FETCH_IS: zend_fetch_var_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_IS ELS_CC); AI_USE_PTR(Ts[opline->result.u.var].var); - break; + NEXT_OPCODE(); case ZEND_FETCH_DIM_R: if (opline->extended_value == ZEND_FETCH_ADD_LOCK) { PZVAL_LOCK(*Ts[opline->op1.u.var].var.ptr_ptr); } zend_fetch_dimension_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_R ELS_CC); AI_USE_PTR(Ts[opline->result.u.var].var); - break; + NEXT_OPCODE(); case ZEND_FETCH_DIM_W: zend_fetch_dimension_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_W ELS_CC); - break; + NEXT_OPCODE(); case ZEND_FETCH_DIM_RW: zend_fetch_dimension_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_RW ELS_CC); - break; + NEXT_OPCODE(); case ZEND_FETCH_DIM_IS: zend_fetch_dimension_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_IS ELS_CC); AI_USE_PTR(Ts[opline->result.u.var].var); - break; + NEXT_OPCODE(); case ZEND_FETCH_DIM_FUNC_ARG: if (ARG_SHOULD_BE_SENT_BY_REF(opline->extended_value, fbc, fbc->common.arg_types)) { /* Behave like FETCH_DIM_W */ @@ -1240,21 +1243,21 @@ binary_assign_op_addr: { zend_fetch_dimension_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_R ELS_CC); AI_USE_PTR(Ts[opline->result.u.var].var); } - break; + NEXT_OPCODE(); case ZEND_FETCH_OBJ_R: zend_fetch_property_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_R ELS_CC); AI_USE_PTR(Ts[opline->result.u.var].var); - break; + NEXT_OPCODE(); case ZEND_FETCH_OBJ_W: zend_fetch_property_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_W ELS_CC); - break; + NEXT_OPCODE(); case ZEND_FETCH_OBJ_RW: zend_fetch_property_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_RW ELS_CC); - break; + NEXT_OPCODE(); case ZEND_FETCH_OBJ_IS: zend_fetch_property_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_IS ELS_CC); AI_USE_PTR(Ts[opline->result.u.var].var); - break; + NEXT_OPCODE(); case ZEND_FETCH_OBJ_FUNC_ARG: if (ARG_SHOULD_BE_SENT_BY_REF(opline->extended_value, fbc, fbc->common.arg_types)) { /* Behave like FETCH_OBJ_W */ @@ -1263,11 +1266,11 @@ binary_assign_op_addr: { zend_fetch_property_address(&opline->result, &opline->op1, &opline->op2, Ts, BP_VAR_R ELS_CC); AI_USE_PTR(Ts[opline->result.u.var].var); } - break; + NEXT_OPCODE(); case ZEND_FETCH_DIM_TMP_VAR: zend_fetch_dimension_address_from_tmp_var(&opline->result, &opline->op1, &opline->op2, Ts ELS_CC); AI_USE_PTR(Ts[opline->result.u.var].var); - break; + NEXT_OPCODE(); case ZEND_ASSIGN: { zval *value; SUSPEND_GARBAGE(); @@ -1277,12 +1280,12 @@ binary_assign_op_addr: { zend_assign_to_variable(&opline->result, &opline->op1, &opline->op2, value, (EG(free_op2)?IS_TMP_VAR:opline->op2.op_type), Ts ELS_CC); /* zend_assign_to_variable() always takes care of op2, never free it! */ } - break; + NEXT_OPCODE(); case ZEND_ASSIGN_REF: SUSPEND_GARBAGE(); zend_assign_to_variable_reference(&opline->result, get_zval_ptr_ptr(&opline->op1, Ts, BP_VAR_W), get_zval_ptr_ptr(&opline->op2, Ts, BP_VAR_W), Ts ELS_CC); RESUME_GARBAGE(); - break; + NEXT_OPCODE(); case ZEND_JMP: #if DEBUG_ZEND>=2 printf("Jumping to %d\n", opline->op1.u.opline_num); @@ -1303,7 +1306,7 @@ binary_assign_op_addr: { } FREE_OP(op1, EG(free_op1)); } - break; + NEXT_OPCODE(); case ZEND_JMPNZ: { znode *op1 = &opline->op1; @@ -1317,7 +1320,7 @@ binary_assign_op_addr: { } FREE_OP(op1, EG(free_op1)); } - break; + NEXT_OPCODE(); case ZEND_JMPZNZ: { znode *res = &opline->result; @@ -1354,7 +1357,7 @@ binary_assign_op_addr: { Ts[original_opline->result.u.var].tmp_var.value.lval = retval; Ts[original_opline->result.u.var].tmp_var.type = IS_LONG; } - break; + NEXT_OPCODE(); case ZEND_JMPNZ_EX: { zend_op *original_opline = opline; int retval = zend_is_true(get_zval_ptr(&original_opline->op1, Ts, &EG(free_op1), BP_VAR_R)); @@ -1373,28 +1376,28 @@ binary_assign_op_addr: { Ts[original_opline->result.u.var].tmp_var.value.lval = retval; Ts[original_opline->result.u.var].tmp_var.type = IS_LONG; } - break; + NEXT_OPCODE(); case ZEND_FREE: zendi_zval_dtor(Ts[opline->op1.u.var].tmp_var); - break; + NEXT_OPCODE(); case ZEND_INIT_STRING: Ts[opline->result.u.var].tmp_var.value.str.val = emalloc(1); Ts[opline->result.u.var].tmp_var.value.str.val[0] = 0; Ts[opline->result.u.var].tmp_var.value.str.len = 0; Ts[opline->result.u.var].tmp_var.refcount = 1; - break; + NEXT_OPCODE(); case ZEND_ADD_CHAR: add_char_to_string( &Ts[opline->result.u.var].tmp_var, get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_NA), &opline->op2.u.constant); /* FREE_OP is missing intentionally here - we're always working on the same temporary variable */ - break; + NEXT_OPCODE(); case ZEND_ADD_STRING: add_string_to_string( &Ts[opline->result.u.var].tmp_var, get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_NA), &opline->op2.u.constant); /* FREE_OP is missing intentionally here - we're always working on the same temporary variable */ - break; + NEXT_OPCODE(); case ZEND_ADD_VAR: { zval *var = get_zval_ptr(&opline->op2, Ts, &EG(free_op2), BP_VAR_R); zval var_copy; @@ -1418,7 +1421,7 @@ binary_assign_op_addr: { */ FREE_OP(&opline->op2, EG(free_op2)); } - break; + NEXT_OPCODE(); case ZEND_INIT_FCALL_BY_NAME: { zval *function_name; zend_function *function; @@ -1506,7 +1509,7 @@ binary_assign_op_addr: { overloaded_function_call_cont: FREE_OP(&opline->op2, EG(free_op2)); } - break; + NEXT_OPCODE(); case ZEND_DO_FCALL_BY_NAME: function_state.function = fbc; goto do_fcall_common; @@ -1608,7 +1611,7 @@ do_fcall_common: EG(function_state_ptr) = &function_state; zend_ptr_stack_clear_multiple(ELS_C); } - break; + NEXT_OPCODE(); case ZEND_RETURN: { zval *retval_ptr; zval **retval_ptr_ptr; @@ -1668,7 +1671,7 @@ do_fcall_common: INIT_PZVAL(valptr); zend_ptr_stack_push(&EG(argument_stack), valptr); } - break; + NEXT_OPCODE(); case ZEND_SEND_VAR: if (opline->extended_value==ZEND_DO_FCALL_BY_NAME && ARG_SHOULD_BE_SENT_BY_REF(opline->op2.u.opline_num, fbc, fbc->common.arg_types)) { @@ -1697,7 +1700,7 @@ do_fcall_common: zend_ptr_stack_push(&EG(argument_stack), varptr); FREE_OP(&opline->op1, EG(free_op1)); /* for string offsets */ } - break; + NEXT_OPCODE(); send_by_ref: case ZEND_SEND_REF: { zval **varptr_ptr; @@ -1724,7 +1727,7 @@ send_by_ref: varptr->refcount++; zend_ptr_stack_push(&EG(argument_stack), varptr); } - break; + NEXT_OPCODE(); case ZEND_RECV: { zval **param; @@ -1739,7 +1742,7 @@ send_by_ref: zend_assign_to_variable(NULL, &opline->result, NULL, *param, IS_VAR, Ts ELS_CC); } } - break; + NEXT_OPCODE(); case ZEND_RECV_INIT: { zval **param, *assignment_value; @@ -1774,13 +1777,13 @@ send_by_ref: zend_assign_to_variable(NULL, &opline->result, NULL, assignment_value, IS_VAR, Ts ELS_CC); } } - break; + NEXT_OPCODE(); case ZEND_BOOL: /* PHP 3.0 returned "" for false and 1 for true, here we use 0 and 1 for now */ Ts[opline->result.u.var].tmp_var.value.lval = zend_is_true(get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R)); Ts[opline->result.u.var].tmp_var.type = IS_LONG; FREE_OP(&opline->op1, EG(free_op1)); - break; + NEXT_OPCODE(); case ZEND_BRK: case ZEND_CONT: { zval *nest_levels_zval = get_zval_ptr(&opline->op2, Ts, &EG(free_op2), BP_VAR_R); @@ -1826,7 +1829,7 @@ send_by_ref: FREE_OP(&opline->op2, EG(free_op2)); continue; } - break; + NEXT_OPCODE(); case ZEND_CASE: { int switch_expr_is_overloaded=0; @@ -1856,10 +1859,10 @@ send_by_ref: AI_USE_PTR(Ts[opline->op1.u.var].var); } } - break; + NEXT_OPCODE(); case ZEND_SWITCH_FREE: zend_switch_free(opline, Ts ELS_CC); - break; + NEXT_OPCODE(); case ZEND_NEW: { zval *tmp = get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R); zval class_name; @@ -1879,7 +1882,7 @@ send_by_ref: zval_dtor(&class_name); FREE_OP(&opline->op1, EG(free_op1)); } - break; + NEXT_OPCODE(); case ZEND_FETCH_CONSTANT: if (!zend_get_constant(opline->op1.u.constant.value.str.val, opline->op1.u.constant.value.str.len, &Ts[opline->result.u.var].tmp_var)) { zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", @@ -1888,7 +1891,7 @@ send_by_ref: Ts[opline->result.u.var].tmp_var = opline->op1.u.constant; zval_copy_ctor(&Ts[opline->result.u.var].tmp_var); } - break; + NEXT_OPCODE(); case ZEND_INIT_ARRAY: case ZEND_ADD_ARRAY_ELEMENT: { zval *array_ptr = &Ts[opline->result.u.var].tmp_var; @@ -1957,7 +1960,7 @@ send_by_ref: zend_hash_next_index_insert(array_ptr->value.ht, &expr_ptr, sizeof(zval *), NULL); } } - break; + NEXT_OPCODE(); case ZEND_CAST: { zval *expr = get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R); zval *result = &Ts[opline->result.u.var].tmp_var; @@ -1990,7 +1993,7 @@ send_by_ref: break; } } - break; + NEXT_OPCODE(); case ZEND_INCLUDE_OR_EVAL: { zend_op_array *new_op_array=NULL; zval **original_return_value = EG(return_value_ptr_ptr); @@ -2045,7 +2048,7 @@ send_by_ref: } EG(return_value_ptr_ptr) = original_return_value; } - break; + NEXT_OPCODE(); case ZEND_UNSET_VAR: { zval tmp, *variable = get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R); @@ -2063,7 +2066,7 @@ send_by_ref: } FREE_OP(&opline->op1, EG(free_op1)); } - break; + NEXT_OPCODE(); case ZEND_UNSET_DIM_OBJ: { zval **container = get_zval_ptr_ptr(&opline->op1, Ts, BP_VAR_R); zval *offset = get_zval_ptr(&opline->op2, Ts, &EG(free_op2), BP_VAR_R); @@ -2097,7 +2100,7 @@ send_by_ref: } FREE_OP(&opline->op2, EG(free_op2)); } - break; + NEXT_OPCODE(); case ZEND_FE_RESET: { zval *array = get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R); @@ -2122,7 +2125,7 @@ send_by_ref: /* JMP to the end of foreach - TBD */ } } - break; + NEXT_OPCODE(); case ZEND_FE_FETCH: { zval *array = get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R); zval *result = &Ts[opline->result.u.var].tmp_var; @@ -2163,7 +2166,7 @@ send_by_ref: zend_hash_index_update(result->value.ht, 1, &key, sizeof(zval *), NULL); zend_hash_move_forward(array->value.ht); } - break; + NEXT_OPCODE(); case ZEND_JMP_NO_CTOR: { zval *object; @@ -2178,7 +2181,7 @@ send_by_ref: continue; } } - break; + NEXT_OPCODE(); case ZEND_ISSET_ISEMPTY: { zval **var = get_zval_ptr_ptr(&opline->op1, Ts, BP_VAR_IS); int isset; @@ -2222,22 +2225,22 @@ send_by_ref: } Ts[opline->result.u.var].tmp_var.type = IS_BOOL; } - break; + NEXT_OPCODE(); case ZEND_EXIT: if (opline->op1.op_type != IS_UNUSED) { zend_print_variable(get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R)); FREE_OP(&opline->op1, EG(free_op1)); } zend_bailout(); - break; + NEXT_OPCODE(); case ZEND_BEGIN_SILENCE: Ts[opline->result.u.var].tmp_var.value.lval = EG(error_reporting); Ts[opline->result.u.var].tmp_var.type = IS_LONG; /* shouldn't be necessary */ EG(error_reporting) = 0; - break; + NEXT_OPCODE(); case ZEND_END_SILENCE: EG(error_reporting) = Ts[opline->op1.u.var].tmp_var.value.lval; - break; + NEXT_OPCODE(); case ZEND_QM_ASSIGN: { zval *value = get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R); @@ -2246,25 +2249,25 @@ send_by_ref: zval_copy_ctor(&Ts[opline->result.u.var].tmp_var); } } - break; + NEXT_OPCODE(); case ZEND_EXT_STMT: if (!EG(no_extensions)) { zend_llist_apply_with_argument(&zend_extensions, (void (*)(void *, void *)) zend_extension_statement_handler, op_array); } - break; + NEXT_OPCODE(); case ZEND_EXT_FCALL_BEGIN: if (!EG(no_extensions)) { zend_llist_apply_with_argument(&zend_extensions, (void (*)(void *, void *)) zend_extension_fcall_begin_handler, op_array); } - break; + NEXT_OPCODE(); case ZEND_EXT_FCALL_END: if (!EG(no_extensions)) { zend_llist_apply_with_argument(&zend_extensions, (void (*)(void *, void *)) zend_extension_fcall_end_handler, op_array); } - break; + NEXT_OPCODE(); case ZEND_DECLARE_FUNCTION_OR_CLASS: do_bind_function_or_class(opline, EG(function_table), EG(class_table), 0); - break; + NEXT_OPCODE(); case ZEND_TICKS: if (++EG(ticks_count)==opline->op1.u.constant.value.lval) { EG(ticks_count)=0; @@ -2272,18 +2275,17 @@ send_by_ref: zend_ticks_function(opline->op1.u.constant.value.lval); } } - break; + NEXT_OPCODE(); case ZEND_EXT_NOP: case ZEND_NOP: - break; + NEXT_OPCODE(); EMPTY_SWITCH_DEFAULT_CASE() } - opline++; } #if SUPPORT_INTERACTIVE op_array->last_executed_op_number = opline-op_array->opcodes; free_alloca(Ts); #else - php_error(E_ERROR,"Arrived at end of main loop which shouldn't happen"); + zend_error(E_ERROR,"Arrived at end of main loop which shouldn't happen"); #endif } |