return t;
}
+timelib_time* timelib_time_clone(timelib_time *orig)
+{
+ timelib_time *tmp = timelib_time_ctor();
+ memcpy(tmp, orig, sizeof(timelib_time));
+ if (orig->tz_abbr) {
+ tmp->tz_abbr = strdup(orig->tz_abbr);
+ }
+ if (orig->tz_info) {
+ tmp->tz_info = orig->tz_info;
+ }
+ return tmp;
+}
+
timelib_rel_time* timelib_rel_time_clone(timelib_rel_time *rel)
{
timelib_rel_time *tmp = timelib_rel_time_ctor();
timelib_time* timelib_time_ctor(void);
void timelib_time_set_option(timelib_time* tm, int option, void* option_value);
void timelib_time_dtor(timelib_time* t);
+timelib_time* timelib_time_clone(timelib_time* orig);
timelib_time_offset* timelib_time_offset_ctor(void);
void timelib_time_offset_dtor(timelib_time_offset* t);
{
date_period_it *iterator = (date_period_it *)iter;
php_period_obj *object = iterator->object;
- timelib_time *it_time = object->start;
+ timelib_time *it_time = object->current;
/* apply modification if it's not the first iteration */
if (!object->include_start_date || iterator->current_index > 0) {
}
if (object->end) {
- return object->start->sse < object->end->sse ? SUCCESS : FAILURE;
+ return object->current->sse < object->end->sse ? SUCCESS : FAILURE;
} else {
return (iterator->current_index < object->recurrences) ? SUCCESS : FAILURE;
}
{
date_period_it *iterator = (date_period_it *)iter;
php_period_obj *object = iterator->object;
- timelib_time *it_time = object->start;
+ timelib_time *it_time = object->current;
php_date_obj *newdateobj;
/* Create new object */
date_period_it *iterator = (date_period_it *)iter;
iterator->current_index = 0;
+ if (iterator->object->current) {
+ timelib_time_dtor(iterator->object->current);
+ }
+ iterator->object->current = timelib_time_clone(iterator->object->start);
date_period_it_invalidate_current(iter TSRMLS_CC);
}
/* }}} */
timelib_time_dtor(intern->start);
}
+ if (intern->current) {
+ timelib_time_dtor(intern->current);
+ }
+
if (intern->end) {
timelib_time_dtor(intern->end);
}
}
dpobj = zend_object_store_get_object(getThis() TSRMLS_CC);
+ dpobj->current = NULL;
if (isostr_len) {
date_period_initialize(&(dpobj->start), &(dpobj->end), &(dpobj->interval), (int*) &recurrences, isostr, isostr_len TSRMLS_CC);
/* end date */
if (end) {
dateobj = (php_date_obj *) zend_object_store_get_object(end TSRMLS_CC);
- clone = timelib_time_ctor();
- memcpy(clone, dateobj->time, sizeof(timelib_time));
- if (dateobj->time->tz_abbr) {
- clone->tz_abbr = strdup(dateobj->time->tz_abbr);
- }
- if (dateobj->time->tz_info) {
- clone->tz_info = dateobj->time->tz_info;
- }
+ clone = timelib_time_clone(dateobj->time);
dpobj->end = clone;
}
}
--- /dev/null
+--TEST--
+Bug #52668 (Iterating over a dateperiod twice is broken)
+--INI--
+date.timezone=UTC
+--FILE--
+<?php
+$start = new DateTime('20101212');
+$interval = DateInterval::createFromDateString('next day');
+$dp = new DatePeriod($start, $interval, 1);
+foreach($dp as $dt) {
+ echo $dt->format('r') . "\n"; // Sun, 12 Dec 2010 00:00:00 +0100
+}
+echo $start->format('r'), "\n";
+foreach($dp as $dt) {
+ echo $dt->format('r') . "\n"; // Sun, 12 Dec 2010 00:00:00 +0100
+}
+echo $start->format('r'), "\n\n";
+?>
+--EXPECT--
+Sun, 12 Dec 2010 00:00:00 +0000
+Mon, 13 Dec 2010 00:00:00 +0000
+Sun, 12 Dec 2010 00:00:00 +0000
+Sun, 12 Dec 2010 00:00:00 +0000
+Mon, 13 Dec 2010 00:00:00 +0000
+Sun, 12 Dec 2010 00:00:00 +0000