]> granicus.if.org Git - php/commitdiff
More cleanup for assign-op handling of objects
authorZeev Suraski <zeev@php.net>
Wed, 16 Jul 2003 08:57:08 +0000 (08:57 +0000)
committerZeev Suraski <zeev@php.net>
Wed, 16 Jul 2003 08:57:08 +0000 (08:57 +0000)
Zend/zend_compile.c
Zend/zend_compile.h
Zend/zend_execute.c

index 482e55705cc4e258fee1418cf79e6632219b26af..dfda7086467105095049199e1dc9cdc8ceadd29d 100644 (file)
@@ -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);
index 821ad72f25517d75f8d73fbc88ca849cf6744cb5..06b70eca4bb4aef8f129064da952d9a09b3af829 100644 (file)
@@ -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
index ddc8414dce245c7d2324ae358596307ab0992d20..fb1cacc00040548e5f64a4cef48d5fd350949f90 100644 (file)
@@ -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;