This commit is contained in:
CHU Zhaowei 2018-02-09 01:14:13 +08:00 committed by Joe
parent 7f94a26d2a
commit 766271a105
No known key found for this signature in database
GPG Key ID: F9BA0ADA31CBD89E
3 changed files with 91 additions and 16 deletions

View File

@ -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);

View File

@ -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===

View 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