}
}
-#define convert_op1_op2_long(op1, op1_lval, op2, op2_lval, result, op, op_func) \
+#define ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(opcode) \
+ if (UNEXPECTED(Z_TYPE_P(op1) == IS_OBJECT) \
+ && UNEXPECTED(Z_OBJ_HANDLER_P(op1, do_operation))) { \
+ if (EXPECTED(SUCCESS == Z_OBJ_HANDLER_P(op1, do_operation)(opcode, result, op1, op2))) { \
+ return SUCCESS; \
+ } \
+ }
+
+#define ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(opcode) \
+ if (UNEXPECTED(Z_TYPE_P(op2) == IS_OBJECT) \
+ && UNEXPECTED(Z_OBJ_HANDLER_P(op2, do_operation)) \
+ && EXPECTED(SUCCESS == Z_OBJ_HANDLER_P(op2, do_operation)(opcode, result, op1, op2))) { \
+ return SUCCESS; \
+ }
+
+#define ZEND_TRY_BINARY_OBJECT_OPERATION(opcode) \
+ ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(opcode) \
+ else \
+ ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(opcode)
+
+#define ZEND_TRY_UNARY_OBJECT_OPERATION(opcode) \
+ if (UNEXPECTED(Z_TYPE_P(op1) == IS_OBJECT) \
+ && UNEXPECTED(Z_OBJ_HANDLER_P(op1, do_operation)) \
+ && EXPECTED(SUCCESS == Z_OBJ_HANDLER_P(op1, do_operation)(opcode, result, op1, NULL))) { \
+ return SUCCESS; \
+ }
+
+#define convert_op1_op2_long(op1, op1_lval, op2, op2_lval, result, op) \
do { \
if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) { \
if (Z_ISREF_P(op1)) { \
break; \
} \
} \
- ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(op, op_func); \
+ ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(op); \
op1_lval = _zval_get_long_func_noisy(op1); \
if (UNEXPECTED(EG(exception))) { \
if (result != op1) { \
return SUCCESS;
}
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_ADD, add_function);
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_ADD);
zval op1_copy, op2_copy;
if (UNEXPECTED(zendi_try_convert_scalar_to_number(op1, &op1_copy) == FAILURE)
return SUCCESS;
}
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_SUB, sub_function);
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_SUB);
zval op1_copy, op2_copy;
if (UNEXPECTED(zendi_try_convert_scalar_to_number(op1, &op1_copy) == FAILURE)
return SUCCESS;
}
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_MUL, mul_function);
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_MUL);
zval op1_copy, op2_copy;
if (UNEXPECTED(zendi_try_convert_scalar_to_number(op1, &op1_copy) == FAILURE)
return SUCCESS;
}
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_POW, pow_function);
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_POW);
zval op1_copy, op2_copy;
if (UNEXPECTED(zendi_try_convert_scalar_to_number(op1, &op1_copy) == FAILURE)
return SUCCESS;
}
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_DIV, div_function);
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_DIV);
zval op1_copy, op2_copy;
if (UNEXPECTED(zendi_try_convert_scalar_to_number(op1, &op1_copy) == FAILURE)
{
zend_long op1_lval, op2_lval;
- convert_op1_op2_long(op1, op1_lval, op2, op2_lval, result, ZEND_MOD, mod_function);
+ convert_op1_op2_long(op1, op1_lval, op2, op2_lval, result, ZEND_MOD);
if (op2_lval == 0) {
/* modulus by zero */
break;
}
}
- ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BOOL_XOR, boolean_xor_function);
+ ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BOOL_XOR);
op1_val = zval_is_true(op1);
}
} while (0);
}
if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
- ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_OR, bitwise_or_function);
+ ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_OR);
op1_lval = _zval_get_long_func_noisy(op1);
if (UNEXPECTED(EG(exception))) {
if (result != op1) {
}
if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
- ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_AND, bitwise_and_function);
+ ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_AND);
op1_lval = _zval_get_long_func_noisy(op1);
if (UNEXPECTED(EG(exception))) {
if (result != op1) {
}
if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
- ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_XOR, bitwise_xor_function);
+ ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_XOR);
op1_lval = _zval_get_long_func_noisy(op1);
if (UNEXPECTED(EG(exception))) {
if (result != op1) {
{
zend_long op1_lval, op2_lval;
- convert_op1_op2_long(op1, op1_lval, op2, op2_lval, result, ZEND_SL, shift_left_function);
+ convert_op1_op2_long(op1, op1_lval, op2, op2_lval, result, ZEND_SL);
/* prevent wrapping quirkiness on some processors where << 64 + x == << x */
if (UNEXPECTED((zend_ulong)op2_lval >= SIZEOF_ZEND_LONG * 8)) {
{
zend_long op1_lval, op2_lval;
- convert_op1_op2_long(op1, op1_lval, op2, op2_lval, result, ZEND_SR, shift_right_function);
+ convert_op1_op2_long(op1, op1_lval, op2, op2_lval, result, ZEND_SR);
/* prevent wrapping quirkiness on some processors where >> 64 + x == >> x */
if (UNEXPECTED((zend_ulong)op2_lval >= SIZEOF_ZEND_LONG * 8)) {
op1 = Z_REFVAL_P(op1);
if (Z_TYPE_P(op1) == IS_STRING) break;
}
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_CONCAT, concat_function);
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_CONCAT);
ZVAL_STR(&op1_copy, zval_get_string_func(op1));
if (UNEXPECTED(EG(exception))) {
zval_ptr_dtor_str(&op1_copy);
return !zend_is_identical(op1, op2);
}
-#define ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(opcode, binary_op) \
- if (UNEXPECTED(Z_TYPE_P(op1) == IS_OBJECT) \
- && UNEXPECTED(Z_OBJ_HANDLER_P(op1, do_operation))) { \
- if (EXPECTED(SUCCESS == Z_OBJ_HANDLER_P(op1, do_operation)(opcode, result, op1, op2))) { \
- return SUCCESS; \
- } \
- }
-
-#define ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(opcode) \
- if (UNEXPECTED(Z_TYPE_P(op2) == IS_OBJECT) \
- && UNEXPECTED(Z_OBJ_HANDLER_P(op2, do_operation)) \
- && EXPECTED(SUCCESS == Z_OBJ_HANDLER_P(op2, do_operation)(opcode, result, op1, op2))) { \
- return SUCCESS; \
- }
-
-#define ZEND_TRY_BINARY_OBJECT_OPERATION(opcode, binary_op) \
- ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(opcode, binary_op) \
- else \
- ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(opcode)
-
-#define ZEND_TRY_UNARY_OBJECT_OPERATION(opcode) \
- if (UNEXPECTED(Z_TYPE_P(op1) == IS_OBJECT) \
- && UNEXPECTED(Z_OBJ_HANDLER_P(op1, do_operation)) \
- && EXPECTED(SUCCESS == Z_OBJ_HANDLER_P(op1, do_operation)(opcode, result, op1, NULL))) { \
- return SUCCESS; \
- }
-
/* buf points to the END of the buffer */
static zend_always_inline char *zend_print_ulong_to_buf(char *buf, zend_ulong num) {
*buf = '\0';