mirror of
https://github.com/php/php-src.git
synced 2024-12-24 17:30:48 +08:00
fix #68406
This commit is contained in:
parent
7f94a26d2a
commit
766271a105
@ -666,6 +666,7 @@ static HashTable *date_object_get_gc_period(zval *object, zval **table, int *n);
|
|||||||
static HashTable *date_object_get_properties_period(zval *object);
|
static HashTable *date_object_get_properties_period(zval *object);
|
||||||
static HashTable *date_object_get_properties_timezone(zval *object);
|
static HashTable *date_object_get_properties_timezone(zval *object);
|
||||||
static HashTable *date_object_get_gc_timezone(zval *object, zval **table, int *n);
|
static HashTable *date_object_get_gc_timezone(zval *object, zval **table, int *n);
|
||||||
|
static HashTable *date_object_get_debug_info_timezone(zval *object, int *is_temp);
|
||||||
|
|
||||||
zval *date_interval_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv);
|
zval *date_interval_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv);
|
||||||
void date_interval_write_property(zval *object, zval *member, zval *value, void **cache_slot);
|
void date_interval_write_property(zval *object, zval *member, zval *value, void **cache_slot);
|
||||||
@ -2133,6 +2134,7 @@ static void date_register_classes(void) /* {{{ */
|
|||||||
date_object_handlers_timezone.clone_obj = date_object_clone_timezone;
|
date_object_handlers_timezone.clone_obj = date_object_clone_timezone;
|
||||||
date_object_handlers_timezone.get_properties = date_object_get_properties_timezone;
|
date_object_handlers_timezone.get_properties = date_object_get_properties_timezone;
|
||||||
date_object_handlers_timezone.get_gc = date_object_get_gc_timezone;
|
date_object_handlers_timezone.get_gc = date_object_get_gc_timezone;
|
||||||
|
date_object_handlers_timezone.get_debug_info = date_object_get_debug_info_timezone;
|
||||||
|
|
||||||
#define REGISTER_TIMEZONE_CLASS_CONST_STRING(const_name, value) \
|
#define REGISTER_TIMEZONE_CLASS_CONST_STRING(const_name, value) \
|
||||||
zend_declare_class_constant_long(date_ce_timezone, const_name, sizeof(const_name)-1, value);
|
zend_declare_class_constant_long(date_ce_timezone, const_name, sizeof(const_name)-1, value);
|
||||||
@ -2392,6 +2394,45 @@ static HashTable *date_object_get_properties_timezone(zval *object) /* {{{ */
|
|||||||
return props;
|
return props;
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
static HashTable *date_object_get_debug_info_timezone(zval *object, int *is_temp) /* {{{ */
|
||||||
|
{
|
||||||
|
HashTable *ht, *props;
|
||||||
|
zval zv;
|
||||||
|
php_timezone_obj *tzobj;
|
||||||
|
|
||||||
|
tzobj = Z_PHPTIMEZONE_P(object);
|
||||||
|
props = zend_std_get_properties(object);
|
||||||
|
|
||||||
|
*is_temp = 1;
|
||||||
|
ht = zend_array_dup(props);
|
||||||
|
|
||||||
|
ZVAL_LONG(&zv, tzobj->type);
|
||||||
|
zend_hash_str_update(ht, "timezone_type", sizeof("timezone_type")-1, &zv);
|
||||||
|
|
||||||
|
switch (tzobj->type) {
|
||||||
|
case TIMELIB_ZONETYPE_ID:
|
||||||
|
ZVAL_STRING(&zv, tzobj->tzi.tz->name);
|
||||||
|
break;
|
||||||
|
case TIMELIB_ZONETYPE_OFFSET: {
|
||||||
|
zend_string *tmpstr = zend_string_alloc(sizeof("UTC+05:00")-1, 0);
|
||||||
|
|
||||||
|
ZSTR_LEN(tmpstr) = snprintf(ZSTR_VAL(tmpstr), sizeof("+05:00"), "%c%02d:%02d",
|
||||||
|
tzobj->tzi.utc_offset > 0 ? '-' : '+',
|
||||||
|
abs(tzobj->tzi.utc_offset / 60),
|
||||||
|
abs((tzobj->tzi.utc_offset % 60)));
|
||||||
|
|
||||||
|
ZVAL_NEW_STR(&zv, tmpstr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TIMELIB_ZONETYPE_ABBR:
|
||||||
|
ZVAL_STRING(&zv, tzobj->tzi.z.abbr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
zend_hash_str_update(ht, "timezone", sizeof("timezone")-1, &zv);
|
||||||
|
|
||||||
|
return ht;
|
||||||
|
} /* }}} */
|
||||||
|
|
||||||
static zend_object *date_object_new_interval(zend_class_entry *class_type) /* {{{ */
|
static zend_object *date_object_new_interval(zend_class_entry *class_type) /* {{{ */
|
||||||
{
|
{
|
||||||
php_interval_obj *intern = zend_object_alloc(sizeof(php_interval_obj), class_type);
|
php_interval_obj *intern = zend_object_alloc(sizeof(php_interval_obj), class_type);
|
||||||
|
@ -39,34 +39,30 @@ object(DateTimeZone)#%d (2) {
|
|||||||
|
|
||||||
-- Add some properties --
|
-- Add some properties --
|
||||||
object(DateTimeZone)#%d (4) {
|
object(DateTimeZone)#%d (4) {
|
||||||
["timezone_type"]=>
|
|
||||||
int(3)
|
|
||||||
["timezone"]=>
|
|
||||||
string(13) "Europe/London"
|
|
||||||
["property1"]=>
|
["property1"]=>
|
||||||
int(99)
|
int(99)
|
||||||
["property2"]=>
|
["property2"]=>
|
||||||
string(5) "Hello"
|
string(5) "Hello"
|
||||||
|
["timezone_type"]=>
|
||||||
|
int(3)
|
||||||
|
["timezone"]=>
|
||||||
|
string(13) "Europe/London"
|
||||||
}
|
}
|
||||||
|
|
||||||
-- clone it --
|
-- clone it --
|
||||||
object(DateTimeZone)#%d (4) {
|
object(DateTimeZone)#%d (4) {
|
||||||
["timezone_type"]=>
|
|
||||||
int(3)
|
|
||||||
["timezone"]=>
|
|
||||||
string(13) "Europe/London"
|
|
||||||
["property1"]=>
|
["property1"]=>
|
||||||
int(99)
|
int(99)
|
||||||
["property2"]=>
|
["property2"]=>
|
||||||
string(5) "Hello"
|
string(5) "Hello"
|
||||||
|
["timezone_type"]=>
|
||||||
|
int(3)
|
||||||
|
["timezone"]=>
|
||||||
|
string(13) "Europe/London"
|
||||||
}
|
}
|
||||||
|
|
||||||
-- Add some more properties --
|
-- Add some more properties --
|
||||||
object(DateTimeZone)#%d (6) {
|
object(DateTimeZone)#%d (6) {
|
||||||
["timezone_type"]=>
|
|
||||||
int(3)
|
|
||||||
["timezone"]=>
|
|
||||||
string(13) "Europe/London"
|
|
||||||
["property1"]=>
|
["property1"]=>
|
||||||
int(99)
|
int(99)
|
||||||
["property2"]=>
|
["property2"]=>
|
||||||
@ -75,14 +71,14 @@ object(DateTimeZone)#%d (6) {
|
|||||||
bool(true)
|
bool(true)
|
||||||
["property4"]=>
|
["property4"]=>
|
||||||
float(10.5)
|
float(10.5)
|
||||||
|
["timezone_type"]=>
|
||||||
|
int(3)
|
||||||
|
["timezone"]=>
|
||||||
|
string(13) "Europe/London"
|
||||||
}
|
}
|
||||||
|
|
||||||
-- clone it --
|
-- clone it --
|
||||||
object(DateTimeZone)#%d (6) {
|
object(DateTimeZone)#%d (6) {
|
||||||
["timezone_type"]=>
|
|
||||||
int(3)
|
|
||||||
["timezone"]=>
|
|
||||||
string(13) "Europe/London"
|
|
||||||
["property1"]=>
|
["property1"]=>
|
||||||
int(99)
|
int(99)
|
||||||
["property2"]=>
|
["property2"]=>
|
||||||
@ -91,5 +87,9 @@ object(DateTimeZone)#%d (6) {
|
|||||||
bool(true)
|
bool(true)
|
||||||
["property4"]=>
|
["property4"]=>
|
||||||
float(10.5)
|
float(10.5)
|
||||||
|
["timezone_type"]=>
|
||||||
|
int(3)
|
||||||
|
["timezone"]=>
|
||||||
|
string(13) "Europe/London"
|
||||||
}
|
}
|
||||||
===DONE===
|
===DONE===
|
||||||
|
34
ext/date/tests/bug68406.phpt
Normal file
34
ext/date/tests/bug68406.phpt
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
--TEST--
|
||||||
|
Bug #68406 calling var_dump on a DateTimeZone object modifies it
|
||||||
|
--INI--
|
||||||
|
date.timezone=UTC
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$tz1 = new DateTimeZone('Europe/Berlin');
|
||||||
|
$tz2 = new DateTimeZone('Europe/Berlin');
|
||||||
|
|
||||||
|
$d = new DateTime('2014-12-24 13:00:00', $tz1);
|
||||||
|
var_dump($d->getTimezone(), $tz2);
|
||||||
|
|
||||||
|
if($tz2 == $d->getTimezone()) {
|
||||||
|
echo "yes";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
echo "no";
|
||||||
|
}
|
||||||
|
|
||||||
|
--EXPECT--
|
||||||
|
object(DateTimeZone)#4 (2) {
|
||||||
|
["timezone_type"]=>
|
||||||
|
int(3)
|
||||||
|
["timezone"]=>
|
||||||
|
string(13) "Europe/Berlin"
|
||||||
|
}
|
||||||
|
object(DateTimeZone)#2 (2) {
|
||||||
|
["timezone_type"]=>
|
||||||
|
int(3)
|
||||||
|
["timezone"]=>
|
||||||
|
string(13) "Europe/Berlin"
|
||||||
|
}
|
||||||
|
yes
|
Loading…
Reference in New Issue
Block a user