cvs: ZendEngine2 / zend_compile.c zend_compile.h zend_execute.c

From: Date: Wed, 16 Jul 2003 08:57:09 +0000
Subject: cvs: ZendEngine2 / zend_compile.c zend_compile.h zend_execute.c
Groups: php.zend-engine.cvs 
Request: Send a blank email to php-zend-engine-cvs+get-1476@lists.php.net to get a copy of this message
zeev Wed Jul 16 04:57:09 2003 EDT Modified files: /ZendEngine2 zend_compile.c zend_compile.h zend_execute.c Log: More cleanup for assign-op handling of objects Index: ZendEngine2/zend_compile.c diff -u ZendEngine2/zend_compile.c:1.436 ZendEngine2/zend_compile.c:1.437 --- ZendEngine2/zend_compile.c:1.436 Mon Jul 7 12:22:55 2003 +++ ZendEngine2/zend_compile.c Wed Jul 16 04:57:08 2003 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_compile.c,v 1.436 2003/07/07 16:22:55 zeev Exp $ */ +/* $Id: zend_compile.c,v 1.437 2003/07/16 08:57:08 zeev Exp $ */ #include "zend_language_parser.h" #include "zend.h" @@ -238,43 +238,8 @@ 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); Index: ZendEngine2/zend_compile.h diff -u ZendEngine2/zend_compile.h:1.246 ZendEngine2/zend_compile.h:1.247 --- ZendEngine2/zend_compile.h:1.246 Mon Jul 7 12:22:56 2003 +++ ZendEngine2/zend_compile.h Wed Jul 16 04:57:08 2003 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_compile.h,v 1.246 2003/07/07 16:22:56 zeev Exp $ */ +/* $Id: zend_compile.h,v 1.247 2003/07/16 08:57:08 zeev Exp $ */ #ifndef ZEND_COMPILE_H #define ZEND_COMPILE_H @@ -642,18 +642,6 @@ #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 Index: ZendEngine2/zend_execute.c diff -u ZendEngine2/zend_execute.c:1.491 ZendEngine2/zend_execute.c:1.492 --- ZendEngine2/zend_execute.c:1.491 Tue Jul 8 07:52:21 2003 +++ ZendEngine2/zend_execute.c Wed Jul 16 04:57:08 2003 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_execute.c,v 1.491 2003/07/08 11:52:21 zeev Exp $ */ +/* $Id: zend_execute.c,v 1.492 2003/07/16 08:57:08 zeev Exp $ */ #define ZEND_INTENSIVE_DEBUGGING 0 @@ -1418,34 +1418,6 @@ } -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 @@ } +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); @@ -4205,18 +4212,6 @@ zend_opcode_handlers[ZEND_IMPORT_FUNCTION] = zend_import_function_handler; 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;

« previous php.zend-engine.cvs (#1476) next »