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);
#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
}
-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;
}
+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);
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;