]> granicus.if.org Git - php/commitdiff
Fixed (some of) add/sub.
authorDerick Rethans <github@derickrethans.nl>
Thu, 2 Jan 2014 12:45:48 +0000 (12:45 +0000)
committerDerick Rethans <github@derickrethans.nl>
Thu, 2 Jan 2014 12:45:48 +0000 (12:45 +0000)
This worked in PHP 5.4 already, but with the introduction of DateTimeImmutable
this code was not correctly merged.

ext/date/php_date.c

index cd3bf745dcbc4bfadcc2dc7f3cbfd6ada4a0dd52..d96428d5e5aaf4326bad90e201472a4af3c39c31 100644 (file)
@@ -3137,33 +3137,16 @@ static void php_date_add(zval *object, zval *interval, zval *return_value TSRMLS
 {
        php_date_obj     *dateobj;
        php_interval_obj *intobj;
-       int               bias = 1;
+       timelib_time     *new_time;
 
        dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC);
        DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
        intobj = (php_interval_obj *) zend_object_store_get_object(interval TSRMLS_CC);
        DATE_CHECK_INITIALIZED(intobj->initialized, DateInterval);
 
-       if (intobj->diff->have_weekday_relative || intobj->diff->have_special_relative) {
-               memcpy(&dateobj->time->relative, intobj->diff, sizeof(struct timelib_rel_time));
-       } else {
-               if (intobj->diff->invert) {
-                       bias = -1;
-               }
-               memset(&dateobj->time->relative, 0, sizeof(struct timelib_rel_time));
-               dateobj->time->relative.y = intobj->diff->y * bias;
-               dateobj->time->relative.m = intobj->diff->m * bias;
-               dateobj->time->relative.d = intobj->diff->d * bias;
-               dateobj->time->relative.h = intobj->diff->h * bias;
-               dateobj->time->relative.i = intobj->diff->i * bias;
-               dateobj->time->relative.s = intobj->diff->s * bias;
-       }
-       dateobj->time->have_relative = 1;
-       dateobj->time->sse_uptodate = 0;
-
-       timelib_update_ts(dateobj->time, NULL);
-       timelib_update_from_sse(dateobj->time);
-       dateobj->time->have_relative = 0;
+       new_time = timelib_add(dateobj->time, intobj->diff);
+       timelib_time_dtor(dateobj->time);
+       dateobj->time = new_time;
 }
 
 /* {{{ proto DateTime date_add(DateTime object, DateInterval interval)
@@ -3204,7 +3187,7 @@ static void php_date_sub(zval *object, zval *interval, zval *return_value TSRMLS
 {
        php_date_obj     *dateobj;
        php_interval_obj *intobj;
-       int               bias = 1;
+       timelib_time     *new_time;
 
        dateobj = (php_date_obj *) zend_object_store_get_object(object TSRMLS_CC);
        DATE_CHECK_INITIALIZED(dateobj->time, DateTime);
@@ -3216,24 +3199,9 @@ static void php_date_sub(zval *object, zval *interval, zval *return_value TSRMLS
                return;
        }
 
-       if (intobj->diff->invert) {
-               bias = -1;
-       }
-
-       memset(&dateobj->time->relative, 0, sizeof(struct timelib_rel_time));
-       dateobj->time->relative.y = 0 - (intobj->diff->y * bias);
-       dateobj->time->relative.m = 0 - (intobj->diff->m * bias);
-       dateobj->time->relative.d = 0 - (intobj->diff->d * bias);
-       dateobj->time->relative.h = 0 - (intobj->diff->h * bias);
-       dateobj->time->relative.i = 0 - (intobj->diff->i * bias);
-       dateobj->time->relative.s = 0 - (intobj->diff->s * bias);
-       dateobj->time->have_relative = 1;
-       dateobj->time->sse_uptodate = 0;
-
-       timelib_update_ts(dateobj->time, NULL);
-       timelib_update_from_sse(dateobj->time);
-
-       dateobj->time->have_relative = 0;
+       new_time = timelib_sub(dateobj->time, intobj->diff);
+       timelib_time_dtor(dateobj->time);
+       dateobj->time = new_time;
 }
 
 /* {{{ proto DateTime date_sub(DateTime object, DateInterval interval)