]> granicus.if.org Git - php/commitdiff
Fixed bug #71516 IntlDateFormatter losts locale if pattern is set via constructor
authorAnatol Belski <ab@php.net>
Fri, 8 Apr 2016 06:59:06 +0000 (08:59 +0200)
committerAnatol Belski <ab@php.net>
Fri, 8 Apr 2016 06:59:43 +0000 (08:59 +0200)
ext/intl/dateformat/dateformat_create.cpp
ext/intl/tests/dateformat_bug71516.phpt [new file with mode: 0644]

index 1999b6a8c135c69cddf43916a9973278460eacb4..e90ad74466afd9400c6a6d8b1000d2ca2b623a6c 100644 (file)
@@ -36,6 +36,7 @@ extern "C" {
 #include "dateformat_helpers.h"
 #include "zend_exceptions.h"
 
+
 /* {{{ */
 static int datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
 {
@@ -117,14 +118,16 @@ static int datefmt_ctor(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_constructor)
                }
        }
 
+       DATE_FORMAT_OBJECT(dfo) = udat_open((UDateFormatStyle)time_type,
+                       (UDateFormatStyle)date_type, locale_str, NULL, 0, svalue,
+                       slength, &INTL_DATA_ERROR_CODE(dfo));
+
        if (pattern_str && pattern_str_len > 0) {
-               DATE_FORMAT_OBJECT(dfo) = udat_open(UDAT_IGNORE, UDAT_IGNORE,
-                               locale_str, NULL, 0, svalue, slength,
-                               &INTL_DATA_ERROR_CODE(dfo));
-       } else {
-               DATE_FORMAT_OBJECT(dfo) = udat_open((UDateFormatStyle)time_type,
-                               (UDateFormatStyle)date_type, locale_str, NULL, 0, svalue,
-                               slength, &INTL_DATA_ERROR_CODE(dfo));
+               udat_applyPattern(DATE_FORMAT_OBJECT(dfo), true, svalue, slength);
+               if (U_FAILURE(INTL_DATA_ERROR_CODE(dfo))) {
+                       intl_error_set(NULL, INTL_DATA_ERROR_CODE(dfo), "datefmt_create: error applying pattern", 0);
+                       goto error;
+               }
        }
 
     if (!U_FAILURE(INTL_DATA_ERROR_CODE(dfo))) {
diff --git a/ext/intl/tests/dateformat_bug71516.phpt b/ext/intl/tests/dateformat_bug71516.phpt
new file mode 100644 (file)
index 0000000..88ba9bf
--- /dev/null
@@ -0,0 +1,25 @@
+--TEST--
+Bug #71516 IntlDateFormatter losts locale if pattern is set via constructor
+--SKIPIF--
+<?php
+if (!extension_loaded('intl')) die('skip intl extension not enabled'); ?>
+--FILE--
+<?php
+
+$loc = "ru_RU";
+$goodFormatter = new IntlDateFormatter($loc, IntlDateFormatter::FULL, IntlDateFormatter::FULL, new DateTimeZone("UTC"));
+$badFormatter  = new IntlDateFormatter($loc, IntlDateFormatter::FULL, IntlDateFormatter::FULL, new DateTimeZone("UTC"), null, "d MMM");
+$badFormatter2 = new IntlDateFormatter($loc, IntlDateFormatter::FULL, IntlDateFormatter::FULL, new DateTimeZone("UTC"));
+$badFormatter2->setPattern("d MMM");
+
+echo "Formatter without pattern: " . $goodFormatter->getLocale() . PHP_EOL;
+echo "Formatter with pattern: " . $badFormatter->getLocale() . PHP_EOL;
+echo "Formatter with pattern set later: " . $badFormatter2->getLocale() . PHP_EOL;
+
+?>
+==DONE==
+--EXPECT--
+Formatter without pattern: ru
+Formatter with pattern: ru
+Formatter with pattern set later: ru
+==DONE==