@@ -175,7 +175,7 @@ if (IS_GMP(zval)) { \
175
175
176
176
static void gmp_strval (zval * result , mpz_t gmpnum , int base );
177
177
static zend_result convert_to_gmp (mpz_t gmpnumber , zval * val , zend_long base , uint32_t arg_pos );
178
- static void gmp_cmp (zval * return_value , zval * a_arg , zval * b_arg );
178
+ static void gmp_cmp (zval * return_value , zval * a_arg , zval * b_arg , bool is_operator );
179
179
180
180
/*
181
181
* The gmp_*_op functions provide an implementation for several common types
@@ -194,7 +194,7 @@ typedef void (*gmp_binary_ui_op_t)(mpz_ptr, mpz_srcptr, gmp_ulong);
194
194
typedef void (* gmp_binary_op2_t )(mpz_ptr , mpz_ptr , mpz_srcptr , mpz_srcptr );
195
195
typedef gmp_ulong (* gmp_binary_ui_op2_t )(mpz_ptr , mpz_ptr , mpz_srcptr , gmp_ulong );
196
196
197
- static inline void gmp_zval_binary_ui_op (zval * return_value , zval * a_arg , zval * b_arg , gmp_binary_op_t gmp_op , gmp_binary_ui_op_t gmp_ui_op , int check_b_zero );
197
+ static inline void gmp_zval_binary_ui_op (zval * return_value , zval * a_arg , zval * b_arg , gmp_binary_op_t gmp_op , gmp_binary_ui_op_t gmp_ui_op , bool check_b_zero , bool is_operator );
198
198
static inline void gmp_zval_binary_ui_op2 (zval * return_value , zval * a_arg , zval * b_arg , gmp_binary_op2_t gmp_op , gmp_binary_ui_op2_t gmp_ui_op , int check_b_zero );
199
199
static inline void gmp_zval_unary_op (zval * return_value , zval * a_arg , gmp_unary_op_t gmp_op );
200
200
@@ -350,11 +350,10 @@ static void shift_operator_helper(gmp_binary_ui_op_t op, zval *return_value, zva
350
350
}
351
351
}
352
352
353
- #define DO_BINARY_UI_OP_EX (op , uop , check_b_zero ) \
354
- gmp_zval_binary_ui_op( \
355
- result, op1, op2, op, uop, check_b_zero \
356
- ); \
357
- if (UNEXPECTED(EG(exception))) { return FAILURE; } \
353
+ #define DO_BINARY_UI_OP_EX (op , uop , check_b_zero ) \
354
+ gmp_zval_binary_ui_op( \
355
+ result, op1, op2, op, uop, check_b_zero, /* is_operator */ true ); \
356
+ if (UNEXPECTED(EG(exception))) { return FAILURE; } \
358
357
return SUCCESS;
359
358
360
359
#define DO_BINARY_UI_OP (op ) DO_BINARY_UI_OP_EX(op, op ## _ui, 0)
@@ -428,7 +427,7 @@ static int gmp_compare(zval *op1, zval *op2) /* {{{ */
428
427
{
429
428
zval result ;
430
429
431
- gmp_cmp (& result , op1 , op2 );
430
+ gmp_cmp (& result , op1 , op2 , /* is_operator */ true );
432
431
433
432
/* An error/exception occurs if one of the operands is not a numeric string
434
433
* or an object which is different from GMP */
@@ -613,13 +612,11 @@ static zend_result convert_to_gmp(mpz_t gmpnumber, zval *val, zend_long base, ui
613
612
614
613
ret = mpz_set_str (gmpnumber , (skip_lead ? & numstr [2 ] : numstr ), (int ) base );
615
614
if (-1 == ret ) {
616
- /* if unserializing */
617
615
if (arg_pos == 0 ) {
618
- php_error_docref ( NULL , E_WARNING ,
619
- "Cannot convert variable to GMP, it is not an integer string" );
620
- return FAILURE ;
616
+ zend_value_error ( "Number is not an integer string" );
617
+ } else {
618
+ zend_argument_value_error ( arg_pos , "is not an integer string" ) ;
621
619
}
622
- zend_argument_value_error (arg_pos , "is not an integer string" );
623
620
return FAILURE ;
624
621
}
625
622
@@ -628,7 +625,13 @@ static zend_result convert_to_gmp(mpz_t gmpnumber, zval *val, zend_long base, ui
628
625
default : {
629
626
zend_long lval ;
630
627
if (!zend_parse_arg_long_slow (val , & lval )) {
631
- zend_argument_type_error (arg_pos , "must be of type GMP|string|int, %s given" , zend_zval_type_name (val ));
628
+ if (arg_pos == 0 ) {
629
+ zend_type_error (
630
+ "Number must be of type GMP|string|int, %s given" , zend_zval_type_name (val ));
631
+ } else {
632
+ zend_argument_type_error (arg_pos ,
633
+ "must be of type GMP|string|int, %s given" , zend_zval_type_name (val ));
634
+ }
632
635
return FAILURE ;
633
636
}
634
637
@@ -670,20 +673,20 @@ static void gmp_strval(zval *result, mpz_t gmpnum, int base) /* {{{ */
670
673
}
671
674
/* }}} */
672
675
673
- static void gmp_cmp (zval * return_value , zval * a_arg , zval * b_arg ) /* {{{ */
676
+ static void gmp_cmp (zval * return_value , zval * a_arg , zval * b_arg , bool is_operator ) /* {{{ */
674
677
{
675
678
mpz_ptr gmpnum_a , gmpnum_b ;
676
679
gmp_temp_t temp_a , temp_b ;
677
680
zend_bool use_si = 0 ;
678
681
zend_long res ;
679
682
680
- FETCH_GMP_ZVAL (gmpnum_a , a_arg , temp_a , 1 );
683
+ FETCH_GMP_ZVAL (gmpnum_a , a_arg , temp_a , is_operator ? 0 : 1 );
681
684
682
685
if (Z_TYPE_P (b_arg ) == IS_LONG ) {
683
686
use_si = 1 ;
684
687
temp_b .is_used = 0 ;
685
688
} else {
686
- FETCH_GMP_ZVAL_DEP (gmpnum_b , b_arg , temp_b , temp_a , 2 );
689
+ FETCH_GMP_ZVAL_DEP (gmpnum_b , b_arg , temp_b , temp_a , is_operator ? 0 : 2 );
687
690
}
688
691
689
692
if (use_si ) {
@@ -702,18 +705,18 @@ static void gmp_cmp(zval *return_value, zval *a_arg, zval *b_arg) /* {{{ */
702
705
/* {{{ gmp_zval_binary_ui_op
703
706
Execute GMP binary operation.
704
707
*/
705
- static inline void gmp_zval_binary_ui_op (zval * return_value , zval * a_arg , zval * b_arg , gmp_binary_op_t gmp_op , gmp_binary_ui_op_t gmp_ui_op , int check_b_zero )
708
+ static inline void gmp_zval_binary_ui_op (zval * return_value , zval * a_arg , zval * b_arg , gmp_binary_op_t gmp_op , gmp_binary_ui_op_t gmp_ui_op , bool check_b_zero , bool is_operator )
706
709
{
707
710
mpz_ptr gmpnum_a , gmpnum_b , gmpnum_result ;
708
711
gmp_temp_t temp_a , temp_b ;
709
712
710
- FETCH_GMP_ZVAL (gmpnum_a , a_arg , temp_a , 1 );
713
+ FETCH_GMP_ZVAL (gmpnum_a , a_arg , temp_a , is_operator ? 0 : 1 );
711
714
712
715
if (gmp_ui_op && Z_TYPE_P (b_arg ) == IS_LONG && Z_LVAL_P (b_arg ) >= 0 ) {
713
716
gmpnum_b = NULL ;
714
717
temp_b .is_used = 0 ;
715
718
} else {
716
- FETCH_GMP_ZVAL_DEP (gmpnum_b , b_arg , temp_b , temp_a , 2 );
719
+ FETCH_GMP_ZVAL_DEP (gmpnum_b , b_arg , temp_b , temp_a , is_operator ? 0 : 2 );
717
720
}
718
721
719
722
if (check_b_zero ) {
@@ -810,7 +813,8 @@ static inline void _gmp_binary_ui_op(INTERNAL_FUNCTION_PARAMETERS, gmp_binary_op
810
813
RETURN_THROWS ();
811
814
}
812
815
813
- gmp_zval_binary_ui_op (return_value , a_arg , b_arg , gmp_op , gmp_ui_op , check_b_zero );
816
+ gmp_zval_binary_ui_op (
817
+ return_value , a_arg , b_arg , gmp_op , gmp_ui_op , check_b_zero , /* is_operator */ false);
814
818
}
815
819
/* }}} */
816
820
@@ -1096,13 +1100,16 @@ ZEND_FUNCTION(gmp_div_r)
1096
1100
1097
1101
switch (round ) {
1098
1102
case GMP_ROUND_ZERO :
1099
- gmp_zval_binary_ui_op (return_value , a_arg , b_arg , mpz_tdiv_r , gmp_mpz_tdiv_r_ui , 1 );
1103
+ gmp_zval_binary_ui_op (
1104
+ return_value , a_arg , b_arg , mpz_tdiv_r , gmp_mpz_tdiv_r_ui , 1 , /* is_operator */ false);
1100
1105
break ;
1101
1106
case GMP_ROUND_PLUSINF :
1102
- gmp_zval_binary_ui_op (return_value , a_arg , b_arg , mpz_cdiv_r , gmp_mpz_cdiv_r_ui , 1 );
1107
+ gmp_zval_binary_ui_op (
1108
+ return_value , a_arg , b_arg , mpz_cdiv_r , gmp_mpz_cdiv_r_ui , 1 , /* is_operator */ false);
1103
1109
break ;
1104
1110
case GMP_ROUND_MINUSINF :
1105
- gmp_zval_binary_ui_op (return_value , a_arg , b_arg , mpz_fdiv_r , gmp_mpz_fdiv_r_ui , 1 );
1111
+ gmp_zval_binary_ui_op (
1112
+ return_value , a_arg , b_arg , mpz_fdiv_r , gmp_mpz_fdiv_r_ui , 1 , /* is_operator */ false);
1106
1113
break ;
1107
1114
default :
1108
1115
zend_argument_value_error (3 , "must be one of GMP_ROUND_ZERO, GMP_ROUND_PLUSINF, or GMP_ROUND_MINUSINF" );
@@ -1123,13 +1130,16 @@ ZEND_FUNCTION(gmp_div_q)
1123
1130
1124
1131
switch (round ) {
1125
1132
case GMP_ROUND_ZERO :
1126
- gmp_zval_binary_ui_op (return_value , a_arg , b_arg , mpz_tdiv_q , gmp_mpz_tdiv_q_ui , 1 );
1133
+ gmp_zval_binary_ui_op (
1134
+ return_value , a_arg , b_arg , mpz_tdiv_q , gmp_mpz_tdiv_q_ui , 1 , /* is_operator */ false);
1127
1135
break ;
1128
1136
case GMP_ROUND_PLUSINF :
1129
- gmp_zval_binary_ui_op (return_value , a_arg , b_arg , mpz_cdiv_q , gmp_mpz_cdiv_q_ui , 1 );
1137
+ gmp_zval_binary_ui_op (
1138
+ return_value , a_arg , b_arg , mpz_cdiv_q , gmp_mpz_cdiv_q_ui , 1 , /* is_operator */ false);
1130
1139
break ;
1131
1140
case GMP_ROUND_MINUSINF :
1132
- gmp_zval_binary_ui_op (return_value , a_arg , b_arg , mpz_fdiv_q , gmp_mpz_fdiv_q_ui , 1 );
1141
+ gmp_zval_binary_ui_op (
1142
+ return_value , a_arg , b_arg , mpz_fdiv_q , gmp_mpz_fdiv_q_ui , 1 , /* is_operator */ false);
1133
1143
break ;
1134
1144
default :
1135
1145
zend_argument_value_error (3 , "must be one of GMP_ROUND_ZERO, GMP_ROUND_PLUSINF, or GMP_ROUND_MINUSINF" );
@@ -1670,7 +1680,7 @@ ZEND_FUNCTION(gmp_cmp)
1670
1680
RETURN_THROWS ();
1671
1681
}
1672
1682
1673
- gmp_cmp (return_value , a_arg , b_arg );
1683
+ gmp_cmp (return_value , a_arg , b_arg , /* is_operator */ false );
1674
1684
}
1675
1685
/* }}} */
1676
1686
0 commit comments