@@ -2643,8 +2643,8 @@ PHP_FUNCTION(array_fill_keys)
2643
2643
}
2644
2644
/* }}} */
2645
2645
2646
- #define RANGE_CHECK_DOUBLE_INIT_ARRAY (start , end ) do { \
2647
- double __calc_size = ((start - end) / step ) + 1; \
2646
+ #define RANGE_CHECK_DOUBLE_INIT_ARRAY (start , end , _step ) do { \
2647
+ double __calc_size = ((start - end) / (_step) ) + 1; \
2648
2648
if (__calc_size >= (double)HT_MAX_SIZE) { \
2649
2649
zend_value_error(\
2650
2650
"The supplied range exceeds the maximum array size: start=%0.0f end=%0.0f", end, start); \
@@ -2670,32 +2670,39 @@ PHP_FUNCTION(array_fill_keys)
2670
2670
/* {{{ Create an array containing the range of integers or characters from low to high (inclusive) */
2671
2671
PHP_FUNCTION (range )
2672
2672
{
2673
- zval * zlow , * zhigh , * zstep = NULL , tmp ;
2674
- int err = 0 , is_step_double = 0 ;
2675
- double step = 1.0 ;
2673
+ zval * zlow , * zhigh , * user_step = NULL , tmp ;
2674
+ bool err = 0 , is_step_double = false ;
2675
+ double step_double = 1.0 ;
2676
2676
2677
2677
ZEND_PARSE_PARAMETERS_START (2 , 3 )
2678
2678
Z_PARAM_NUMBER_OR_STR (zlow )
2679
2679
Z_PARAM_NUMBER_OR_STR (zhigh )
2680
2680
Z_PARAM_OPTIONAL
2681
- Z_PARAM_NUMBER (zstep )
2681
+ Z_PARAM_NUMBER (user_step )
2682
2682
ZEND_PARSE_PARAMETERS_END ();
2683
2683
2684
- if (zstep ) {
2685
- is_step_double = Z_TYPE_P (zstep ) == IS_DOUBLE ;
2686
- step = zval_get_double (zstep );
2687
-
2684
+ if (user_step ) {
2685
+ if (UNEXPECTED (Z_TYPE_P (user_step ) == IS_DOUBLE )) {
2686
+ step_double = Z_DVAL_P (user_step );
2687
+ is_step_double = true;
2688
+ } else {
2689
+ step_double = (double ) Z_LVAL_P (user_step );
2690
+ }
2691
+ if (step_double == 0.0 ) {
2692
+ zend_argument_value_error (3 , "cannot be 0" );
2693
+ RETURN_THROWS ();
2694
+ }
2688
2695
/* We only want positive step values. */
2689
- if (step < 0.0 ) {
2690
- step *= -1 ;
2696
+ if (step_double < 0.0 ) {
2697
+ step_double *= -1 ;
2691
2698
}
2692
2699
}
2693
2700
2694
2701
/* If the range is given as strings, generate an array of characters. */
2695
2702
if (Z_TYPE_P (zlow ) == IS_STRING && Z_TYPE_P (zhigh ) == IS_STRING && Z_STRLEN_P (zlow ) >= 1 && Z_STRLEN_P (zhigh ) >= 1 ) {
2696
2703
int type1 , type2 ;
2697
2704
unsigned char low , high ;
2698
- zend_long lstep = (zend_long ) step ;
2705
+ zend_long lstep = (zend_long ) step_double ;
2699
2706
2700
2707
type1 = is_numeric_string (Z_STRVAL_P (zlow ), Z_STRLEN_P (zlow ), NULL , NULL , 0 );
2701
2708
type2 = is_numeric_string (Z_STRVAL_P (zhigh ), Z_STRLEN_P (zhigh ), NULL , NULL , 0 );
@@ -2710,7 +2717,7 @@ PHP_FUNCTION(range)
2710
2717
high = (unsigned char )Z_STRVAL_P (zhigh )[0 ];
2711
2718
2712
2719
if (low > high ) { /* Negative Steps */
2713
- if (low - high < lstep || lstep <= 0 ) {
2720
+ if (low - high < lstep ) {
2714
2721
err = 1 ;
2715
2722
goto err ;
2716
2723
}
@@ -2727,7 +2734,7 @@ PHP_FUNCTION(range)
2727
2734
}
2728
2735
} ZEND_HASH_FILL_END ();
2729
2736
} else if (high > low ) { /* Positive Steps */
2730
- if (high - low < lstep || lstep <= 0 ) {
2737
+ if (high - low < lstep ) {
2731
2738
err = 1 ;
2732
2739
goto err ;
2733
2740
}
@@ -2760,29 +2767,29 @@ PHP_FUNCTION(range)
2760
2767
}
2761
2768
2762
2769
if (low > high ) { /* Negative steps */
2763
- if (low - high < step || step <= 0 ) {
2770
+ if (low - high < step_double ) {
2764
2771
err = 1 ;
2765
2772
goto err ;
2766
2773
}
2767
2774
2768
- RANGE_CHECK_DOUBLE_INIT_ARRAY (low , high );
2775
+ RANGE_CHECK_DOUBLE_INIT_ARRAY (low , high , step_double );
2769
2776
2770
2777
ZEND_HASH_FILL_PACKED (Z_ARRVAL_P (return_value )) {
2771
- for (i = 0 , element = low ; i < size && element >= high ; ++ i , element = low - (i * step )) {
2778
+ for (i = 0 , element = low ; i < size && element >= high ; ++ i , element = low - (i * step_double )) {
2772
2779
ZEND_HASH_FILL_SET_DOUBLE (element );
2773
2780
ZEND_HASH_FILL_NEXT ();
2774
2781
}
2775
2782
} ZEND_HASH_FILL_END ();
2776
2783
} else if (high > low ) { /* Positive steps */
2777
- if (high - low < step || step <= 0 ) {
2784
+ if (high - low < step_double ) {
2778
2785
err = 1 ;
2779
2786
goto err ;
2780
2787
}
2781
2788
2782
- RANGE_CHECK_DOUBLE_INIT_ARRAY (high , low );
2789
+ RANGE_CHECK_DOUBLE_INIT_ARRAY (high , low , step_double );
2783
2790
2784
2791
ZEND_HASH_FILL_PACKED (Z_ARRVAL_P (return_value )) {
2785
- for (i = 0 , element = low ; i < size && element <= high ; ++ i , element = low + (i * step )) {
2792
+ for (i = 0 , element = low ; i < size && element <= high ; ++ i , element = low + (i * step_double )) {
2786
2793
ZEND_HASH_FILL_SET_DOUBLE (element );
2787
2794
ZEND_HASH_FILL_NEXT ();
2788
2795
}
@@ -2801,16 +2808,7 @@ PHP_FUNCTION(range)
2801
2808
low = zval_get_long (zlow );
2802
2809
high = zval_get_long (zhigh );
2803
2810
2804
- if (step <= 0 ) {
2805
- err = 1 ;
2806
- goto err ;
2807
- }
2808
-
2809
- lstep = (zend_ulong )step ;
2810
- if (step <= 0 ) {
2811
- err = 1 ;
2812
- goto err ;
2813
- }
2811
+ lstep = (zend_ulong )step_double ;
2814
2812
2815
2813
if (low > high ) { /* Negative steps */
2816
2814
if ((zend_ulong )low - high < lstep ) {
0 commit comments