summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStanislav Malyshev <stas@php.net>2015-03-22 20:57:46 -0700
committerStanislav Malyshev <stas@php.net>2015-03-22 21:03:46 -0700
commitaa22e80b1af500e5d6cdc0f7783537a768d0e373 (patch)
tree35fc7323b84db4c55485065806bbde8984688461
parent3e7f47cb039fd8803776eaf2899d576c503cdb63 (diff)
parentc2e22556ba070fc032572384e152d9eda631c34e (diff)
downloadphp-git-aa22e80b1af500e5d6cdc0f7783537a768d0e373.tar.gz
Merge branch 'PHP-5.5' into PHP-5.6
* PHP-5.5: Adding a new `createFromImmutable` method to the `DateTime` class to mirror the current `DateTime::createFromMutable()`
-rw-r--r--NEWS3
-rw-r--r--UPGRADING1
-rw-r--r--ext/date/php_date.c35
-rw-r--r--ext/date/php_date.h1
-rw-r--r--ext/date/tests/DateTime_createFromImmutable.phpt26
-rw-r--r--ext/date/tests/DateTime_verify.phpt37
6 files changed, 87 insertions, 16 deletions
diff --git a/NEWS b/NEWS
index 8bebcd3eee..92d014e102 100644
--- a/NEWS
+++ b/NEWS
@@ -19,6 +19,9 @@ PHP NEWS
- Curl:
. Implemented FR#69278 (HTTP2 support). (Masaki Kagaya)
+- Date:
+ . Added DateTime::createFromImmutable(). (Trevor Suarez)
+
- Enchant:
. Fixed bug #65406 (Enchant broker plugins are in the wrong place in windows
builds). (Anatol)
diff --git a/UPGRADING b/UPGRADING
index 52f139de28..45c96b8e56 100644
--- a/UPGRADING
+++ b/UPGRADING
@@ -271,6 +271,7 @@ PHP 5.6 UPGRADE NOTES
- Datetime:
Added DatePeriod::getStartDate(), DatePeriod::getEndDate(), DatePeriod::getDateInterval() in 5.6.5.
+ Added DateTime::createFromImmutable() in 5.6.8.
- GMP:
Added gmp_root($a, $nth) and gmp_rootrem($a, $nth) for calculating nth roots.
diff --git a/ext/date/php_date.c b/ext/date/php_date.c
index c4495f4ae9..851e9f7185 100644
--- a/ext/date/php_date.c
+++ b/ext/date/php_date.c
@@ -185,6 +185,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_date_format, 0, 0, 2)
ZEND_ARG_INFO(0, format)
ZEND_END_ARG_INFO()
+ZEND_BEGIN_ARG_INFO_EX(arginfo_date_method_create_from_immutable, 0, 0, 1)
+ ZEND_ARG_INFO(0, DateTimeImmutable)
+ZEND_END_ARG_INFO()
+
ZEND_BEGIN_ARG_INFO_EX(arginfo_date_method_format, 0, 0, 1)
ZEND_ARG_INFO(0, format)
ZEND_END_ARG_INFO()
@@ -468,6 +472,7 @@ const zend_function_entry date_funcs_date[] = {
PHP_ME(DateTime, __construct, arginfo_date_create, ZEND_ACC_CTOR|ZEND_ACC_PUBLIC)
PHP_ME(DateTime, __wakeup, NULL, ZEND_ACC_PUBLIC)
PHP_ME(DateTime, __set_state, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
+ PHP_ME(DateTime, createFromImmutable, arginfo_date_method_create_from_immutable, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
PHP_ME_MAPPING(createFromFormat, date_create_from_format, arginfo_date_create_from_format, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
PHP_ME_MAPPING(getLastErrors, date_get_last_errors, arginfo_date_get_last_errors, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
PHP_ME_MAPPING(format, date_format, arginfo_date_method_format, 0)
@@ -2781,7 +2786,7 @@ PHP_METHOD(DateTimeImmutable, createFromMutable)
php_date_obj *new_obj = NULL;
php_date_obj *old_obj = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O!", &datetime_object, date_ce_date) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &datetime_object, date_ce_date) == FAILURE) {
return;
}
@@ -2912,6 +2917,34 @@ PHP_METHOD(DateTime, __wakeup)
}
/* }}} */
+/* {{{ proto DateTime::createFromImmutable(DateTimeImmutable object)
+ Creates new DateTime object from an existing DateTimeImmutable object.
+*/
+PHP_METHOD(DateTime, createFromImmutable)
+{
+ zval *datetimeimmutable_object = NULL;
+ php_date_obj *new_obj = NULL;
+ php_date_obj *old_obj = NULL;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &datetimeimmutable_object, date_ce_immutable) == FAILURE) {
+ return;
+ }
+
+ php_date_instantiate(date_ce_date, return_value TSRMLS_CC);
+ old_obj = (php_date_obj *) zend_object_store_get_object(datetimeimmutable_object TSRMLS_CC);
+ new_obj = (php_date_obj *) zend_object_store_get_object(return_value TSRMLS_CC);
+
+ new_obj->time = timelib_time_ctor();
+ *new_obj->time = *old_obj->time;
+ if (old_obj->time->tz_abbr) {
+ new_obj->time->tz_abbr = strdup(old_obj->time->tz_abbr);
+ }
+ if (old_obj->time->tz_info) {
+ new_obj->time->tz_info = old_obj->time->tz_info;
+ }
+}
+/* }}} */
+
/* Helper function used to add an associative array of warnings and errors to a zval */
static void zval_from_error_container(zval *z, timelib_error_container *error)
{
diff --git a/ext/date/php_date.h b/ext/date/php_date.h
index a3deeb2a41..7f46693466 100644
--- a/ext/date/php_date.h
+++ b/ext/date/php_date.h
@@ -50,6 +50,7 @@ PHP_FUNCTION(getdate);
PHP_METHOD(DateTime, __construct);
PHP_METHOD(DateTime, __wakeup);
PHP_METHOD(DateTime, __set_state);
+PHP_METHOD(DateTime, createFromImmutable);
PHP_FUNCTION(date_create);
PHP_FUNCTION(date_create_immutable);
PHP_FUNCTION(date_create_from_format);
diff --git a/ext/date/tests/DateTime_createFromImmutable.phpt b/ext/date/tests/DateTime_createFromImmutable.phpt
new file mode 100644
index 0000000000..bfde94d825
--- /dev/null
+++ b/ext/date/tests/DateTime_createFromImmutable.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Tests for DateTime::createFromImmutable.
+--INI--
+date.timezone=America/New_York
+--FILE--
+<?php
+$current = "2015-03-05 07:00:16";
+
+$i = DateTime::createFromImmutable(date_create_immutable($current));
+var_dump($i);
+
+$i = DateTime::createFromImmutable(date_create($current));
+var_dump($i);
+?>
+--EXPECTF--
+object(DateTime)#%d (3) {
+ ["date"]=>
+ string(26) "2015-03-05 07:00:16.000000"
+ ["timezone_type"]=>
+ int(3)
+ ["timezone"]=>
+ string(16) "America/New_York"
+}
+
+Warning: DateTime::createFromImmutable() expects parameter 1 to be DateTimeImmutable, object given in %stests%eDateTime_createFromImmutable.php on line %d
+NULL
diff --git a/ext/date/tests/DateTime_verify.phpt b/ext/date/tests/DateTime_verify.phpt
index c790974729..aa13494d25 100644
--- a/ext/date/tests/DateTime_verify.phpt
+++ b/ext/date/tests/DateTime_verify.phpt
@@ -27,7 +27,7 @@ object(ReflectionClass)#%d (1) {
string(8) "DateTime"
}
..and get names of all its methods
-array(18) {
+array(19) {
[0]=>
&object(ReflectionMethod)#%d (2) {
["name"]=>
@@ -52,104 +52,111 @@ array(18) {
[3]=>
&object(ReflectionMethod)#%d (2) {
["name"]=>
- string(16) "createFromFormat"
+ string(19) "createFromImmutable"
["class"]=>
string(8) "DateTime"
}
[4]=>
&object(ReflectionMethod)#%d (2) {
["name"]=>
- string(13) "getLastErrors"
+ string(16) "createFromFormat"
["class"]=>
string(8) "DateTime"
}
[5]=>
&object(ReflectionMethod)#%d (2) {
["name"]=>
- string(6) "format"
+ string(13) "getLastErrors"
["class"]=>
string(8) "DateTime"
}
[6]=>
&object(ReflectionMethod)#%d (2) {
["name"]=>
- string(6) "modify"
+ string(6) "format"
["class"]=>
string(8) "DateTime"
}
[7]=>
&object(ReflectionMethod)#%d (2) {
["name"]=>
- string(3) "add"
+ string(6) "modify"
["class"]=>
string(8) "DateTime"
}
[8]=>
&object(ReflectionMethod)#%d (2) {
["name"]=>
- string(3) "sub"
+ string(3) "add"
["class"]=>
string(8) "DateTime"
}
[9]=>
&object(ReflectionMethod)#%d (2) {
["name"]=>
- string(11) "getTimezone"
+ string(3) "sub"
["class"]=>
string(8) "DateTime"
}
[10]=>
&object(ReflectionMethod)#%d (2) {
["name"]=>
- string(11) "setTimezone"
+ string(11) "getTimezone"
["class"]=>
string(8) "DateTime"
}
[11]=>
&object(ReflectionMethod)#%d (2) {
["name"]=>
- string(9) "getOffset"
+ string(11) "setTimezone"
["class"]=>
string(8) "DateTime"
}
[12]=>
&object(ReflectionMethod)#%d (2) {
["name"]=>
- string(7) "setTime"
+ string(9) "getOffset"
["class"]=>
string(8) "DateTime"
}
[13]=>
&object(ReflectionMethod)#%d (2) {
["name"]=>
- string(7) "setDate"
+ string(7) "setTime"
["class"]=>
string(8) "DateTime"
}
[14]=>
&object(ReflectionMethod)#%d (2) {
["name"]=>
- string(10) "setISODate"
+ string(7) "setDate"
["class"]=>
string(8) "DateTime"
}
[15]=>
&object(ReflectionMethod)#%d (2) {
["name"]=>
- string(12) "setTimestamp"
+ string(10) "setISODate"
["class"]=>
string(8) "DateTime"
}
[16]=>
&object(ReflectionMethod)#%d (2) {
["name"]=>
- string(12) "getTimestamp"
+ string(12) "setTimestamp"
["class"]=>
string(8) "DateTime"
}
[17]=>
&object(ReflectionMethod)#%d (2) {
["name"]=>
+ string(12) "getTimestamp"
+ ["class"]=>
+ string(8) "DateTime"
+ }
+ [18]=>
+ &object(ReflectionMethod)#%d (2) {
+ ["name"]=>
string(4) "diff"
["class"]=>
string(8) "DateTime"