@@ -199,7 +199,7 @@ typedef void (*gmp_binary_ui_op_t)(mpz_ptr, mpz_srcptr, gmp_ulong);
199
199
typedef void (* gmp_binary_op2_t )(mpz_ptr , mpz_ptr , mpz_srcptr , mpz_srcptr );
200
200
typedef gmp_ulong (* gmp_binary_ui_op2_t )(mpz_ptr , mpz_ptr , mpz_srcptr , gmp_ulong );
201
201
202
- static inline zend_result 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 );
202
+ 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 );
203
203
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 );
204
204
static inline void gmp_zval_unary_op (zval * return_value , zval * a_arg , gmp_unary_op_t gmp_op );
205
205
@@ -356,7 +356,10 @@ static void shift_operator_helper(gmp_binary_ui_op_t op, zval *return_value, zva
356
356
}
357
357
358
358
#define DO_BINARY_UI_OP_EX (op , uop , check_b_zero ) \
359
- return gmp_zval_binary_ui_op(result, op1, op2, op, uop, check_b_zero, /* is_operator */ true );
359
+ gmp_zval_binary_ui_op( \
360
+ result, op1, op2, op, uop, check_b_zero, /* is_operator */ true ); \
361
+ if (UNEXPECTED(EG(exception))) { return FAILURE; } \
362
+ return SUCCESS;
360
363
361
364
#define DO_BINARY_UI_OP (op ) DO_BINARY_UI_OP_EX(op, op ## _ui, 0)
362
365
#define DO_BINARY_OP (op ) DO_BINARY_UI_OP_EX(op, NULL, 0)
@@ -434,7 +437,7 @@ static int gmp_compare(zval *op1, zval *op2) /* {{{ */
434
437
/* An error/exception occurs if one of the operands is not a numeric string
435
438
* or an object which is different from GMP */
436
439
if (EG (exception )) {
437
- return ZEND_UNCOMPARABLE ;
440
+ return 1 ;
438
441
}
439
442
/* result can only be a zend_long if gmp_cmp hasn't thrown an Error */
440
443
ZEND_ASSERT (Z_TYPE (result ) == IS_LONG );
@@ -616,16 +619,7 @@ static zend_result convert_to_gmp(mpz_t gmpnumber, zval *val, zend_long base, ui
616
619
case IS_STRING : {
617
620
return convert_zstr_to_gmp (gmpnumber , Z_STR_P (val ), base , arg_pos );
618
621
}
619
- case IS_NULL :
620
- /* For operator overloading just reject null */
621
- if (arg_pos == 0 ) {
622
- return FAILURE ;
623
- }
624
- ZEND_FALLTHROUGH ;
625
- case IS_DOUBLE :
626
- case IS_FALSE :
627
- case IS_TRUE :
628
- {
622
+ default : {
629
623
zend_long lval ;
630
624
if (!zend_parse_arg_long_slow (val , & lval , arg_pos )) {
631
625
if (arg_pos == 0 ) {
@@ -641,12 +635,6 @@ static zend_result convert_to_gmp(mpz_t gmpnumber, zval *val, zend_long base, ui
641
635
mpz_set_si (gmpnumber , lval );
642
636
return SUCCESS ;
643
637
}
644
- default :
645
- if (arg_pos != 0 ) {
646
- zend_argument_type_error (arg_pos ,
647
- "must be of type GMP|string|int, %s given" , zend_zval_type_name (val ));
648
- }
649
- return FAILURE ;
650
638
}
651
639
}
652
640
/* }}} */
@@ -714,45 +702,18 @@ static void gmp_cmp(zval *return_value, zval *a_arg, zval *b_arg, bool is_operat
714
702
/* {{{ gmp_zval_binary_ui_op
715
703
Execute GMP binary operation.
716
704
*/
717
- static inline zend_result 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 )
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 , bool check_b_zero , bool is_operator )
718
706
{
719
707
mpz_ptr gmpnum_a , gmpnum_b , gmpnum_result ;
720
708
gmp_temp_t temp_a , temp_b ;
721
709
722
- /* Inline version of FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a, is_operator ? 0 : 1);
723
- * because we cannot use RETURN_THROWS() here */
724
- if (IS_GMP (a_arg )) {
725
- gmpnum_a = GET_GMP_FROM_ZVAL (a_arg );
726
- temp_a .is_used = 0 ;
727
- } else {
728
- mpz_init (temp_a .num );
729
- if (convert_to_gmp (temp_a .num , a_arg , 0 , is_operator ? 0 : 1 ) == FAILURE ) {
730
- mpz_clear (temp_a .num );
731
- return FAILURE ;
732
- }
733
- temp_a .is_used = 1 ;
734
- gmpnum_a = temp_a .num ;
735
- }
710
+ FETCH_GMP_ZVAL (gmpnum_a , a_arg , temp_a , is_operator ? 0 : 1 );
736
711
737
712
if (gmp_ui_op && Z_TYPE_P (b_arg ) == IS_LONG && Z_LVAL_P (b_arg ) >= 0 ) {
738
713
gmpnum_b = NULL ;
739
714
temp_b .is_used = 0 ;
740
715
} else {
741
- /* Inline version of FETCH_GMP_ZVAL_DEP(gmpnum_b, b_arg, temp_b, temp_a, is_operator ? 0 : 2);
742
- * because we cannot use RETURN_THROWS() here */
743
- if (IS_GMP (b_arg )) {
744
- gmpnum_b = GET_GMP_FROM_ZVAL (b_arg );
745
- temp_b .is_used = 0 ;
746
- } else {
747
- mpz_init (temp_b .num );
748
- if (convert_to_gmp (temp_b .num , b_arg , 0 , is_operator ? 0 : 2 ) == FAILURE ) {
749
- mpz_clear (temp_b .num );
750
- FREE_GMP_TEMP (temp_a );
751
- return FAILURE ;
752
- }
753
- temp_b .is_used = 1 ;
754
- gmpnum_b = temp_b .num ;
755
- }
716
+ FETCH_GMP_ZVAL_DEP (gmpnum_b , b_arg , temp_b , temp_a , is_operator ? 0 : 2 );
756
717
}
757
718
758
719
if (check_b_zero ) {
@@ -771,7 +732,7 @@ static inline zend_result gmp_zval_binary_ui_op(zval *return_value, zval *a_arg,
771
732
}
772
733
FREE_GMP_TEMP (temp_a );
773
734
FREE_GMP_TEMP (temp_b );
774
- return FAILURE ;
735
+ RETURN_THROWS () ;
775
736
}
776
737
}
777
738
@@ -785,7 +746,6 @@ static inline zend_result gmp_zval_binary_ui_op(zval *return_value, zval *a_arg,
785
746
786
747
FREE_GMP_TEMP (temp_a );
787
748
FREE_GMP_TEMP (temp_b );
788
- return SUCCESS ;
789
749
}
790
750
/* }}} */
791
751
0 commit comments