From 3a898f6d4ec96376a865ffa53b8cc319ef1535d9 Mon Sep 17 00:00:00 2001 From: Zeev Suraski Date: Wed, 16 Jul 2003 08:57:08 +0000 Subject: [PATCH] More cleanup for assign-op handling of objects --- Zend/zend_compile.c | 39 ++--------------------- Zend/zend_compile.h | 12 -------- Zend/zend_execute.c | 75 +++++++++++++++++++++------------------------ 3 files changed, 37 insertions(+), 89 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 482e55705c..dfda708646 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -238,43 +238,8 @@ void zend_do_binary_assign_op(zend_uchar op, znode *result, znode *op1, znode *o zend_op *last_op = &CG(active_op_array)->opcodes[last_op_number]; if (last_op->opcode == ZEND_FETCH_OBJ_RW) { - switch (op) { - case ZEND_ASSIGN_ADD: - last_op->opcode = ZEND_ASSIGN_ADD_OBJ; - break; - case ZEND_ASSIGN_SUB: - last_op->opcode = ZEND_ASSIGN_SUB_OBJ; - break; - case ZEND_ASSIGN_MUL: - last_op->opcode = ZEND_ASSIGN_MUL_OBJ; - break; - case ZEND_ASSIGN_DIV: - last_op->opcode = ZEND_ASSIGN_DIV_OBJ; - break; - case ZEND_ASSIGN_MOD: - last_op->opcode = ZEND_ASSIGN_MOD_OBJ; - break; - case ZEND_ASSIGN_SL: - last_op->opcode = ZEND_ASSIGN_SL_OBJ; - break; - case ZEND_ASSIGN_SR: - last_op->opcode = ZEND_ASSIGN_SR_OBJ; - break; - case ZEND_ASSIGN_CONCAT: - last_op->opcode = ZEND_ASSIGN_CONCAT_OBJ; - break; - case ZEND_ASSIGN_BW_OR: - last_op->opcode = ZEND_ASSIGN_BW_OR_OBJ; - break; - case ZEND_ASSIGN_BW_AND: - last_op->opcode = ZEND_ASSIGN_BW_AND_OBJ; - break; - case ZEND_ASSIGN_BW_XOR: - last_op->opcode = ZEND_ASSIGN_BW_XOR_OBJ; - break; - default: - zend_error(E_COMPILE_ERROR, "Unknown binary op opcode %d", op); - } + last_op->opcode = op; + last_op->extended_value = ZEND_ASSIGN_OBJ; zend_do_op_data(opline, op2 TSRMLS_CC); SET_UNUSED(opline->result); diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 821ad72f25..06b70eca4b 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -642,18 +642,6 @@ int zendlex(znode *zendlval TSRMLS_DC); #define ZEND_IMPORT_FUNCTION 116 #define ZEND_IMPORT_CLASS 117 #define ZEND_IMPORT_CONST 118 - -#define ZEND_ASSIGN_ADD_OBJ 121 -#define ZEND_ASSIGN_SUB_OBJ 122 -#define ZEND_ASSIGN_MUL_OBJ 123 -#define ZEND_ASSIGN_DIV_OBJ 124 -#define ZEND_ASSIGN_MOD_OBJ 125 -#define ZEND_ASSIGN_SL_OBJ 126 -#define ZEND_ASSIGN_SR_OBJ 127 -#define ZEND_ASSIGN_CONCAT_OBJ 128 -#define ZEND_ASSIGN_BW_OR_OBJ 129 -#define ZEND_ASSIGN_BW_AND_OBJ 130 -#define ZEND_ASSIGN_BW_XOR_OBJ 131 #define ZEND_PRE_INC_OBJ 132 #define ZEND_PRE_DEC_OBJ 133 diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index ddc8414dce..fb1cacc000 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1418,34 +1418,6 @@ int zend_bool_not_handler(ZEND_OPCODE_HANDLER_ARGS) } -inline int zend_binary_assign_op_helper(void *binary_op_arg, ZEND_OPCODE_HANDLER_ARGS) -{ - zval **var_ptr = get_zval_ptr_ptr(&EX(opline)->op1, EX(Ts), BP_VAR_RW); - int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC) = binary_op_arg; - - if (!var_ptr) { - zend_error(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets"); - } - - if (*var_ptr == EG(error_zval_ptr)) { - EX_T(EX(opline)->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr); - SELECTIVE_PZVAL_LOCK(*EX_T(EX(opline)->result.u.var).var.ptr_ptr, &EX(opline)->result); - AI_USE_PTR(EX_T(EX(opline)->result.u.var).var); - NEXT_OPCODE(); - } - - SEPARATE_ZVAL_IF_NOT_REF(var_ptr); - - binary_op(*var_ptr, *var_ptr, get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); - EX_T(EX(opline)->result.u.var).var.ptr_ptr = var_ptr; - SELECTIVE_PZVAL_LOCK(*var_ptr, &EX(opline)->result); - FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); - AI_USE_PTR(EX_T(EX(opline)->result.u.var).var); - - NEXT_OPCODE(); -} - - static inline int zend_binary_assign_op_obj_helper(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS) { zend_op *op_data = EX(opline)+1; @@ -1525,6 +1497,41 @@ static inline int zend_binary_assign_op_obj_helper(int (*binary_op)(zval *result } +inline int zend_binary_assign_op_helper(void *binary_op_arg, ZEND_OPCODE_HANDLER_ARGS) +{ + zval **var_ptr; + int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC); + + if (EX(opline)->extended_value == ZEND_ASSIGN_OBJ) { + return zend_binary_assign_op_obj_helper(binary_op_arg, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } + + var_ptr = get_zval_ptr_ptr(&EX(opline)->op1, EX(Ts), BP_VAR_RW); + binary_op = binary_op_arg; + + if (!var_ptr) { + zend_error(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets"); + } + + if (*var_ptr == EG(error_zval_ptr)) { + EX_T(EX(opline)->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr); + SELECTIVE_PZVAL_LOCK(*EX_T(EX(opline)->result.u.var).var.ptr_ptr, &EX(opline)->result); + AI_USE_PTR(EX_T(EX(opline)->result.u.var).var); + NEXT_OPCODE(); + } + + SEPARATE_ZVAL_IF_NOT_REF(var_ptr); + + binary_op(*var_ptr, *var_ptr, get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); + EX_T(EX(opline)->result.u.var).var.ptr_ptr = var_ptr; + SELECTIVE_PZVAL_LOCK(*var_ptr, &EX(opline)->result); + FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); + AI_USE_PTR(EX_T(EX(opline)->result.u.var).var); + + NEXT_OPCODE(); +} + + int zend_assign_add_handler(ZEND_OPCODE_HANDLER_ARGS) { return zend_binary_assign_op_helper(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -4206,18 +4213,6 @@ void zend_init_opcodes_handlers() zend_opcode_handlers[ZEND_IMPORT_CLASS] = zend_import_class_handler; zend_opcode_handlers[ZEND_IMPORT_CONST] = zend_import_const_handler; - zend_opcode_handlers[ZEND_ASSIGN_ADD_OBJ] = zend_assign_add_obj_handler; - zend_opcode_handlers[ZEND_ASSIGN_SUB_OBJ] = zend_assign_sub_obj_handler; - zend_opcode_handlers[ZEND_ASSIGN_MUL_OBJ] = zend_assign_mul_obj_handler; - zend_opcode_handlers[ZEND_ASSIGN_DIV_OBJ] = zend_assign_div_obj_handler; - zend_opcode_handlers[ZEND_ASSIGN_MOD_OBJ] = zend_assign_mod_obj_handler; - zend_opcode_handlers[ZEND_ASSIGN_SL_OBJ] = zend_assign_sl_obj_handler; - zend_opcode_handlers[ZEND_ASSIGN_SR_OBJ] = zend_assign_sr_obj_handler; - zend_opcode_handlers[ZEND_ASSIGN_CONCAT_OBJ] = zend_assign_concat_obj_handler; - zend_opcode_handlers[ZEND_ASSIGN_BW_OR_OBJ] = zend_assign_bw_or_obj_handler; - zend_opcode_handlers[ZEND_ASSIGN_BW_AND_OBJ] = zend_assign_bw_and_obj_handler; - zend_opcode_handlers[ZEND_ASSIGN_BW_XOR_OBJ] = zend_assign_bw_xor_obj_handler; - zend_opcode_handlers[ZEND_PRE_INC_OBJ] = zend_pre_inc_obj_handler; zend_opcode_handlers[ZEND_PRE_DEC_OBJ] = zend_pre_dec_obj_handler; zend_opcode_handlers[ZEND_POST_INC_OBJ] = zend_post_inc_obj_handler; -- 2.40.0