Browse Source

More cleanup for assign-op handling of objects

PEAR_1_4DEV
Zeev Suraski 23 years ago
parent
commit
3a898f6d4e
  1. 39
      Zend/zend_compile.c
  2. 12
      Zend/zend_compile.h
  3. 75
      Zend/zend_execute.c

39
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);

12
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

75
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;

Loading…
Cancel
Save