@@ -43,6 +43,27 @@ extern "C" {
43
43
44
44
using icu::Locale;
45
45
46
+ #define ZEND_VALUE_ERROR_INVALID_FIELD (argument, zpp_arg_position ) \
47
+ if (argument < 0 || argument >= UCAL_FIELD_COUNT) { \
48
+ zend_argument_value_error (getThis () ? ((zpp_arg_position)-1 ) : zpp_arg_position, \
49
+ " must be a valid field" ); \
50
+ RETURN_THROWS (); \
51
+ }
52
+
53
+ #define ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE (argument, zpp_arg_position ) \
54
+ if (argument < INT32_MIN || argument > INT32_MAX) { \
55
+ zend_argument_value_error (getThis () ? ((zpp_arg_position)-1 ) : zpp_arg_position, \
56
+ " must be between %d and %d" , INT32_MIN, INT32_MAX); \
57
+ RETURN_THROWS (); \
58
+ }
59
+
60
+ #define ZEND_VALUE_ERROR_INVALID_DAY_OF_WEEK (argument, zpp_arg_position ) \
61
+ if (argument < UCAL_SUNDAY || argument > UCAL_SATURDAY) { \
62
+ zend_argument_value_error (getThis () ? ((zpp_arg_position)-1 ) : zpp_arg_position, \
63
+ " must be a valid day of the week" ); \
64
+ RETURN_THROWS (); \
65
+ }
66
+
46
67
U_CFUNC PHP_METHOD (IntlCalendar, __construct)
47
68
{
48
69
zend_throw_exception ( NULL ,
@@ -209,24 +230,17 @@ U_CFUNC PHP_FUNCTION(intlcal_get_available_locales)
209
230
210
231
static void _php_intlcal_field_uec_ret_in32t_method (
211
232
int32_t (Calendar::*func)(UCalendarDateFields, UErrorCode&) const ,
212
- const char *method_name,
213
233
INTERNAL_FUNCTION_PARAMETERS)
214
234
{
215
235
zend_long field;
216
- char *message;
217
236
CALENDAR_METHOD_INIT_VARS;
218
237
219
238
if (zend_parse_method_parameters (ZEND_NUM_ARGS (), getThis (),
220
239
" Ol" , &object, Calendar_ce_ptr, &field) == FAILURE) {
221
240
RETURN_THROWS ();
222
241
}
223
242
224
- if (field < 0 || field >= UCAL_FIELD_COUNT) {
225
- spprintf (&message, 0 , " %s: invalid field" , method_name);
226
- intl_error_set (NULL , U_ILLEGAL_ARGUMENT_ERROR, message, 1 );
227
- efree (message);
228
- RETURN_FALSE;
229
- }
243
+ ZEND_VALUE_ERROR_INVALID_FIELD (field, 2 );
230
244
231
245
CALENDAR_METHOD_FETCH_OBJECT;
232
246
@@ -240,7 +254,7 @@ static void _php_intlcal_field_uec_ret_in32t_method(
240
254
U_CFUNC PHP_FUNCTION (intlcal_get)
241
255
{
242
256
_php_intlcal_field_uec_ret_in32t_method (&Calendar::get,
243
- " intlcal_get " , INTERNAL_FUNCTION_PARAM_PASSTHRU);
257
+ INTERNAL_FUNCTION_PARAM_PASSTHRU);
244
258
}
245
259
246
260
U_CFUNC PHP_FUNCTION (intlcal_get_time)
@@ -290,16 +304,8 @@ U_CFUNC PHP_FUNCTION(intlcal_add)
290
304
RETURN_THROWS ();
291
305
}
292
306
293
- if (field < 0 || field >= UCAL_FIELD_COUNT) {
294
- intl_error_set (NULL , U_ILLEGAL_ARGUMENT_ERROR,
295
- " intlcal_add: invalid field" , 0 );
296
- RETURN_FALSE;
297
- }
298
- if (amount < INT32_MIN || amount > INT32_MAX) {
299
- intl_error_set (NULL , U_ILLEGAL_ARGUMENT_ERROR,
300
- " intlcal_add: amount out of bounds" , 0 );
301
- RETURN_FALSE;
302
- }
307
+ ZEND_VALUE_ERROR_INVALID_FIELD (field, 2 );
308
+ ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE (amount, 3 );
303
309
304
310
CALENDAR_METHOD_FETCH_OBJECT;
305
311
@@ -355,6 +361,7 @@ static void _php_intlcal_before_after(
355
361
CALENDAR_METHOD_FETCH_OBJECT;
356
362
357
363
when_co = Z_INTL_CALENDAR_P (when_object);
364
+ /* Can this ever happen ? */
358
365
if (when_co->ucal == NULL ) {
359
366
intl_errors_set (&co->err , U_ILLEGAL_ARGUMENT_ERROR,
360
367
" intlcal_before/after: Other IntlCalendar was unconstructed" , 0 );
@@ -395,11 +402,7 @@ U_CFUNC PHP_FUNCTION(intlcal_set)
395
402
}
396
403
397
404
for (int i = 0 ; i < arg_num; i++) {
398
- if (args[i] < INT32_MIN || args[i] > INT32_MAX) {
399
- intl_error_set (NULL , U_ILLEGAL_ARGUMENT_ERROR,
400
- " intlcal_set: at least one of the arguments has an absolute value that is too large" , 0 );
401
- RETURN_FALSE;
402
- }
405
+ ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE (args[i], i);
403
406
}
404
407
405
408
CALENDAR_METHOD_FETCH_OBJECT;
@@ -436,20 +439,13 @@ U_CFUNC PHP_FUNCTION(intlcal_roll)
436
439
437
440
CALENDAR_METHOD_FETCH_OBJECT;
438
441
439
- if (field < 0 || field >= UCAL_FIELD_COUNT) {
440
- intl_error_set (NULL , U_ILLEGAL_ARGUMENT_ERROR, " intlcal_roll: invalid field" , 0 );
441
- RETURN_FALSE;
442
- }
442
+ ZEND_VALUE_ERROR_INVALID_FIELD (field, 2 );
443
443
444
444
if (Z_TYPE_P (zvalue) == IS_FALSE || Z_TYPE_P (zvalue) == IS_TRUE) {
445
445
value = Z_TYPE_P (zvalue) == IS_TRUE ? 1 : -1 ;
446
446
} else {
447
447
value = zval_get_long (zvalue);
448
-
449
- if (value < INT32_MIN || value > INT32_MAX) {
450
- intl_error_set (NULL , U_ILLEGAL_ARGUMENT_ERROR, " intlcal_roll: value out of bounds" , 0 );
451
- RETURN_FALSE;
452
- }
448
+ ZEND_VALUE_ERROR_OUT_OF_BOUND_VALUE (value, 3 );
453
449
}
454
450
455
451
co->ucal ->roll ((UCalendarDateFields)field, (int32_t )value, CALENDAR_ERROR_CODE (co));
@@ -475,11 +471,7 @@ U_CFUNC PHP_FUNCTION(intlcal_clear)
475
471
if (field_is_null) {
476
472
co->ucal ->clear ();
477
473
} else {
478
- if (field < 0 || field >= UCAL_FIELD_COUNT) {
479
- intl_error_set (NULL , U_ILLEGAL_ARGUMENT_ERROR,
480
- " intlcal_clear: invalid field" , 0 );
481
- RETURN_FALSE;
482
- }
474
+ ZEND_VALUE_ERROR_INVALID_FIELD (field, 2 );
483
475
484
476
co->ucal ->clear ((UCalendarDateFields)field);
485
477
}
@@ -498,11 +490,7 @@ U_CFUNC PHP_FUNCTION(intlcal_field_difference)
498
490
RETURN_THROWS ();
499
491
}
500
492
501
- if (field < 0 || field >= UCAL_FIELD_COUNT) {
502
- intl_error_set (NULL , U_ILLEGAL_ARGUMENT_ERROR,
503
- " intlcal_field_difference: invalid field" , 0 );
504
- RETURN_FALSE;
505
- }
493
+ ZEND_VALUE_ERROR_INVALID_FIELD (field, 3 );
506
494
507
495
CALENDAR_METHOD_FETCH_OBJECT;
508
496
@@ -517,13 +505,13 @@ U_CFUNC PHP_FUNCTION(intlcal_field_difference)
517
505
U_CFUNC PHP_FUNCTION (intlcal_get_actual_maximum)
518
506
{
519
507
_php_intlcal_field_uec_ret_in32t_method (&Calendar::getActualMaximum,
520
- " intlcal_get_actual_maximum " , INTERNAL_FUNCTION_PARAM_PASSTHRU);
508
+ INTERNAL_FUNCTION_PARAM_PASSTHRU);
521
509
}
522
510
523
511
U_CFUNC PHP_FUNCTION (intlcal_get_actual_minimum)
524
512
{
525
513
_php_intlcal_field_uec_ret_in32t_method (&Calendar::getActualMinimum,
526
- " intlcal_get_actual_minimum " , INTERNAL_FUNCTION_PARAM_PASSTHRU);
514
+ INTERNAL_FUNCTION_PARAM_PASSTHRU);
527
515
}
528
516
529
517
U_CFUNC PHP_FUNCTION (intlcal_get_day_of_week_type)
@@ -536,11 +524,7 @@ U_CFUNC PHP_FUNCTION(intlcal_get_day_of_week_type)
536
524
RETURN_THROWS ();
537
525
}
538
526
539
- if (dow < UCAL_SUNDAY || dow > UCAL_SATURDAY) {
540
- intl_error_set (NULL , U_ILLEGAL_ARGUMENT_ERROR,
541
- " intlcal_get_day_of_week_type: invalid day of week" , 0 );
542
- RETURN_FALSE;
543
- }
527
+ ZEND_VALUE_ERROR_INVALID_DAY_OF_WEEK (dow, 2 );
544
528
545
529
CALENDAR_METHOD_FETCH_OBJECT;
546
530
@@ -572,24 +556,17 @@ U_CFUNC PHP_FUNCTION(intlcal_get_first_day_of_week)
572
556
573
557
static void _php_intlcal_field_ret_in32t_method (
574
558
int32_t (Calendar::*func)(UCalendarDateFields) const ,
575
- const char *method_name,
576
559
INTERNAL_FUNCTION_PARAMETERS)
577
560
{
578
561
zend_long field;
579
- char *message;
580
562
CALENDAR_METHOD_INIT_VARS;
581
563
582
564
if (zend_parse_method_parameters (ZEND_NUM_ARGS (), getThis (),
583
565
" Ol" , &object, Calendar_ce_ptr, &field) == FAILURE) {
584
566
RETURN_THROWS ();
585
567
}
586
568
587
- if (field < 0 || field >= UCAL_FIELD_COUNT) {
588
- spprintf (&message, 0 , " %s: invalid field" , method_name);
589
- intl_error_set (NULL , U_ILLEGAL_ARGUMENT_ERROR, message, 1 );
590
- efree (message);
591
- RETURN_FALSE;
592
- }
569
+ ZEND_VALUE_ERROR_INVALID_FIELD (field, 2 );
593
570
594
571
CALENDAR_METHOD_FETCH_OBJECT;
595
572
@@ -602,13 +579,13 @@ static void _php_intlcal_field_ret_in32t_method(
602
579
U_CFUNC PHP_FUNCTION (intlcal_get_greatest_minimum)
603
580
{
604
581
_php_intlcal_field_ret_in32t_method (&Calendar::getGreatestMinimum,
605
- " intlcal_get_greatest_minimum " , INTERNAL_FUNCTION_PARAM_PASSTHRU);
582
+ INTERNAL_FUNCTION_PARAM_PASSTHRU);
606
583
}
607
584
608
585
U_CFUNC PHP_FUNCTION (intlcal_get_least_maximum)
609
586
{
610
587
_php_intlcal_field_ret_in32t_method (&Calendar::getLeastMaximum,
611
- " intlcal_get_least_maximum " , INTERNAL_FUNCTION_PARAM_PASSTHRU);
588
+ INTERNAL_FUNCTION_PARAM_PASSTHRU);
612
589
}
613
590
614
591
U_CFUNC PHP_FUNCTION (intlcal_get_locale)
@@ -621,6 +598,7 @@ U_CFUNC PHP_FUNCTION(intlcal_get_locale)
621
598
RETURN_THROWS ();
622
599
}
623
600
601
+ // Promote to ValueError?
624
602
if (locale_type != ULOC_ACTUAL_LOCALE && locale_type != ULOC_VALID_LOCALE) {
625
603
intl_error_set (NULL , U_ILLEGAL_ARGUMENT_ERROR,
626
604
" intlcal_get_locale: invalid locale type" , 0 );
@@ -640,7 +618,7 @@ U_CFUNC PHP_FUNCTION(intlcal_get_locale)
640
618
U_CFUNC PHP_FUNCTION (intlcal_get_maximum)
641
619
{
642
620
_php_intlcal_field_ret_in32t_method (&Calendar::getMaximum,
643
- " intlcal_get_maximum " , INTERNAL_FUNCTION_PARAM_PASSTHRU);
621
+ INTERNAL_FUNCTION_PARAM_PASSTHRU);
644
622
}
645
623
646
624
U_CFUNC PHP_FUNCTION (intlcal_get_minimal_days_in_first_week)
@@ -664,7 +642,7 @@ U_CFUNC PHP_FUNCTION(intlcal_get_minimal_days_in_first_week)
664
642
U_CFUNC PHP_FUNCTION (intlcal_get_minimum)
665
643
{
666
644
_php_intlcal_field_ret_in32t_method (&Calendar::getMinimum,
667
- " intlcal_get_minimum " , INTERNAL_FUNCTION_PARAM_PASSTHRU);
645
+ INTERNAL_FUNCTION_PARAM_PASSTHRU);
668
646
}
669
647
670
648
U_CFUNC PHP_FUNCTION (intlcal_get_time_zone)
@@ -712,11 +690,7 @@ U_CFUNC PHP_FUNCTION(intlcal_get_weekend_transition)
712
690
RETURN_THROWS ();
713
691
}
714
692
715
- if (dow < UCAL_SUNDAY || dow > UCAL_SATURDAY) {
716
- intl_error_set (NULL , U_ILLEGAL_ARGUMENT_ERROR,
717
- " intlcal_get_weekend_transition: invalid day of week" , 0 );
718
- RETURN_FALSE;
719
- }
693
+ ZEND_VALUE_ERROR_INVALID_DAY_OF_WEEK (dow, 2 );
720
694
721
695
CALENDAR_METHOD_FETCH_OBJECT;
722
696
@@ -759,6 +733,7 @@ U_CFUNC PHP_FUNCTION(intlcal_is_equivalent_to)
759
733
}
760
734
761
735
other_co = Z_INTL_CALENDAR_P (other_object);
736
+ // Can this happen?
762
737
if (other_co->ucal == NULL ) {
763
738
intl_error_set (NULL , U_ILLEGAL_ARGUMENT_ERROR, " intlcal_is_equivalent_to:"
764
739
" Other IntlCalendar is unconstructed" , 0 );
@@ -794,11 +769,7 @@ U_CFUNC PHP_FUNCTION(intlcal_is_set)
794
769
RETURN_THROWS ();
795
770
}
796
771
797
- if (field < 0 || field >= UCAL_FIELD_COUNT) {
798
- intl_error_set (NULL , U_ILLEGAL_ARGUMENT_ERROR,
799
- " intlcal_is_set: invalid field" , 0 );
800
- RETURN_FALSE;
801
- }
772
+ ZEND_VALUE_ERROR_INVALID_FIELD (field, 2 );
802
773
803
774
CALENDAR_METHOD_FETCH_OBJECT;
804
775
@@ -839,11 +810,7 @@ U_CFUNC PHP_FUNCTION(intlcal_set_first_day_of_week)
839
810
RETURN_THROWS ();
840
811
}
841
812
842
- if (dow < UCAL_SUNDAY || dow > UCAL_SATURDAY) {
843
- intl_error_set (NULL , U_ILLEGAL_ARGUMENT_ERROR,
844
- " intlcal_set_first_day_of_week: invalid day of week" , 0 );
845
- RETURN_FALSE;
846
- }
813
+ ZEND_VALUE_ERROR_INVALID_DAY_OF_WEEK (dow, 2 );
847
814
848
815
CALENDAR_METHOD_FETCH_OBJECT;
849
816
@@ -880,10 +847,8 @@ U_CFUNC PHP_FUNCTION(intlcal_set_minimal_days_in_first_week)
880
847
}
881
848
882
849
if (num_days < 1 || num_days > 7 ) {
883
- intl_error_set (NULL , U_ILLEGAL_ARGUMENT_ERROR,
884
- " intlcal_set_minimal_days_in_first_week: invalid number of days; "
885
- " must be between 1 and 7" , 0 );
886
- RETURN_FALSE;
850
+ zend_argument_value_error (getThis () ? 1 :2 , " must be between 1 and 7" );
851
+ RETURN_THROWS ();
887
852
}
888
853
889
854
CALENDAR_METHOD_FETCH_OBJECT;
@@ -907,6 +872,7 @@ U_CFUNC PHP_FUNCTION(intlcal_equals)
907
872
908
873
CALENDAR_METHOD_FETCH_OBJECT;
909
874
other_co = Z_INTL_CALENDAR_P (other_object);
875
+ // Can this happen?
910
876
if (other_co->ucal == NULL ) {
911
877
intl_errors_set (&co->err , U_ILLEGAL_ARGUMENT_ERROR,
912
878
" intlcal_equals: The second IntlCalendar is unconstructed" , 0 );
@@ -1147,6 +1113,7 @@ U_CFUNC PHP_FUNCTION(intlcal_to_date_time)
1147
1113
zval_ptr_dtor (&ts_zval);
1148
1114
1149
1115
/* due to bug #40743, we have to set the time zone again */
1116
+ // TODO Check this still applies
1150
1117
zend_call_method_with_1_params (Z_OBJ_P (return_value), NULL , NULL , " settimezone" ,
1151
1118
&retval, timezone_zval);
1152
1119
if (Z_ISUNDEF (retval) || Z_TYPE (retval) == IS_FALSE) {
0 commit comments